veza/veza-backend-api/internal/handlers/config_reload.go

86 lines
2.3 KiB
Go

package handlers
import (
"net/http"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"veza-backend-api/internal/config"
)
// ConfigReloadHandler gère les endpoints de rechargement de configuration (T0034)
type ConfigReloadHandler struct {
reloader *config.ConfigReloader
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),
}
}
// 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,
})
}
}