backend-service/internal/config/config.go
ats-tech25 ddfa2de49e feat(app): Implement comprehensive application lifecycle management
- Add new `app` package to manage application initialization and lifecycle
- Refactor `main.go` to use new application management approach
- Implement graceful shutdown with context timeout and signal handling
- Add dependency injection container initialization
- Enhance logging with configurable log levels and structured logging
- Update configuration loading and server initialization process
- Modify Jitsi configuration in `.env` for custom deployment
- Improve error handling and logging throughout application startup
- Centralize application startup and shutdown logic in single package
Introduces a more robust and flexible application management system with improved initialization, logging, and shutdown capabilities.
2025-11-07 19:22:26 +00:00

141 lines
3.0 KiB
Go

package config
import (
"os"
"strconv"
"time"
)
type Config struct {
Server ServerConfig
Database DatabaseConfig
JWT JWTConfig
Stripe StripeConfig
SMTP SMTPConfig
Jitsi JitsiConfig
Logging LoggingConfig
}
type ServerConfig struct {
Port string
Host string
}
type DatabaseConfig struct {
Host string
Port string
User string
Password string
Name string
SSLMode string
}
type JWTConfig struct {
Secret string
Expiration time.Duration
}
type StripeConfig struct {
SecretKey string
WebhookSecret string
PublishableKey string
}
type SMTPConfig struct {
Host string
Port int
Username string
Password string
From string
}
type JitsiConfig struct {
BaseURL string
APIKey string
AppID string
PrivateKey string
}
type LoggingConfig struct {
Level string
Format string
Output string
MaxSize int
MaxBackups int
MaxAge int
}
func Load() (*Config, error) {
cfg := &Config{
Server: ServerConfig{
Port: getEnv("PORT", "8080"),
Host: getEnv("HOST", "localhost"),
},
Database: DatabaseConfig{
Host: getEnv("DB_HOST", "localhost"),
Port: getEnv("DB_PORT", "5432"),
User: getEnv("DB_USER", "postgres"),
Password: getEnv("DB_PASSWORD", ""),
Name: getEnv("DB_NAME", "booking_system"),
SSLMode: getEnv("DB_SSLMODE", "disable"),
},
JWT: JWTConfig{
Secret: getEnv("JWT_SECRET", "your-secret-key"),
Expiration: getEnvDuration("JWT_EXPIRATION", 24*time.Hour),
},
Stripe: StripeConfig{
SecretKey: getEnv("STRIPE_SECRET_KEY", ""),
WebhookSecret: getEnv("STRIPE_WEBHOOK_SECRET", ""),
PublishableKey: getEnv("STRIPE_PUBLISHABLE_KEY", ""),
},
SMTP: SMTPConfig{
Host: getEnv("SMTP_HOST", ""),
Port: getEnvInt("SMTP_PORT", 587),
Username: getEnv("SMTP_USERNAME", ""),
Password: getEnv("SMTP_PASSWORD", ""),
From: getEnv("SMTP_FROM", ""),
},
Jitsi: JitsiConfig{
BaseURL: getEnv("JITSI_BASE_URL", ""),
APIKey: getEnv("JITSI_API_KEY", ""),
AppID: getEnv("JITSI_APP_ID", ""),
PrivateKey: getEnv("JITSI_PRIVATE_KEY", ""),
},
Logging: LoggingConfig{
Level: getEnv("LOG_LEVEL", "INFO"),
Format: getEnv("LOG_FORMAT", "json"),
Output: getEnv("LOG_OUTPUT", "stdout"),
MaxSize: getEnvInt("LOG_MAX_SIZE", 100),
MaxBackups: getEnvInt("LOG_MAX_BACKUPS", 3),
MaxAge: getEnvInt("LOG_MAX_AGE", 28),
},
}
return cfg, nil
}
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
func getEnvInt(key string, defaultValue int) int {
if value := os.Getenv(key); value != "" {
if intValue, err := strconv.Atoi(value); err == nil {
return intValue
}
}
return defaultValue
}
func getEnvDuration(key string, defaultValue time.Duration) time.Duration {
if value := os.Getenv(key); value != "" {
if duration, err := time.ParseDuration(value); err == nil {
return duration
}
}
return defaultValue
}