104 lines
2.9 KiB
Go
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,
|
|
})
|
|
}
|
|
}
|