veza/veza-backend-api/internal/config/defaults.go
2025-12-03 20:29:37 +01:00

148 lines
3.6 KiB
Go

package config
import (
"go.uber.org/zap"
)
// ConfigDefaults permet de construire une config avec des valeurs par défaut (T0038)
type ConfigDefaults struct {
appPort *int
appEnv *string
jwtSecret *string
databaseURL *string
redisURL *string
corsOrigins []string
rateLimitLimit *int
rateLimitWindow *int
logLevel *string
logger *zap.Logger
}
// NewConfigDefaults crée un nouveau builder de defaults (T0038)
func NewConfigDefaults() *ConfigDefaults {
return &ConfigDefaults{}
}
// WithPort définit le port par défaut (T0038)
func (b *ConfigDefaults) WithPort(port int) *ConfigDefaults {
b.appPort = &port
return b
}
// WithEnv définit l'environnement par défaut (T0038)
func (b *ConfigDefaults) WithEnv(env string) *ConfigDefaults {
b.appEnv = &env
return b
}
// WithJWTSecret définit le secret JWT par défaut (T0038)
func (b *ConfigDefaults) WithJWTSecret(secret string) *ConfigDefaults {
b.jwtSecret = &secret
return b
}
// WithDatabaseURL définit l'URL de la base de données par défaut (T0038)
func (b *ConfigDefaults) WithDatabaseURL(url string) *ConfigDefaults {
b.databaseURL = &url
return b
}
// WithRedisURL définit l'URL Redis par défaut (T0038)
func (b *ConfigDefaults) WithRedisURL(url string) *ConfigDefaults {
b.redisURL = &url
return b
}
// WithCORSOrigins définit les origines CORS par défaut (T0038)
func (b *ConfigDefaults) WithCORSOrigins(origins []string) *ConfigDefaults {
b.corsOrigins = origins
return b
}
// WithRateLimit définit les limites de rate limiting par défaut (T0038)
func (b *ConfigDefaults) WithRateLimit(limit int, windowSeconds int) *ConfigDefaults {
b.rateLimitLimit = &limit
b.rateLimitWindow = &windowSeconds
return b
}
// WithLogLevel définit le niveau de log par défaut (T0038)
func (b *ConfigDefaults) WithLogLevel(level string) *ConfigDefaults {
b.logLevel = &level
return b
}
// WithLogger définit le logger par défaut (T0038)
func (b *ConfigDefaults) WithLogger(logger *zap.Logger) *ConfigDefaults {
b.logger = logger
return b
}
// Build construit une Config avec les valeurs par défaut (T0038)
func (b *ConfigDefaults) Build() *Config {
config := &Config{}
if b.appPort != nil {
config.AppPort = *b.appPort
}
// Note: appEnv n'est pas dans Config, mais peut être utilisé ailleurs
if b.jwtSecret != nil {
config.JWTSecret = *b.jwtSecret
}
if b.databaseURL != nil {
config.DatabaseURL = *b.databaseURL
}
if b.redisURL != nil {
config.RedisURL = *b.redisURL
}
if len(b.corsOrigins) > 0 {
config.CORSOrigins = b.corsOrigins
}
if b.rateLimitLimit != nil {
config.RateLimitLimit = *b.rateLimitLimit
}
if b.rateLimitWindow != nil {
config.RateLimitWindow = *b.rateLimitWindow
}
if b.logLevel != nil {
config.LogLevel = *b.logLevel
}
if b.logger != nil {
config.Logger = b.logger
}
return config
}
// Merge fusionne les valeurs par défaut avec une config existante (override) (T0038)
func (b *ConfigDefaults) Merge(config *Config) *Config {
if b.appPort != nil {
config.AppPort = *b.appPort
}
if b.jwtSecret != nil {
config.JWTSecret = *b.jwtSecret
}
if b.databaseURL != nil {
config.DatabaseURL = *b.databaseURL
}
if b.redisURL != nil {
config.RedisURL = *b.redisURL
}
if len(b.corsOrigins) > 0 {
config.CORSOrigins = b.corsOrigins
}
if b.rateLimitLimit != nil {
config.RateLimitLimit = *b.rateLimitLimit
}
if b.rateLimitWindow != nil {
config.RateLimitWindow = *b.rateLimitWindow
}
if b.logLevel != nil {
config.LogLevel = *b.logLevel
}
if b.logger != nil {
config.Logger = b.logger
}
return config
}