package config import ( "time" "github.com/gin-gonic/gin" "veza-backend-api/internal/middleware" ) // InitMiddlewaresForTest initializes middlewares for integration/E2E tests. // Exported for use by internal/integration and tests packages. func (c *Config) InitMiddlewaresForTest() error { return c.initMiddlewares() } // 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 (supports JWT and X-API-Key for developer keys) c.AuthMiddleware = middleware.NewAuthMiddleware( c.SessionService, c.AuditService, c.PermissionService, c.JWTService, c.UserService, c.APIKeyService, c.Logger, ) if c.PresenceService != nil { c.AuthMiddleware.SetPresenceService(c.PresenceService) } 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 }