package handlers import ( "strconv" "server/internal/models" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) // GET /api/public/app-downloads func ListAppDownloadsPublicHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { var apps []models.AppDownload if err := db.Order("created_at desc").Find(&apps).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách ứng dụng"}) } return c.JSON(fiber.Map{"data": apps}) } } // GET /api/app-downloads func ListAppDownloadsHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { var apps []models.AppDownload if err := db.Order("created_at desc").Find(&apps).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách ứng dụng"}) } return c.JSON(fiber.Map{"data": apps}) } } // POST /api/app-downloads func CreateAppDownloadHandler(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 { Name string `json:"name"` Description string `json:"description"` DownloadURL string `json:"downloadUrl"` Platform string `json:"platform"` } var req Request if err := c.BodyParser(&req); err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"}) } if req.Name == "" || req.DownloadURL == "" { return c.Status(400).JSON(fiber.Map{"error": "Tên ứng dụng và đường dẫn tải không được để trống"}) } app := models.AppDownload{ Name: req.Name, Description: req.Description, DownloadURL: req.DownloadURL, Platform: req.Platform, } if err := db.Create(&app).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Lưu ứng dụng thất bại"}) } return c.JSON(fiber.Map{"ok": true, "data": app}) } } // PUT /api/app-downloads/:id func UpdateAppDownloadHandler(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 app models.AppDownload if err := db.First(&app, uint(id)).Error; err != nil { return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy ứng dụng"}) } type Request struct { Name string `json:"name"` Description string `json:"description"` DownloadURL string `json:"downloadUrl"` Platform string `json:"platform"` } var req Request if err := c.BodyParser(&req); err != nil { return c.Status(400).JSON(fiber.Map{"error": "Invalid request body"}) } if req.Name == "" || req.DownloadURL == "" { return c.Status(400).JSON(fiber.Map{"error": "Tên ứng dụng và đường dẫn tải không được để trống"}) } app.Name = req.Name app.Description = req.Description app.DownloadURL = req.DownloadURL app.Platform = req.Platform if err := db.Save(&app).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Cập nhật ứng dụng thất bại"}) } return c.JSON(fiber.Map{"ok": true, "data": app}) } } // DELETE /api/app-downloads/:id func DeleteAppDownloadHandler(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 app models.AppDownload if err := db.First(&app, uint(id)).Error; err != nil { return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy ứng dụng"}) } if err := db.Delete(&app).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Xóa ứng dụng thất bại"}) } return c.JSON(fiber.Map{"ok": true}) } } // GET /api/public/guide-links func ListGuideLinksPublicHandler(db *gorm.DB) fiber.Handler { return func(c *fiber.Ctx) error { var links []models.GuideLink if err := db.Order("created_at desc").Find(&links).Error; err != nil { return c.Status(500).JSON(fiber.Map{"error": "Không thể tải danh sách tài liệu"}) } return c.JSON(fiber.Map{"data": links}) } }