duidui_fiber/internal/camp/handler/category_handler.go
2026-03-27 10:34:03 +08:00

183 lines
4.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handler
import (
"dd_fiber_api/internal/camp"
"dd_fiber_api/internal/camp/service"
"github.com/gofiber/fiber/v2"
)
// CategoryHandler 分类处理器
type CategoryHandler struct {
categoryService *service.CategoryService
}
// NewCategoryHandler 创建分类处理器
func NewCategoryHandler(categoryService *service.CategoryService) *CategoryHandler {
return &CategoryHandler{
categoryService: categoryService,
}
}
// CreateCategory 创建分类
func (h *CategoryHandler) CreateCategory(c *fiber.Ctx) error {
var req camp.CreateCategoryRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
// 验证必填字段
if req.Name == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "分类名称不能为空",
})
}
resp, err := h.categoryService.CreateCategory(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "创建分类失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusBadRequest).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// GetCategory 获取分类
func (h *CategoryHandler) GetCategory(c *fiber.Ctx) error {
// 优先从查询参数获取,如果没有则从路径参数获取
id := c.Query("id")
if id == "" {
id = c.Params("id")
}
if id == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "分类ID不能为空",
})
}
resp, err := h.categoryService.GetCategory(id)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "获取分类失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusNotFound).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// UpdateCategory 更新分类
func (h *CategoryHandler) UpdateCategory(c *fiber.Ctx) error {
var req camp.UpdateCategoryRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
// 从 URL 参数获取 ID如果请求体中没有
if req.ID == "" {
req.ID = c.Query("id")
if req.ID == "" {
req.ID = c.Params("id")
}
}
if req.ID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "分类ID不能为空",
})
}
resp, err := h.categoryService.UpdateCategory(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "更新分类失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusBadRequest).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// DeleteCategory 删除分类
func (h *CategoryHandler) DeleteCategory(c *fiber.Ctx) error {
var id string
// 兼容前端POST body 为 {"params":{"id":"xxx"}}
var body struct {
Params struct {
ID string `json:"id"`
} `json:"params"`
}
if err := c.BodyParser(&body); err == nil && body.Params.ID != "" {
id = body.Params.ID
}
if id == "" {
id = c.Query("id")
}
if id == "" {
id = c.Params("id")
}
if id == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "分类ID不能为空",
})
}
resp, err := h.categoryService.DeleteCategory(id)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "删除分类失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusBadRequest).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// ListCategories 列出分类
func (h *CategoryHandler) ListCategories(c *fiber.Ctx) error {
var req camp.ListCategoriesRequest
if err := c.QueryParser(&req); err != nil {
req.Page = 1
req.PageSize = 10
}
resp, err := h.categoryService.ListCategories(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "获取分类列表失败: " + err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(resp)
}