package site import ( "net/http" "regexp" "github.com/gin-gonic/gin" ) var slugPattern = regexp.MustCompile(`^[a-z0-9]+(-[a-z0-9]+)*$`) type Handler struct { service *Service } func NewHandler(service *Service) *Handler { return &Handler{service: service} } type settingsResponse struct { Name string `json:"name"` Description string `json:"description"` Slug string `json:"slug"` } func toResponse(s *Settings) settingsResponse { return settingsResponse{Name: s.Name, Description: s.Description, Slug: s.Slug} } func (h *Handler) Get(c *gin.Context) { settings, err := h.service.Get(c.Request.Context()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to load site settings"}) return } c.JSON(http.StatusOK, toResponse(settings)) } type updateRequest struct { Name string `json:"name" binding:"required"` Description string `json:"description"` Slug string `json:"slug" binding:"required"` } func (h *Handler) Update(c *gin.Context) { var req updateRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "validation error", "details": err.Error()}) return } if !slugPattern.MatchString(req.Slug) { c.JSON(http.StatusBadRequest, gin.H{"error": "slug must be lowercase letters, digits and hyphens only"}) return } settings, err := h.service.Update(c.Request.Context(), req.Name, req.Description, req.Slug) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to update site settings"}) return } c.JSON(http.StatusOK, toResponse(settings)) }