package config import ( "time" sharedpostgres "knowfoolery/backend/shared/infra/database/postgres" "knowfoolery/backend/shared/infra/observability/logging" "knowfoolery/backend/shared/infra/observability/metrics" "knowfoolery/backend/shared/infra/observability/tracing" "knowfoolery/backend/shared/infra/utils/envutil" ) // Config holds runtime configuration for admin-service. type Config struct { AppName string Port int Postgres sharedpostgres.Config Tracing tracing.Config Metrics metrics.Config Logging logging.Config ZitadelBaseURL string ZitadelIssuer string ZitadelAudience string ZitadelClientID string ZitadelSecret string AuditRetentionDays int HTTPTimeout time.Duration } // FromEnv builds config from env vars. func FromEnv() Config { env := envutil.String("ENVIRONMENT", "development") serviceName := "admin-service" logCfg := logging.DefaultConfig() logCfg.ServiceName = serviceName logCfg.Environment = env logCfg.Level = envutil.String("LOG_LEVEL", logCfg.Level) traceCfg := tracing.ConfigFromEnv() if traceCfg.ServiceName == "knowfoolery" { traceCfg.ServiceName = serviceName } traceCfg.Environment = env metricsCfg := metrics.ConfigFromEnv() if metricsCfg.ServiceName == "knowfoolery" { metricsCfg.ServiceName = serviceName } return Config{ AppName: "Know Foolery - Admin Service", Port: envutil.Int("ADMIN_SERVICE_PORT", 8085), Postgres: sharedpostgres.ConfigFromEnv(), Tracing: traceCfg, Metrics: metricsCfg, Logging: logCfg, ZitadelBaseURL: envutil.String("ZITADEL_URL", ""), ZitadelIssuer: envutil.String("ZITADEL_ISSUER", ""), ZitadelAudience: envutil.String("ZITADEL_AUDIENCE", ""), ZitadelClientID: envutil.String("ZITADEL_CLIENT_ID", ""), ZitadelSecret: envutil.String("ZITADEL_CLIENT_SECRET", ""), AuditRetentionDays: envutil.Int("ADMIN_AUDIT_RETENTION_DAYS", 90), HTTPTimeout: envutil.Duration("UPSTREAM_HTTP_TIMEOUT", 3*time.Second), } }