package config import ( "fmt" "os" "github.com/joho/godotenv" ) // Config holds all configuration for the school service type Config struct { // Server Port string Environment string // Database DatabaseURL string // JWT JWTSecret string // CORS AllowedOrigins []string // Rate Limiting RateLimitRequests int RateLimitWindow int // in seconds // LLM Gateway (for AI features) LLMGatewayURL string } // Load loads configuration from environment variables func Load() (*Config, error) { // Load .env file if exists (for development) _ = godotenv.Load() cfg := &Config{ Port: getEnv("PORT", "8084"), Environment: getEnv("ENVIRONMENT", "development"), DatabaseURL: getEnv("DATABASE_URL", ""), JWTSecret: getEnv("JWT_SECRET", ""), RateLimitRequests: getEnvInt("RATE_LIMIT_REQUESTS", 100), RateLimitWindow: getEnvInt("RATE_LIMIT_WINDOW", 60), LLMGatewayURL: getEnv("LLM_GATEWAY_URL", "http://backend:8000/llm"), } // Parse allowed origins originsStr := getEnv("ALLOWED_ORIGINS", "http://localhost:3000,http://localhost:8000") cfg.AllowedOrigins = parseCommaSeparated(originsStr) // Validate required fields if cfg.DatabaseURL == "" { return nil, fmt.Errorf("DATABASE_URL is required") } if cfg.JWTSecret == "" { return nil, fmt.Errorf("JWT_SECRET is required") } return cfg, nil } func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } func getEnvInt(key string, defaultValue int) int { if value := os.Getenv(key); value != "" { var result int fmt.Sscanf(value, "%d", &result) return result } return defaultValue } func parseCommaSeparated(s string) []string { if s == "" { return []string{} } var result []string start := 0 for i := 0; i <= len(s); i++ { if i == len(s) || s[i] == ',' { item := s[start:i] // Trim whitespace for len(item) > 0 && item[0] == ' ' { item = item[1:] } for len(item) > 0 && item[len(item)-1] == ' ' { item = item[:len(item)-1] } if item != "" { result = append(result, item) } start = i + 1 } } return result }