Files
geek-life/config/config.go

95 lines
2.1 KiB
Go

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
}