All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m3s
- 新增 GET /api/admin/shops/cascade 接口,支持按店铺名模糊查询和上级ID过滤
- Store 层新增 ListForCascade(支持数据权限过滤)和 GetParentIDsWithChildren 方法
- Service 层新增 ListCascade,批量判断 has_children 避免 N+1 查询
- 返回格式:[{id, shop_name, has_children}]
💘 Generated with Crush
Assisted-by: Claude Sonnet 4.6 via Crush <crush@charm.land>
97 lines
2.3 KiB
Go
97 lines
2.3 KiB
Go
package admin
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
|
shopService "github.com/break/junhong_cmp_fiber/internal/service/shop"
|
|
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
|
"github.com/break/junhong_cmp_fiber/pkg/response"
|
|
)
|
|
|
|
type ShopHandler struct {
|
|
service *shopService.Service
|
|
}
|
|
|
|
func NewShopHandler(service *shopService.Service) *ShopHandler {
|
|
return &ShopHandler{service: service}
|
|
}
|
|
|
|
func (h *ShopHandler) List(c *fiber.Ctx) error {
|
|
var req dto.ShopListRequest
|
|
if err := c.QueryParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
|
}
|
|
|
|
shops, total, err := h.service.ListShopResponses(c.UserContext(), &req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return response.SuccessWithPagination(c, shops, total, req.Page, req.PageSize)
|
|
}
|
|
|
|
func (h *ShopHandler) Create(c *fiber.Ctx) error {
|
|
var req dto.CreateShopRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
|
}
|
|
|
|
shop, err := h.service.Create(c.UserContext(), &req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return response.Success(c, shop)
|
|
}
|
|
|
|
func (h *ShopHandler) Update(c *fiber.Ctx) error {
|
|
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
|
if err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "无效的店铺 ID")
|
|
}
|
|
|
|
var req dto.UpdateShopRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
|
}
|
|
|
|
shop, err := h.service.Update(c.UserContext(), uint(id), &req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return response.Success(c, shop)
|
|
}
|
|
|
|
func (h *ShopHandler) Delete(c *fiber.Ctx) error {
|
|
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
|
if err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "无效的店铺 ID")
|
|
}
|
|
|
|
if err := h.service.Delete(c.UserContext(), uint(id)); err != nil {
|
|
return err
|
|
}
|
|
|
|
return response.Success(c, nil)
|
|
}
|
|
|
|
// Cascade 店铺联级查询
|
|
// GET /api/admin/shops/cascade
|
|
func (h *ShopHandler) Cascade(c *fiber.Ctx) error {
|
|
var req dto.ShopCascadeRequest
|
|
if err := c.QueryParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
|
}
|
|
|
|
items, err := h.service.ListCascade(c.UserContext(), &req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return response.Success(c, items)
|
|
}
|