211 lines
7.1 KiB
Go
211 lines
7.1 KiB
Go
package controllers
|
||
|
||
import (
|
||
"fmt"
|
||
database "goFiber/database/config"
|
||
"goFiber/database/models"
|
||
"log"
|
||
"net/http"
|
||
"os"
|
||
"path/filepath"
|
||
"strconv"
|
||
"time"
|
||
|
||
"github.com/gofiber/fiber/v3"
|
||
)
|
||
|
||
// GetHero godoc
|
||
// @Summary Get active hero/banner
|
||
// @Tags Hero
|
||
// @Produce json
|
||
// @Success 200 {object} map[string]interface{}
|
||
// @Failure 404 {object} map[string]string
|
||
// @Router /api/v1/hero [get]
|
||
func GetHero(c fiber.Ctx) error {
|
||
var heroes []models.Hero
|
||
// Aktif olan tüm hero'ları getir
|
||
if err := database.DB.Where("is_active = ?", true).Find(&heroes).Error; err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"})
|
||
}
|
||
if len(heroes) == 0 {
|
||
return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "no active hero found"})
|
||
}
|
||
return c.JSON(heroes)
|
||
}
|
||
|
||
// GetHeroAll godoc
|
||
// @Summary Get all heroes
|
||
// @Description Returns all hero/banner records (no filter)
|
||
// @Tags Hero
|
||
// @Produce json
|
||
// @Success 200 {array} map[string]interface{}
|
||
// @Failure 404 {object} map[string]string
|
||
// @Router /api/v1/heroes [get]
|
||
func GetHeroAll(c fiber.Ctx) error {
|
||
var heroes []models.Hero
|
||
// Tüm hero'ları getir (filtre yok)
|
||
if err := database.DB.Find(&heroes).Error; err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "database error"})
|
||
}
|
||
if len(heroes) == 0 {
|
||
return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "no hero found"})
|
||
}
|
||
return c.JSON(heroes)
|
||
}
|
||
|
||
// CreateHero godoc
|
||
// @Summary Create new hero/banner (admin only)
|
||
// @Tags Hero
|
||
// @Accept mpfd
|
||
// @Produce json
|
||
// @Security BearerAuth
|
||
// @Param title formData string false "Title"
|
||
// @Param text1 formData string false "Text1"
|
||
// @Param text2 formData string false "Text2"
|
||
// @Param text4 formData string false "Text4"
|
||
// @Param text5 formData string false "Text5"
|
||
// @Param color formData string true "Color"
|
||
// @Param is_active formData boolean false "Is Active"
|
||
// @Param image formData file true "Hero Image"
|
||
// @Success 201 {object} map[string]interface{}
|
||
// @Failure 400 {object} map[string]string
|
||
// @Router /api/v1/hero [post]
|
||
func CreateHero(c fiber.Ctx) error {
|
||
var hero models.Hero
|
||
if err := c.Bind().Body(&hero); err != nil {
|
||
return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"})
|
||
}
|
||
|
||
// Image upload
|
||
file, err := c.FormFile("image")
|
||
if err == nil {
|
||
if _, err := os.Stat("./uploads/heroes"); os.IsNotExist(err) {
|
||
os.MkdirAll("./uploads/heroes", 0755)
|
||
}
|
||
filename := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename)
|
||
filePath := filepath.Join("./uploads/heroes", filename)
|
||
if err := c.SaveFile(file, filePath); err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save image"})
|
||
}
|
||
hero.Image = "/uploads/heroes/" + filename
|
||
}
|
||
|
||
// Eğer sadece bir aktif hero olacaksa, diğerlerini pasife çekebiliriz
|
||
//if hero.IsActive {
|
||
// database.DB.Model(&models.Hero{}).Where("is_active = ?", true).Update("is_active", false)
|
||
//}
|
||
|
||
if err := database.DB.Create(&hero).Error; err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be created"})
|
||
}
|
||
|
||
return c.Status(http.StatusCreated).JSON(hero)
|
||
}
|
||
|
||
// UpdateHero godoc
|
||
// @Summary Update hero/banner (admin only)
|
||
// @Tags Hero
|
||
// @Accept mpfd
|
||
// @Produce json
|
||
// @Security BearerAuth
|
||
// @Param id path int true "Hero ID"
|
||
// @Param title formData string false "Title"
|
||
// @Param text1 formData string false "Text1"
|
||
// @Param text2 formData string false "Text2"
|
||
// @Param text4 formData string false "Text4"
|
||
// @Param text5 formData string false "Text5"
|
||
// @Param color formData string false "Color"
|
||
// @Param is_active formData boolean false "Is Active"
|
||
// @Param image formData file false "Hero Image"
|
||
// @Success 200 {object} map[string]interface{}
|
||
// @Failure 400 {object} map[string]string
|
||
// @Failure 404 {object} map[string]string
|
||
// @Router /api/v1/hero/{id} [put]
|
||
func UpdateHero(c fiber.Ctx) error {
|
||
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
||
if err != nil {
|
||
return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"})
|
||
}
|
||
|
||
var hero models.Hero
|
||
if err := database.DB.First(&hero, id).Error; err != nil {
|
||
return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "hero not found"})
|
||
}
|
||
|
||
// Log raw request body (works for JSON). For multipart/form-data, also log form values.
|
||
//log.Printf("Raw request body: %s\n", string(c.Body()))
|
||
//log.Printf("Form title: %s, is_active: %s\n", c.FormValue("title"), c.FormValue("is_active"))
|
||
|
||
var updateData models.Hero
|
||
if err := c.Bind().Body(&updateData); err != nil {
|
||
return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid request body"})
|
||
}
|
||
//log.Printf("Received update data: %+v\n", updateData) // Debug log
|
||
// Image upload
|
||
file, err := c.FormFile("image")
|
||
if err == nil {
|
||
if _, err := os.Stat("./uploads/heroes"); os.IsNotExist(err) {
|
||
os.MkdirAll("./uploads/heroes", 0755)
|
||
}
|
||
filename := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename)
|
||
filePath := filepath.Join("./uploads/heroes", filename)
|
||
if err := c.SaveFile(file, filePath); err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "failed to save image"})
|
||
}
|
||
updateData.Image = "/uploads/heroes/" + filename
|
||
}
|
||
|
||
// Eğer bu hero aktif yapılıyorsa diğerlerini pasife çek
|
||
//if updateData.IsActive {
|
||
// database.DB.Model(&models.Hero{}).Where("id != ?", id).Where("is_active = ?", true).Update("is_active", false)
|
||
//}
|
||
|
||
// Handle is_active coming from multipart/form-data: parse and update explicitly
|
||
if v := c.FormValue("is_active"); v != "" {
|
||
if parsed, err := strconv.ParseBool(v); err == nil {
|
||
// Ensure boolean field is updated even if it's false (zero value)
|
||
if err := database.DB.Model(&hero).Update("is_active", parsed).Error; err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be updated"})
|
||
}
|
||
// reflect into updateData for consistency
|
||
updateData.IsActive = parsed
|
||
} else {
|
||
log.Printf("invalid is_active value: %s", v)
|
||
}
|
||
}
|
||
|
||
if err := database.DB.Model(&hero).Updates(updateData).Error; err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be updated"})
|
||
}
|
||
|
||
return c.JSON(hero)
|
||
}
|
||
|
||
// DeleteHero godoc
|
||
// @Summary Delete hero/banner (admin only)
|
||
// @Tags Hero
|
||
// @Produce json
|
||
// @Security BearerAuth
|
||
// @Param id path int true "Hero ID"
|
||
// @Success 200 {object} map[string]interface{}
|
||
// @Failure 400 {object} map[string]string
|
||
// @Failure 404 {object} map[string]string
|
||
// @Router /api/v1/hero/{id} [delete]
|
||
func DeleteHero(c fiber.Ctx) error {
|
||
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
||
if err != nil {
|
||
return c.Status(http.StatusBadRequest).JSON(fiber.Map{"error": "invalid id"})
|
||
}
|
||
|
||
var hero models.Hero
|
||
if err := database.DB.First(&hero, id).Error; err != nil {
|
||
return c.Status(http.StatusNotFound).JSON(fiber.Map{"error": "hero not found"})
|
||
}
|
||
|
||
if err := database.DB.Delete(&hero).Error; err != nil {
|
||
return c.Status(http.StatusInternalServerError).JSON(fiber.Map{"error": "hero could not be deleted"})
|
||
}
|
||
|
||
return c.JSON(fiber.Map{"message": "hero deleted successfully"})
|
||
}
|