package config import ( "fmt" "os" "strconv" "github.com/joho/godotenv" ) // Config holds all configuration for the application type Config struct { Database DatabaseConfig Auth AuthConfig App AppConfig } // DatabaseConfig holds database configuration type DatabaseConfig struct { Host string Port int User string Password string DBName string SSLMode string } // AuthConfig holds authentication configuration type AuthConfig struct { JWTSecret string SessionDuration int // in hours } // AppConfig holds general application configuration type AppConfig struct { Environment string LogLevel string } // Load loads configuration from environment variables and .env file func Load() (*Config, error) { // Load .env file if it exists _ = godotenv.Load() config := &Config{ Database: DatabaseConfig{ Host: getEnv("DB_HOST", "localhost"), Port: getEnvAsInt("DB_PORT", 5432), User: getEnv("DB_USER", "postgres"), Password: getEnv("DB_PASSWORD", ""), DBName: getEnv("DB_NAME", "geeklife"), SSLMode: getEnv("DB_SSLMODE", "disable"), }, Auth: AuthConfig{ JWTSecret: getEnv("JWT_SECRET", "your-secret-key-change-this"), SessionDuration: getEnvAsInt("SESSION_DURATION", 24), }, App: AppConfig{ Environment: getEnv("ENVIRONMENT", "development"), LogLevel: getEnv("LOG_LEVEL", "info"), }, } return config, nil } // GetDSN returns the database connection string func (c *Config) GetDSN() string { return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", c.Database.Host, c.Database.Port, c.Database.User, c.Database.Password, c.Database.DBName, c.Database.SSLMode, ) } // getEnv gets an environment variable with a fallback value func getEnv(key, fallback string) string { if value := os.Getenv(key); value != "" { return value } return fallback } // getEnvAsInt gets an environment variable as integer with a fallback value func getEnvAsInt(key string, fallback int) int { if value := os.Getenv(key); value != "" { if intVal, err := strconv.Atoi(value); err == nil { return intVal } } return fallback }