veza/veza-backend-api/internal/handlers/feature_flag_handler.go
2026-03-07 00:54:35 +01:00

54 lines
1.4 KiB
Go

package handlers
import (
"net/http"
"github.com/gin-gonic/gin"
apperrors "veza-backend-api/internal/errors"
"veza-backend-api/internal/services"
)
// FeatureFlagHandler handles feature flag endpoints (v0.803 ADM1-05)
type FeatureFlagHandler struct {
svc *services.FeatureFlagService
}
// NewFeatureFlagHandler creates a new FeatureFlagHandler
func NewFeatureFlagHandler(svc *services.FeatureFlagService) *FeatureFlagHandler {
return &FeatureFlagHandler{svc: svc}
}
// List returns all feature flags (admin)
func (h *FeatureFlagHandler) List(c *gin.Context) {
list, err := h.svc.List(c.Request.Context())
if err != nil {
RespondWithAppError(c, apperrors.NewInternalErrorWrap("Failed to list feature flags", err))
return
}
c.JSON(http.StatusOK, gin.H{"feature_flags": list})
}
// Toggle enables or disables a feature flag (admin)
func (h *FeatureFlagHandler) Toggle(c *gin.Context) {
name := c.Param("name")
if name == "" {
RespondWithAppError(c, apperrors.NewValidationError("name is required"))
return
}
var req struct {
Enabled bool `json:"enabled"`
}
if err := c.ShouldBindJSON(&req); err != nil {
RespondWithAppError(c, apperrors.NewValidationError("enabled is required"))
return
}
flag, err := h.svc.Toggle(c.Request.Context(), name, req.Enabled)
if err != nil {
RespondWithAppError(c, apperrors.NewInternalErrorWrap("Failed to toggle feature flag", err))
return
}
c.JSON(http.StatusOK, flag)
}