diff --git a/backend/internal/common/env_config.go b/backend/internal/common/env_config.go index dc8994b..b8a2025 100644 --- a/backend/internal/common/env_config.go +++ b/backend/internal/common/env_config.go @@ -25,6 +25,7 @@ type EnvConfigSchema struct { Host string `env:"HOST"` MaxMindLicenseKey string `env:"MAXMIND_LICENSE_KEY"` GeoLiteDBPath string `env:"GEOLITE_DB_PATH"` + UiConfigDisabled bool `env:"PUBLIC_UI_CONFIG_DISABLED"` } var EnvConfig = &EnvConfigSchema{ @@ -38,6 +39,7 @@ var EnvConfig = &EnvConfigSchema{ Host: "0.0.0.0", MaxMindLicenseKey: "", GeoLiteDBPath: "data/GeoLite2-City.mmdb", + UiConfigDisabled: false, } func init() { diff --git a/backend/internal/common/errors.go b/backend/internal/common/errors.go index 9afe0c3..bcf6641 100644 --- a/backend/internal/common/errors.go +++ b/backend/internal/common/errors.go @@ -184,3 +184,10 @@ func (e *OidcAccessDeniedError) Error() string { } func (e *OidcAccessDeniedError) HttpStatusCode() int { return http.StatusForbidden } + +type UiConfigDisabledError struct{} + +func (e *UiConfigDisabledError) Error() string { + return "The configuration can't be changed since the UI configuration is disabled" +} +func (e *UiConfigDisabledError) HttpStatusCode() int { return http.StatusForbidden } diff --git a/backend/internal/service/app_config_service.go b/backend/internal/service/app_config_service.go index dfd748d..c5e3471 100644 --- a/backend/internal/service/app_config_service.go +++ b/backend/internal/service/app_config_service.go @@ -188,12 +188,15 @@ var defaultDbConfig = model.AppConfig{ } func (s *AppConfigService) UpdateAppConfig(input dto.AppConfigUpdateDto) ([]model.AppConfigVariable, error) { - var savedConfigVariables []model.AppConfigVariable + if common.EnvConfig.UiConfigDisabled { + return nil, &common.UiConfigDisabledError{} + } tx := s.db.Begin() rt := reflect.ValueOf(input).Type() rv := reflect.ValueOf(input) + var savedConfigVariables []model.AppConfigVariable for i := 0; i < rt.NumField(); i++ { field := rt.Field(i) key := field.Tag.Get("json") @@ -254,9 +257,13 @@ func (s *AppConfigService) ListAppConfig(showAll bool) ([]model.AppConfigVariabl return nil, err } - // Set the value to the default value if it is empty for i := range configuration { - if configuration[i].Value == "" && configuration[i].DefaultValue != "" { + if common.EnvConfig.UiConfigDisabled { + // Set the value to the environment variable if the UI config is disabled + configuration[i].Value = s.getConfigVariableFromEnvironmentVariable(configuration[i].Key, configuration[i].DefaultValue) + + } else if configuration[i].Value == "" && configuration[i].DefaultValue != "" { + // Set the value to the default value if it is empty configuration[i].Value = configuration[i].DefaultValue } } @@ -355,12 +362,25 @@ func (s *AppConfigService) LoadDbConfigFromDb() error { return err } - if storedConfigVar.Value == "" && storedConfigVar.DefaultValue != "" { + if common.EnvConfig.UiConfigDisabled { + storedConfigVar.Value = s.getConfigVariableFromEnvironmentVariable(currentConfigVar.Key, storedConfigVar.DefaultValue) + } else if storedConfigVar.Value == "" && storedConfigVar.DefaultValue != "" { storedConfigVar.Value = storedConfigVar.DefaultValue } dbConfigField.Set(reflect.ValueOf(storedConfigVar)) + } return nil } + +func (s *AppConfigService) getConfigVariableFromEnvironmentVariable(key, fallbackValue string) string { + environmentVariableName := utils.CamelCaseToScreamingSnakeCase(key) + + if value, exists := os.LookupEnv(environmentVariableName); exists { + return value + } + + return fallbackValue +} diff --git a/backend/internal/utils/string_util.go b/backend/internal/utils/string_util.go index acf1a73..24c78c9 100644 --- a/backend/internal/utils/string_util.go +++ b/backend/internal/utils/string_util.go @@ -5,6 +5,8 @@ import ( "fmt" "math/big" "net/url" + "regexp" + "strings" "unicode" ) @@ -62,3 +64,12 @@ func CamelCaseToSnakeCase(s string) string { } return string(result) } + +func CamelCaseToScreamingSnakeCase(s string) string { + // Insert underscores before uppercase letters (except the first one) + re := regexp.MustCompile(`([a-z0-9])([A-Z])`) + snake := re.ReplaceAllString(s, `${1}_${2}`) + + // Convert to uppercase + return strings.ToUpper(snake) +} diff --git a/frontend/src/routes/settings/admin/application-configuration/+page.svelte b/frontend/src/routes/settings/admin/application-configuration/+page.svelte index 28f6fac..22e5656 100644 --- a/frontend/src/routes/settings/admin/application-configuration/+page.svelte +++ b/frontend/src/routes/settings/admin/application-configuration/+page.svelte @@ -1,4 +1,5 @@