diff --git a/veza-backend-api/internal/api/router.go b/veza-backend-api/internal/api/router.go index 6be6a016f..a9774e464 100644 --- a/veza-backend-api/internal/api/router.go +++ b/veza-backend-api/internal/api/router.go @@ -414,7 +414,11 @@ func (r *APIRouter) setupCorePublicRoutes(router *gin.Engine) { if r.config != nil { rabbitMQEventBus = r.config.RabbitMQEventBus } - healthHandler := handlers.NewHealthHandler(r.db.GormDB, r.logger, redisClient, rabbitMQEventBus) + var env string + if r.config != nil { + env = r.config.Env + } + healthHandler := handlers.NewHealthHandler(r.db.GormDB, r.logger, redisClient, rabbitMQEventBus, env) healthCheckHandler = healthHandler.Check livenessHandler = healthHandler.Liveness readinessHandler = healthHandler.Readiness diff --git a/veza-backend-api/internal/handlers/health.go b/veza-backend-api/internal/handlers/health.go index 56c05be19..ede3a8abb 100644 --- a/veza-backend-api/internal/handlers/health.go +++ b/veza-backend-api/internal/handlers/health.go @@ -35,13 +35,15 @@ type HealthHandler struct { logger *zap.Logger redis *redis.Client // Typé avec le vrai type Redis rabbitMQEventBus *eventbus.RabbitMQEventBus // Instance de l'EventBus RabbitMQ + environment string // Env (development, production, etc.) } // NewHealthHandler crée un nouveau handler de health -func NewHealthHandler(db *gorm.DB, logger *zap.Logger, redisClient interface{}, rabbitMQEventBus interface{}) *HealthHandler { +func NewHealthHandler(db *gorm.DB, logger *zap.Logger, redisClient interface{}, rabbitMQEventBus interface{}, env string) *HealthHandler { h := &HealthHandler{ - db: db, - logger: logger, + db: db, + logger: logger, + environment: env, } // Type assertion for Redis @@ -129,12 +131,31 @@ func (h *HealthHandler) Readiness(c *gin.Context) { dbCheck := h.checkDatabase() response.Checks["database"] = dbCheck + // DB is critical in ALL environments + if dbCheck.Status == "error" { + response.Status = "not_ready" + c.JSON(http.StatusServiceUnavailable, response) + return + } + + // Déterminer la strictezza selon l'environnement + // En dev/lab, on tolère que Redis/RabbitMQ soient down + isStrict := h.environment == "production" + // Vérifier que Redis est accessible redisCheck := h.checkRedis() + if redisCheck.Status == "error" && !isStrict { + redisCheck.Status = "warning" + redisCheck.Message += " (ignored in non-production)" + } response.Checks["redis"] = redisCheck // Vérifier que RabbitMQ est accessible (si activé) rabbitMQCheck := h.checkRabbitMQ() + if rabbitMQCheck.Status == "error" && !isStrict { + rabbitMQCheck.Status = "warning" + rabbitMQCheck.Message += " (ignored in non-production)" + } response.Checks["rabbitmq"] = rabbitMQCheck // Si un check est en erreur, on n'est pas ready