package config import ( "bufio" "os" "strings" ) type Config struct { Port string Env string DBHost string DBPort string DBName string DBUser string DBPass string AdminAPIKey string AdminPassword string SessionSecret string RSAPrivateKey string RateLimitActivate string RateLimitValidate string LogLevel string } func Load() *Config { loadEnvFile(".env") return &Config{ Port: getEnv("APP_PORT", "8090"), Env: getEnv("APP_ENV", "development"), DBHost: getEnv("DB_HOST", "localhost"), DBPort: getEnv("DB_PORT", "3306"), DBName: getEnv("DB_NAME", "dal_license_db"), DBUser: getEnv("DB_USER", "license"), DBPass: getEnv("DB_PASS", ""), AdminAPIKey: getEnv("ADMIN_API_KEY", ""), AdminPassword: getEnv("ADMIN_PASSWORD", "admin123"), SessionSecret: getEnv("SESSION_SECRET", "change-me"), RSAPrivateKey: getEnv("RSA_PRIVATE_KEY_PATH", "./crypto/private.pem"), RateLimitActivate: getEnv("RATE_LIMIT_ACTIVATE", "10"), RateLimitValidate: getEnv("RATE_LIMIT_VALIDATE", "60"), LogLevel: getEnv("LOG_LEVEL", "info"), } } func (c *Config) DSN() string { return c.DBUser + ":" + c.DBPass + "@tcp(" + c.DBHost + ":" + c.DBPort + ")/" + c.DBName + "?parseTime=true&charset=utf8mb4&multiStatements=true" } func getEnv(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func loadEnvFile(path string) { f, err := os.Open(path) if err != nil { return } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" || strings.HasPrefix(line, "#") { continue } parts := strings.SplitN(line, "=", 2) if len(parts) == 2 { key := strings.TrimSpace(parts[0]) val := strings.TrimSpace(parts[1]) if os.Getenv(key) == "" { os.Setenv(key, val) } } } }