package config import ( "time" sharedpostgres "knowfoolery/backend/shared/infra/database/postgres" sharedredis "knowfoolery/backend/shared/infra/database/redis" "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 service configuration. type Config struct { AppName string Port int Env string LogLevel string CacheTTL time.Duration MaxExclude int BulkMax int Postgres sharedpostgres.Config Redis sharedredis.Config Tracing tracing.Config Metrics metrics.Config Logging logging.Config ZitadelBaseURL string ZitadelIssuer string ZitadelAudience string ZitadelClientID string ZitadelSecret string } // FromEnv builds service config from environment variables. func FromEnv() Config { env := envutil.String("ENVIRONMENT", "development") appName := "Know Foolery - Question Bank Service" serviceName := "question-bank-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: appName, Port: envutil.Int("QUESTION_BANK_PORT", 8081), Env: env, LogLevel: logCfg.Level, CacheTTL: envutil.Duration("QUESTION_CACHE_TTL", 5*time.Minute), MaxExclude: envutil.Int("QUESTION_RANDOM_MAX_EXCLUSIONS", 200), BulkMax: envutil.Int("QUESTION_BULK_MAX_ITEMS", 5000), Postgres: sharedpostgres.ConfigFromEnv(), Redis: sharedredis.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", ""), } }