veza/veza-backend-api/internal/handlers/config_reload.go
2026-03-05 23:03:43 +01:00

104 lines
2.9 KiB
Go

package handlers
import (
"net/http"
"veza-backend-api/internal/config"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// ConfigReloaderInterface defines methods needed for config reload handler
type ConfigReloaderInterface interface {
ReloadAll() error
ReloadLogLevel() error
ReloadRateLimits() error
GetCurrentConfig() *config.ReloadableConfig
}
// ConfigReloadHandler gère les endpoints de rechargement de configuration (T0034)
type ConfigReloadHandler struct {
reloader ConfigReloaderInterface
logger *zap.Logger
commonHandler *CommonHandler
}
// NewConfigReloadHandler crée un nouveau handler pour le rechargement de configuration
func NewConfigReloadHandler(reloader *config.ConfigReloader, logger *zap.Logger) *ConfigReloadHandler {
return &ConfigReloadHandler{
reloader: reloader,
logger: logger,
commonHandler: NewCommonHandler(logger),
}
}
// NewConfigReloadHandlerWithInterface creates a new config reload handler with interface (for testing)
func NewConfigReloadHandlerWithInterface(reloader ConfigReloaderInterface, logger *zap.Logger) *ConfigReloadHandler {
return &ConfigReloadHandler{
reloader: reloader,
logger: logger,
commonHandler: NewCommonHandler(logger),
}
}
// ReloadConfig gère le rechargement de toute la configuration (T0034)
func (h *ConfigReloadHandler) ReloadConfig() gin.HandlerFunc {
return func(c *gin.Context) {
var req struct {
Type string `json:"type"` // "all", "log_level", "rate_limits"
}
if appErr := h.commonHandler.BindAndValidateJSON(c, &req); appErr != nil {
// Si pas de JSON valide, recharger tout par défaut
req.Type = "all"
}
var err error
var message string
switch req.Type {
case "log_level":
err = h.reloader.ReloadLogLevel()
message = "Log level reloaded successfully"
case "rate_limits":
err = h.reloader.ReloadRateLimits()
message = "Rate limits reloaded successfully"
case "all", "":
err = h.reloader.ReloadAll()
message = "All configurations reloaded successfully"
default:
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid reload type. Use 'all', 'log_level', or 'rate_limits'",
})
return
}
if err != nil {
h.logger.Error("Failed to reload configuration", zap.Error(err), zap.String("type", req.Type))
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Failed to reload configuration",
"details": err.Error(),
})
return
}
// Récupérer la configuration actuelle pour la réponse
currentConfig := h.reloader.GetCurrentConfig()
RespondSuccess(c, http.StatusOK, gin.H{
"message": message,
"config": currentConfig,
})
}
}
// GetConfig gère la récupération de la configuration actuelle (T0034)
func (h *ConfigReloadHandler) GetConfig() gin.HandlerFunc {
return func(c *gin.Context) {
currentConfig := h.reloader.GetCurrentConfig()
RespondSuccess(c, http.StatusOK, gin.H{
"config": currentConfig,
})
}
}