| 1 | using AgentForge.Options; |
| 2 | |
| 3 | namespace AgentForge.Configuration; |
| 4 | |
| 5 | public static class ForgeEnvironment |
| 6 | { |
| 7 | public static void ApplyEnvironmentOverrides(ForgeOptions options) |
| 8 | { |
| 9 | options.PublicBaseUrl = Get("FORGE_PUBLIC_BASE_URL") ?? options.PublicBaseUrl; |
| 10 | options.DatabasePath = Get("FORGE_DATABASE_PATH") ?? options.DatabasePath; |
| 11 | options.ReposPath = Get("FORGE_REPOS_PATH") ?? options.ReposPath; |
| 12 | options.GitBaseUrl = Get("FORGE_GIT_BASE_URL") ?? options.GitBaseUrl; |
| 13 | options.GitSshPort = ParseInt(Get("FORGE_GIT_SSH_PORT")) ?? options.GitSshPort; |
| 14 | options.CiCallbackToken = Get("FORGE_CI_CALLBACK_TOKEN") ?? options.CiCallbackToken; |
| 15 | options.CiWebhookUrl = Get("FORGE_CI_WEBHOOK_URL") ?? options.CiWebhookUrl; |
| 16 | options.CiWebhookSecret = Get("FORGE_CI_WEBHOOK_SECRET") ?? options.CiWebhookSecret; |
| 17 | options.GitHookSecret = Get("FORGE_GIT_HOOK_SECRET") ?? options.GitHookSecret; |
| 18 | options.BootstrapToken = Get("FORGE_BOOTSTRAP_TOKEN") ?? options.BootstrapToken; |
| 19 | options.RequireAuth = ParseBool(Get("FORGE_REQUIRE_AUTH")) ?? options.RequireAuth; |
| 20 | options.RequireGitHookSecret = ParseBool(Get("FORGE_REQUIRE_GIT_HOOK_SECRET")) ?? options.RequireGitHookSecret; |
| 21 | options.GitSshSymlinkRoot = Get("FORGE_GIT_SSH_SYMLINK_ROOT") ?? options.GitSshSymlinkRoot; |
| 22 | var bundleOverride = Get("FORGE_PLUGIN_BUNDLE"); |
| 23 | if (bundleOverride is not null) |
| 24 | options.PluginBundle = bundleOverride; |
| 25 | |
| 26 | options.PluginsPath = Get("FORGE_PLUGINS_PATH") ?? options.PluginsPath; |
| 27 | options.WatchPlugins = ParseBool(Get("FORGE_WATCH_PLUGINS")) ?? options.WatchPlugins; |
| 28 | |
| 29 | options.OAuth.GitHub.ClientId = Get("FORGE_GITHUB_CLIENT_ID") ?? options.OAuth.GitHub.ClientId; |
| 30 | options.OAuth.GitHub.ClientSecret = Get("FORGE_GITHUB_CLIENT_SECRET") ?? options.OAuth.GitHub.ClientSecret; |
| 31 | options.OAuth.Oidc.Authority = Get("FORGE_OIDC_AUTHORITY") ?? options.OAuth.Oidc.Authority; |
| 32 | options.OAuth.Oidc.ClientId = Get("FORGE_OIDC_CLIENT_ID") ?? options.OAuth.Oidc.ClientId; |
| 33 | options.OAuth.Oidc.ClientSecret = Get("FORGE_OIDC_CLIENT_SECRET") ?? options.OAuth.Oidc.ClientSecret; |
| 34 | options.OAuth.Oidc.DisplayName = Get("FORGE_OIDC_DISPLAY_NAME") ?? options.OAuth.Oidc.DisplayName; |
| 35 | options.OAuth.Oidc.ProviderId = Get("FORGE_OIDC_PROVIDER_ID") ?? options.OAuth.Oidc.ProviderId; |
| 36 | options.OAuth.Oidc.Scope = Get("FORGE_OIDC_SCOPE") ?? options.OAuth.Oidc.Scope; |
| 37 | options.DefaultOrgSlug = Get("FORGE_DEFAULT_ORG_SLUG") ?? options.DefaultOrgSlug; |
| 38 | options.OAuthSignInPolicy = Get("FORGE_OAUTH_SIGNIN_POLICY") ?? options.OAuthSignInPolicy; |
| 39 | options.OAuthGitHubOrg = Get("FORGE_OAUTH_GITHUB_ORG") ?? options.OAuthGitHubOrg; |
| 40 | options.OrgAutoMemberOnLogin = ParseBool(Get("FORGE_ORG_AUTO_MEMBER_ON_LOGIN")) ?? options.OrgAutoMemberOnLogin; |
| 41 | options.GitHubImportToken = Get("FORGE_GITHUB_IMPORT_TOKEN") ?? options.GitHubImportToken; |
| 42 | options.ImportCatalogPath = Get("FORGE_IMPORT_CATALOG_PATH") ?? options.ImportCatalogPath; |
| 43 | options.ImportVisibilityPolicy = Get("FORGE_IMPORT_VISIBILITY_POLICY") ?? options.ImportVisibilityPolicy; |
| 44 | } |
| 45 | |
| 46 | private static int? ParseInt(string? value) => |
| 47 | int.TryParse(value, out var parsed) ? parsed : null; |
| 48 | |
| 49 | private static bool? ParseBool(string? value) => |
| 50 | bool.TryParse(value, out var parsed) ? parsed : null; |
| 51 | |
| 52 | public static void Configure(IConfigurationBuilder builder) => |
| 53 | builder.AddEnvironmentVariables(prefix: "FORGE_"); |
| 54 | |
| 55 | private static string? Get(string name) => |
| 56 | Environment.GetEnvironmentVariable(name) is { Length: > 0 } value ? value : null; |
| 57 | } |
| 58 | |