mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 10:42:57 +00:00
253 lines
8.0 KiB
Go
253 lines
8.0 KiB
Go
package controllers
|
|
|
|
import (
|
|
"fmt"
|
|
"fotbal-club/internal/models"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PageElementConfigController struct {
|
|
DB *gorm.DB
|
|
}
|
|
|
|
func NewPageElementConfigController(db *gorm.DB) *PageElementConfigController {
|
|
return &PageElementConfigController{DB: db}
|
|
}
|
|
|
|
// GetPageElementConfigs returns all element configurations for a specific page
|
|
// @Summary Get page element configurations
|
|
// @Description Returns all element configurations for a specific page type
|
|
// @Tags page-elements
|
|
// @Produce json
|
|
// @Param page_type query string true "Page type (e.g., homepage, about)"
|
|
// @Success 200 {array} models.PageElementConfig
|
|
// @Router /api/v1/page-elements [get]
|
|
func (pc *PageElementConfigController) GetPageElementConfigs(c *gin.Context) {
|
|
pageType := c.Query("page_type")
|
|
if pageType == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "page_type is required"})
|
|
return
|
|
}
|
|
|
|
var configs []models.PageElementConfig
|
|
if err := pc.DB.Where("page_type = ?", pageType).Find(&configs).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch configurations"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, configs)
|
|
}
|
|
|
|
// GetAllPageElementConfigs returns all element configurations (admin)
|
|
// @Summary Get all page element configurations
|
|
// @Description Returns all element configurations for admin management
|
|
// @Tags page-elements
|
|
// @Produce json
|
|
// @Security BearerAuth
|
|
// @Success 200 {array} models.PageElementConfig
|
|
// @Router /api/v1/admin/page-elements [get]
|
|
func (pc *PageElementConfigController) GetAllPageElementConfigs(c *gin.Context) {
|
|
var configs []models.PageElementConfig
|
|
if err := pc.DB.Order("page_type ASC, element_name ASC").Find(&configs).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch configurations"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, configs)
|
|
}
|
|
|
|
// CreateOrUpdatePageElementConfig creates or updates an element configuration
|
|
// @Summary Create or update page element configuration
|
|
// @Description Creates or updates a page element configuration
|
|
// @Tags page-elements
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Security BearerAuth
|
|
// @Param config body models.PageElementConfig true "Element configuration data"
|
|
// @Success 200 {object} models.PageElementConfig
|
|
// @Router /api/v1/admin/page-elements [post]
|
|
func (pc *PageElementConfigController) CreateOrUpdatePageElementConfig(c *gin.Context) {
|
|
var input models.PageElementConfig
|
|
|
|
if err := c.ShouldBindJSON(&input); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
// Check if config already exists
|
|
var existing models.PageElementConfig
|
|
result := pc.DB.Where("page_type = ? AND element_name = ?", input.PageType, input.ElementName).First(&existing)
|
|
|
|
if result.Error == nil {
|
|
// Update existing
|
|
existing.Variant = input.Variant
|
|
existing.Settings = input.Settings
|
|
if err := pc.DB.Save(&existing).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update configuration"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, existing)
|
|
} else {
|
|
// Create new
|
|
if err := pc.DB.Create(&input).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create configuration"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusCreated, input)
|
|
}
|
|
}
|
|
|
|
// UpdatePageElementConfig updates an existing element configuration
|
|
// @Summary Update page element configuration
|
|
// @Description Updates an existing page element configuration
|
|
// @Tags page-elements
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Security BearerAuth
|
|
// @Param id path int true "Configuration ID"
|
|
// @Param config body models.PageElementConfig true "Updated configuration data"
|
|
// @Success 200 {object} models.PageElementConfig
|
|
// @Router /api/v1/admin/page-elements/{id} [put]
|
|
func (pc *PageElementConfigController) UpdatePageElementConfig(c *gin.Context) {
|
|
id, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"})
|
|
return
|
|
}
|
|
|
|
var config models.PageElementConfig
|
|
if err := pc.DB.First(&config, id).Error; err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Configuration not found"})
|
|
return
|
|
}
|
|
|
|
var updates models.PageElementConfig
|
|
if err := c.ShouldBindJSON(&updates); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
config.PageType = updates.PageType
|
|
config.ElementName = updates.ElementName
|
|
config.Variant = updates.Variant
|
|
config.Settings = updates.Settings
|
|
|
|
if err := pc.DB.Save(&config).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update configuration"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, config)
|
|
}
|
|
|
|
// DeletePageElementConfig deletes an element configuration
|
|
// @Summary Delete page element configuration
|
|
// @Description Deletes a page element configuration
|
|
// @Tags page-elements
|
|
// @Produce json
|
|
// @Security BearerAuth
|
|
// @Param id path int true "Configuration ID"
|
|
// @Success 200 {object} map[string]string
|
|
// @Router /api/v1/admin/page-elements/{id} [delete]
|
|
func (pc *PageElementConfigController) DeletePageElementConfig(c *gin.Context) {
|
|
id, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid ID"})
|
|
return
|
|
}
|
|
|
|
if err := pc.DB.Delete(&models.PageElementConfig{}, id).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete configuration"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "Configuration deleted successfully"})
|
|
}
|
|
|
|
// BatchUpdatePageElementConfigs updates multiple element configurations at once
|
|
// @Summary Batch update page element configurations
|
|
// @Description Updates multiple element configurations in one request
|
|
// @Tags page-elements
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Security BearerAuth
|
|
// @Param configs body []models.PageElementConfig true "Array of configurations"
|
|
// @Success 200 {object} map[string]interface{}
|
|
// @Router /api/v1/admin/page-elements/batch [post]
|
|
func (pc *PageElementConfigController) BatchUpdatePageElementConfigs(c *gin.Context) {
|
|
var configs []models.PageElementConfig
|
|
if err := c.ShouldBindJSON(&configs); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
updated := 0
|
|
created := 0
|
|
|
|
// Validate styles before saving
|
|
validator := &StyleValidator{}
|
|
for i := range configs {
|
|
if len(configs[i].Settings) > 0 {
|
|
// ElementSettings is already a map[string]interface{} type
|
|
settingsMap := map[string]interface{}(configs[i].Settings)
|
|
|
|
// Validate and normalize
|
|
if err := validator.ValidateAndNormalizeStyles(settingsMap); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("Style validation failed for %s: %v", configs[i].ElementName, err)})
|
|
return
|
|
}
|
|
|
|
// Update back
|
|
configs[i].Settings = models.ElementSettings(settingsMap)
|
|
}
|
|
}
|
|
|
|
err := pc.DB.Transaction(func(tx *gorm.DB) error {
|
|
for _, cfg := range configs {
|
|
var existing models.PageElementConfig
|
|
result := tx.Where("page_type = ? AND element_name = ?", cfg.PageType, cfg.ElementName).First(&existing)
|
|
|
|
if result.Error == nil {
|
|
// Update - merge styles to preserve other settings
|
|
if len(cfg.Settings) > 0 && len(existing.Settings) > 0 {
|
|
existingMap := map[string]interface{}(existing.Settings)
|
|
newMap := map[string]interface{}(cfg.Settings)
|
|
mergedMap := validator.MergeStyles(existingMap, newMap)
|
|
cfg.Settings = models.ElementSettings(mergedMap)
|
|
}
|
|
|
|
existing.Variant = cfg.Variant
|
|
existing.Visible = cfg.Visible
|
|
existing.DisplayOrder = cfg.DisplayOrder
|
|
existing.Settings = cfg.Settings
|
|
if err := tx.Save(&existing).Error; err != nil {
|
|
return err
|
|
}
|
|
updated++
|
|
} else {
|
|
// Create
|
|
if err := tx.Create(&cfg).Error; err != nil {
|
|
return err
|
|
}
|
|
created++
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to batch update configurations"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "Batch update successful",
|
|
"updated": updated,
|
|
"created": created,
|
|
})
|
|
}
|