package config import ( "fmt" "os" "strconv" ) type Config struct { Server ServerConfig GRPC GRPCConfig S3 S3Config Auth AuthConfig } type ServerConfig struct { Port string Host string } type GRPCConfig struct { AuthServiceAddr string UserServiceAddr string CompetitionServiceAddr string TaskServiceAddr string SubmissionServiceAddr string ResultsServiceAddr string ReviewServiceAddr string AchievementsServiceAddr string } type S3Config struct { AccessKeyID string SecretAccessKey string Region string Bucket string Endpoint string } type AuthConfig struct { JWTSecret string } func Load() (*Config, error) { cfg := &Config{ Server: ServerConfig{ Port: getEnv("SERVER_PORT", "8080"), Host: getEnv("SERVER_HOST", "0.0.0.0"), }, GRPC: GRPCConfig{ AuthServiceAddr: getEnvRequired("AUTH_SERVICE_ADDR"), UserServiceAddr: getEnvRequired("USER_SERVICE_ADDR"), CompetitionServiceAddr: getEnvRequired("COMPETITION_SERVICE_ADDR"), TaskServiceAddr: getEnvRequired("TASK_SERVICE_ADDR"), SubmissionServiceAddr: getEnvRequired("SUBMISSION_SERVICE_ADDR"), ResultsServiceAddr: getEnvRequired("RESULTS_SERVICE_ADDR"), ReviewServiceAddr: getEnvRequired("REVIEW_SERVICE_ADDR"), AchievementsServiceAddr: getEnvRequired("ACHIEVEMENTS_SERVICE_ADDR"), }, S3: S3Config{ AccessKeyID: getEnvRequired("AWS_ACCESS_KEY_ID"), SecretAccessKey: getEnvRequired("AWS_SECRET_ACCESS_KEY"), Region: getEnvRequired("AWS_REGION"), Bucket: getEnvRequired("S3_BUCKET"), Endpoint: getEnv("S3_ENDPOINT", ""), }, Auth: AuthConfig{ JWTSecret: getEnv("JWT_SECRET", ""), }, } return cfg, nil } func getEnv(key, defaultValue string) string { value := os.Getenv(key) if value == "" { return defaultValue } return value } func getEnvRequired(key string) string { value := os.Getenv(key) if value == "" { panic(fmt.Sprintf("required environment variable %s is not set", key)) } return value } func getEnvAsInt(key string, defaultValue int) int { valueStr := os.Getenv(key) if valueStr == "" { return defaultValue } value, err := strconv.Atoi(valueStr) if err != nil { return defaultValue } return value }