Files
MyClub/internal/controllers/clothing_controller.go
T
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

169 lines
4.6 KiB
Go

package controllers
import (
"fotbal-club/internal/models"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
// ClothingController handles clothing/merch endpoints
type ClothingController struct {
DB *gorm.DB
}
// NewClothingController creates a new clothing controller
func NewClothingController(db *gorm.DB) *ClothingController {
return &ClothingController{DB: db}
}
// GetClothing retrieves all active clothing items (public endpoint)
func (ctrl *ClothingController) GetClothing(c *gin.Context) {
db := ctrl.DB
var items []models.Clothing
if err := db.Where("is_active = ?", true).Order("display_order ASC, created_at DESC").Find(&items).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch clothing items"})
return
}
c.JSON(http.StatusOK, gin.H{"data": items})
}
// GetClothingAdmin retrieves all clothing items for admin
func (ctrl *ClothingController) GetClothingAdmin(c *gin.Context) {
db := ctrl.DB
var items []models.Clothing
if err := db.Order("display_order ASC, created_at DESC").Find(&items).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch clothing items"})
return
}
c.JSON(http.StatusOK, gin.H{"data": items})
}
// GetClothingByID retrieves a single clothing item by ID
func (ctrl *ClothingController) GetClothingByID(c *gin.Context) {
db := ctrl.DB
id := c.Param("id")
var item models.Clothing
if err := db.First(&item, id).Error; err != nil {
if err == gorm.ErrRecordNotFound {
c.JSON(http.StatusNotFound, gin.H{"error": "Clothing item not found"})
return
}
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch clothing item"})
return
}
c.JSON(http.StatusOK, item)
}
// CreateClothing creates a new clothing item
func (ctrl *ClothingController) CreateClothing(c *gin.Context) {
db := ctrl.DB
var input models.Clothing
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := db.Create(&input).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create clothing item"})
return
}
c.JSON(http.StatusCreated, input)
}
// UpdateClothing updates a clothing item
func (ctrl *ClothingController) UpdateClothing(c *gin.Context) {
db := ctrl.DB
id := c.Param("id")
var item models.Clothing
if err := db.First(&item, id).Error; err != nil {
if err == gorm.ErrRecordNotFound {
c.JSON(http.StatusNotFound, gin.H{"error": "Clothing item not found"})
return
}
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch clothing item"})
return
}
var input models.Clothing
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// Update fields
item.Title = input.Title
item.Description = input.Description
item.Price = input.Price
item.Currency = input.Currency
item.ImageURL = input.ImageURL
item.URL = input.URL
item.IsActive = input.IsActive
item.DisplayOrder = input.DisplayOrder
if err := db.Save(&item).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update clothing item"})
return
}
c.JSON(http.StatusOK, item)
}
// DeleteClothing deletes a clothing item (soft delete)
func (ctrl *ClothingController) DeleteClothing(c *gin.Context) {
db := ctrl.DB
id := c.Param("id")
var item models.Clothing
if err := db.First(&item, id).Error; err != nil {
if err == gorm.ErrRecordNotFound {
c.JSON(http.StatusNotFound, gin.H{"error": "Clothing item not found"})
return
}
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch clothing item"})
return
}
if err := db.Delete(&item).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete clothing item"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Clothing item deleted"})
}
// UpdateClothingOrder updates the display order of clothing items
func (ctrl *ClothingController) UpdateClothingOrder(c *gin.Context) {
db := ctrl.DB
var input []struct {
ID uint `json:"id"`
DisplayOrder int `json:"display_order"`
}
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// Update each item's display order
for _, item := range input {
if err := db.Model(&models.Clothing{}).Where("id = ?", item.ID).Update("display_order", item.DisplayOrder).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update order"})
return
}
}
c.JSON(http.StatusOK, gin.H{"message": "Order updated"})
}