package configs import ( "os" "strconv" "strings" "github.com/joho/godotenv" "go.uber.org/zap" ) type Config struct { Env string // örn. development, production Port string DBUrl string DBPGUrl string JWTSecret string AppURL string // örn. https://api.example.com - e-posta doğrulama linkleri için kullanılır ImageAPIURL string // Harici resim işleme servisi ImageAPIKey string ImageAPIEmail string ImageAPIPassword string GoogleClientID string GoogleClientSecret string GithubClientID string GithubClientSecret string GoogleRedirectURL string GithubRedirectURL string ClientCallbackURL string OAuthRedirectURL string RedisUrl string AccessTokenExpireMinutes int RefreshTokenExpireDays int // E-posta Ayarları EmailHost string EmailPort string EmailHostUser string EmailHostPassword string EmailFrom string CorsDebug bool } var AppConfig *Config func LoadConfig() { err := godotenv.Load() if err != nil { // Eğer proje kök dizininden çalıştırılmıyorsa (örn: cmd/app içinden), üst dizinleri kontrol et err = godotenv.Load(".env") //err = godotenv.Load("../../.env") } if err != nil { // Logger henüz hazır olmayabilir; varsa kullan if Logger != nil { Logger.Warn("Uyarı: .env dosyası yüklenirken hata oluştu, sistem ortam değişkenleriyle devam ediliyor", zapFieldsForEnvError(err)...) } } AppConfig = &Config{ Env: getEnv("APP_ENV", "development"), Port: getEnv("PORT", "8080"), DBUrl: getEnv("DB_URL", ""), DBPGUrl: getEnv("DB_URL_PG", ""), JWTSecret: getEnv("JWT_SECRET", "default_secret"), AppURL: getEnv("APP_URL", "http://localhost:8080"), GoogleClientID: getEnv("GOOGLE_CLIENT_ID", ""), GoogleClientSecret: getEnv("GOOGLE_CLIENT_SECRET", ""), GithubClientID: getEnv("GITHUB_CLIENT_ID", ""), GithubClientSecret: getEnv("GITHUB_CLIENT_SECRET", ""), GoogleRedirectURL: getEnv("GOOGLE_REDIRECT_URL", "http://localhost:8080/api/v1/auth/google/callback"), GithubRedirectURL: getEnv("GITHUB_REDIRECT_URL", "http://localhost:8080/api/v1/auth/github/callback"), ClientCallbackURL: getEnv("CLIENT_CALLBACK_URL", ""), OAuthRedirectURL: getEnv("OAUTH_REDIRECT_URL", ""), RedisUrl: getEnv("REDIS_URL", ""), AccessTokenExpireMinutes: getEnvAsInt("ACCESS_TOKEN_EXPIRE_MINUTES", 120), // Varsayılan 120 dakika RefreshTokenExpireDays: getEnvAsInt("REFRESH_TOKEN_EXPIRE_DAYS", 30), // Varsayılan 30 gün // E-posta Varsayılanları EmailHost: getEnv("EMAIL_HOST", "localhost"), EmailPort: getEnv("EMAIL_PORT", "1025"), EmailHostUser: getEnv("EMAIL_HOST_USER", ""), EmailHostPassword: getEnv("EMAIL_HOST_PASSWORD", ""), EmailFrom: getEnv("EMAIL_FROM", "noreply@gauth.local"), CorsDebug: getEnvAsBool("CORS_DEBUG", false), ImageAPIURL: getEnv("IMAGE_API_URL", "https://v2.beyhano.com.tr"), ImageAPIKey: getEnv("IMAGE_API_KEY", ""), ImageAPIEmail: getEnv("IMAGE_API_EMAIL", ""), ImageAPIPassword: getEnv("IMAGE_API_PASSWORD", ""), } } func getEnv(key, fallback string) string { if value, exists := os.LookupEnv(key); exists { return value } return fallback } func getEnvAsInt(key string, fallback int) int { valueStr := getEnv(key, "") if valueStr == "" { return fallback } value, err := strconv.Atoi(valueStr) if err != nil { return fallback } return value } func getEnvAsBool(key string, fallback bool) bool { valueStr := strings.TrimSpace(getEnv(key, "")) if valueStr == "" { return fallback } value, err := strconv.ParseBool(valueStr) if err != nil { return fallback } return value } func zapFieldsForEnvError(err error) []zap.Field { return []zap.Field{ zap.String("error", err.Error()), } }