package handlers import ( "strconv" "server/internal/models" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) // GET /api/public/app-guides func ListAppGuidesPublicHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { var guides []models.AppGuide if err := db.Order("created_at desc").Find(&guides).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách tài liệu hướng dẫn"}) } return c.JSON(fiber.Map{"data": guides}) } } // GET /api/app-guides func ListAppGuidesHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { var guides []models.AppGuide if err := db.Order("created_at desc").Find(&guides).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách tài liệu hướng dẫn"}) } return c.JSON(fiber.Map{"data": guides}) } } // POST /api/app-guides func CreateAppGuideHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { if !isSuperAdmin(c) { return c.Status(403).JSON(fiber.Map{"error": "Bạn không có quyền thực hiện chức năng này"}) } type Request struct { Title string `json:"title"` URL string `json:"url"` } var req Request if err := c.BodyParser(&req); err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"}) } if req.Title == "" || req.URL == "" { return c.Status(400).JSON(fiber.Map{"error": "Tiêu đề và đường dẫn không được để trống"}) } guide := models.AppGuide{ Title: req.Title, URL: req.URL, } if err := db.Create(&guide).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Lưu tài liệu hướng dẫn thất bại"}) } return c.JSON(fiber.Map{"ok": true, "data": guide}) } } // PUT /api/app-guides/:id func UpdateAppGuideHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { if !isSuperAdmin(c) { return c.Status(403).JSON(fiber.Map{"error": "Bạn không có quyền thực hiện chức năng này"}) } idParam := c.Params("id") id, err := strconv.ParseUint(idParam, 10, 32) if err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid ID"}) } var guide models.AppGuide if err := db.First(&guide, uint(id)).Error; err != nil { return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy tài liệu hướng dẫn"}) } type Request struct { Title string `json:"title"` URL string `json:"url"` } var req Request if err := c.BodyParser(&req); err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"}) } if req.Title == "" || req.URL == "" { return c.Status(400).JSON(fiber.Map{"error": "Tiêu đề và đường dẫn không được để trống"}) } guide.Title = req.Title guide.URL = req.URL if err := db.Save(&guide).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Cập nhật tài liệu hướng dẫn thất bại"}) } return c.JSON(fiber.Map{"ok": true, "data": guide}) } } // DELETE /api/app-guides/:id func DeleteAppGuideHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { if !isSuperAdmin(c) { return c.Status(403).JSON(fiber.Map{"error": "Bạn không có quyền thực hiện chức năng này"}) } idParam := c.Params("id") id, err := strconv.ParseUint(idParam, 10, 32) if err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid ID"}) } var guide models.AppGuide if err := db.First(&guide, uint(id)).Error; err != nil { return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy tài liệu hướng dẫn"}) } if err := db.Delete(&guide).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Xóa tài liệu hướng dẫn thất bại"}) } return c.JSON(fiber.Map{"ok": true}) } }