veza/veza-backend-api/internal/config/middlewares_init.go
senke bbd8ed54de refactor(config): découper config.go par domaine (audit 2.7)
- env_helpers.go: getEnv*, parseLogAggregationLabels
- db_init.go: initDatabaseWithRetry
- redis_init.go: initRedis, filteredRedisLogger
- rabbitmq.go: getRabbitMQURL
- cors.go: CORS, cookies
- rate_limit.go: rate limit defaults
- services_init.go: initServices
- middlewares_init.go: initMiddlewares, SetupMiddleware
- config.go réduit de ~1487 à ~550 LOC
2026-02-15 14:44:33 +01:00

80 lines
3.1 KiB
Go

package config
import (
"time"
"github.com/gin-gonic/gin"
"veza-backend-api/internal/middleware"
)
// initMiddlewares initialise tous les middlewares
func (c *Config) initMiddlewares() error {
// Rate limiter global (avec Redis)
// En développement, augmenter les limites pour éviter les erreurs lors des tests
ipLimit := getEnvInt("RATE_LIMIT_IP_PER_MINUTE", 200) // Augmenté de 100 à 200 en dev
ipBurst := getEnvInt("RATE_LIMIT_IP_BURST", 20) // Augmenté de 10 à 20 en dev
userLimit := getEnvInt("RATE_LIMIT_USER_PER_MINUTE", 1000)
userBurst := getEnvInt("RATE_LIMIT_USER_BURST", 100)
rateLimiterConfig := &middleware.RateLimiterConfig{
IPRequestsPerMinute: ipLimit,
IPBurst: ipBurst,
UserRequestsPerMinute: userLimit,
UserBurst: userBurst,
RedisClient: c.RedisClient,
KeyPrefix: "veza:rate_limit",
}
c.RateLimiter = middleware.NewRateLimiter(rateLimiterConfig)
// Simple rate limiter (T0015) - sans dépendance Redis
window := time.Duration(c.RateLimitWindow) * time.Second
c.SimpleRateLimiter = middleware.NewSimpleRateLimiter(c.RateLimitLimit, window)
// Rate limiter par endpoint
endpointLimiterConfig := &middleware.EndpointLimiterConfig{
RedisClient: c.RedisClient,
KeyPrefix: "veza:endpoint_limit",
}
endpointLimits := middleware.DefaultEndpointLimits()
// Override defaults with config (PR-3)
endpointLimits.LoginAttempts = c.AuthRateLimitLoginAttempts
endpointLimits.LoginWindow = time.Duration(c.AuthRateLimitLoginWindow) * time.Minute
// A04: Limites register assouplies en dev (20/heure au lieu de 3/heure)
endpointLimits.RegisterAttempts = getDefaultRegisterAttempts(c.Env)
endpointLimits.RegisterWindow = time.Hour
c.EndpointLimiter = middleware.NewEndpointLimiter(endpointLimiterConfig, endpointLimits)
// BE-SVC-002: Initialize per-user rate limiter
userRateLimiterConfig := &middleware.UserRateLimiterConfig{
RequestsPerMinute: getEnvAsInt("USER_RATE_LIMIT_PER_MINUTE", 1000), // Default: 1000 requests per minute per user
Burst: getEnvAsInt("USER_RATE_LIMIT_BURST", 100), // Default: 100 burst
Window: time.Minute,
RedisClient: c.RedisClient,
KeyPrefix: "user_rate_limit",
Logger: c.Logger,
}
c.UserRateLimiter = middleware.NewUserRateLimiter(userRateLimiterConfig)
// Middleware d'authentification
c.AuthMiddleware = middleware.NewAuthMiddleware(
c.SessionService,
c.AuditService,
c.PermissionService,
c.JWTService,
c.UserService,
c.Logger,
)
return nil
}
// SetupMiddleware configure les middlewares globaux
// DÉPRÉCIÉ : Cette méthode est conservée pour compatibilité mais ne fait plus rien
// Les middlewares globaux sont maintenant configurés dans internal/api/router.go via APIRouter.Setup()
// TODO: Améliorer la configuration CORS dans api/router.go pour utiliser c.CORSOrigins depuis la config
func (c *Config) SetupMiddleware(router *gin.Engine) {
// No-op : Les middlewares sont configurés dans api/router.go
// Cette méthode existe uniquement pour compatibilité avec cmd/main.go (legacy)
// qui sera désactivé dans le Chantier 1 - Étape 2
}