package config import ( 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 service configuration. type Config struct { AppName string Port int Env string LogLevel string AdminListDefaultLimit int AdminListMaxLimit int Postgres sharedpostgres.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 - User Service" serviceName := "user-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("USER_SERVICE_PORT", 8082), Env: env, LogLevel: logCfg.Level, AdminListDefaultLimit: envutil.Int("USER_ADMIN_LIST_DEFAULT_LIMIT", 50), AdminListMaxLimit: envutil.Int("USER_ADMIN_LIST_MAX_LIMIT", 200), 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", ""), } }