Files
portal-mini-go/internal/handler/admin/miniapp/miniapp_handler.go
T
2026-10-26 22:42:29 +08:00

142 lines
3.5 KiB
Go

// Package miniapphdl 是后台管理小程序的 HTTP 接入层。
package miniapphdl
import (
"strconv"
"github.com/gin-gonic/gin"
"portal-mini-go/internal/middleware"
"portal-mini-go/internal/pkg/errors"
"portal-mini-go/internal/pkg/response"
miniappsvc "portal-mini-go/internal/service/admin/miniapp"
)
// Handler 小程序管理请求处理。
type Handler struct {
svc *miniappsvc.Service
}
func NewHandler(svc *miniappsvc.Service) *Handler { return &Handler{svc: svc} }
// Create 新建小程序。
func (h *Handler) Create(c *gin.Context) {
var req miniappsvc.CreateReq
if err := c.ShouldBindJSON(&req); err != nil {
c.Error(errors.ErrBadRequest)
return
}
m, err := h.svc.Create(c.Request.Context(), req)
if err != nil {
c.Error(err)
return
}
response.OK(c, m)
}
// Update 更新小程序。
func (h *Handler) Update(c *gin.Context) {
id, ok := parseID(c)
if !ok {
return
}
var req miniappsvc.UpdateReq
if err := c.ShouldBindJSON(&req); err != nil {
c.Error(errors.ErrBadRequest)
return
}
m, err := h.svc.Update(c.Request.Context(), id, req)
if err != nil {
c.Error(err)
return
}
response.OK(c, m)
}
// Get 查询单个小程序。
func (h *Handler) Get(c *gin.Context) {
id, ok := parseID(c)
if !ok {
return
}
m, err := h.svc.GetByID(c.Request.Context(), id)
if err != nil {
c.Error(err)
return
}
response.OK(c, m)
}
// List 分页列表小程序。支持 query: status、page、size。
func (h *Handler) List(c *gin.Context) {
status, _ := strconv.ParseInt(c.DefaultQuery("status", "-1"), 10, 8)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
list, total, err := h.svc.List(c.Request.Context(), miniappsvc.ListReq{
Status: int8(status),
Page: page,
Size: size,
})
if err != nil {
c.Error(err)
return
}
response.OK(c, gin.H{"list": list, "total": total, "page": page, "size": size})
}
// Delete 删除小程序。
func (h *Handler) Delete(c *gin.Context) {
id, ok := parseID(c)
if !ok {
return
}
if err := h.svc.Delete(c.Request.Context(), id); err != nil {
c.Error(err)
return
}
response.OK(c, nil)
}
// UpdateStatus 更新小程序状态(0 禁用、1 启用)。
func (h *Handler) UpdateStatus(c *gin.Context) {
id, ok := parseID(c)
if !ok {
return
}
var req miniappsvc.StatusReq
if err := c.ShouldBindJSON(&req); err != nil {
c.Error(errors.ErrBadRequest)
return
}
m, err := h.svc.UpdateStatus(c.Request.Context(), id, req.Status)
if err != nil {
c.Error(err)
return
}
response.OK(c, m)
}
// parseID 从路径参数解析并校验 uint64 主键。
func parseID(c *gin.Context) (uint64, bool) {
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
if err != nil {
c.Error(errors.ErrBadRequest)
return 0, false
}
return id, true
}
// Register 注册后台小程序管理路由。g 已带 /api/admin 前缀与 JWT 鉴权中间件;
// 读接口挂 mini:view,写接口挂 mini:manage。
func Register(g *gin.RouterGroup, h *Handler) {
rg := g.Group("/miniapps")
{
rg.POST("", middleware.RequirePerm(middleware.PermMiniManage), h.Create)
rg.PUT("/:id", middleware.RequirePerm(middleware.PermMiniManage), h.Update)
rg.GET("/:id", middleware.RequirePerm(middleware.PermMiniView), h.Get)
rg.GET("", middleware.RequirePerm(middleware.PermMiniView), h.List)
rg.DELETE("/:id", middleware.RequirePerm(middleware.PermMiniManage), h.Delete)
rg.PUT("/:id/status", middleware.RequirePerm(middleware.PermMiniManage), h.UpdateStatus)
}
}