95 lines
2.1 KiB
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
|
|
} |