package app import ( "net/http" "strconv" "bindbox-game/internal/code" "bindbox-game/internal/pkg/core" "bindbox-game/internal/pkg/validation" ) type listActivitiesRequest struct { Name string `form:"name"` CategoryID int64 `form:"category_id"` IsBoss int32 `form:"is_boss"` Status int32 `form:"status"` Page int `form:"page"` PageSize int `form:"page_size"` } type activityItem struct { ID int64 `json:"id"` Name string `json:"name"` Banner string `json:"banner"` ActivityCategoryID int64 `json:"activity_category_id"` CategoryName string `json:"category_name"` Status int32 `json:"status"` PriceDraw int64 `json:"price_draw"` IsBoss int32 `json:"is_boss"` } type listActivitiesResponse struct { Page int `json:"page"` PageSize int `json:"page_size"` Total int64 `json:"total"` List []activityItem `json:"list"` } // ListActivities 活动列表 // @Summary 活动列表 // @Description 获取活动列表,支持分类、Boss、状态过滤与分页 // @Tags APP端.活动 // @Accept json // @Produce json // @Param name query string false "活动名称(模糊)" // @Param category_id query int false "活动分类ID" // @Param is_boss query int false "是否Boss(0/1)" // @Param status query int false "状态(1进行中 2下线)" // @Param page query int true "页码" default(1) // @Param page_size query int true "每页数量,最多100" default(20) // @Success 200 {object} listActivitiesResponse // @Failure 400 {object} code.Failure // @Router /api/app/activities [get] func (h *handler) ListActivities() core.HandlerFunc { return func(ctx core.Context) { req := new(listActivitiesRequest) res := new(listActivitiesResponse) if err := ctx.ShouldBindForm(req); err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err))) return } var isBossPtr *int32 if req.IsBoss == 0 || req.IsBoss == 1 { isBossPtr = &req.IsBoss } var statusPtr *int32 if req.Status == 1 || req.Status == 2 { statusPtr = &req.Status } items, total, err := h.activity.ListActivities(ctx.RequestContext(), struct { Name string CategoryID int64 IsBoss *int32 Status *int32 Page int PageSize int }{Name: req.Name, CategoryID: req.CategoryID, IsBoss: isBossPtr, Status: statusPtr, Page: req.Page, PageSize: req.PageSize}) if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ListActivitiesError, err.Error())) return } res.Page = req.Page res.PageSize = req.PageSize res.Total = total res.List = make([]activityItem, len(items)) // collect category ids var catIDs []int64 catSet := make(map[int64]struct{}) for _, v := range items { if v.ActivityCategoryID != 0 { if _, ok := catSet[v.ActivityCategoryID]; !ok { catSet[v.ActivityCategoryID] = struct{}{} catIDs = append(catIDs, v.ActivityCategoryID) } } } nameMap, _ := h.activity.GetCategoryNames(ctx.RequestContext(), catIDs) for i, v := range items { res.List[i] = activityItem{ ID: v.ID, Name: v.Name, Banner: v.Banner, ActivityCategoryID: v.ActivityCategoryID, CategoryName: nameMap[v.ActivityCategoryID], Status: v.Status, PriceDraw: v.PriceDraw, IsBoss: v.IsBoss, } } ctx.Payload(res) } } // GetActivityDetail 活动详情 // @Summary 活动详情 // @Description 获取指定活动的详细信息 // @Tags APP端.活动 // @Accept json // @Produce json // @Param activity_id path integer true "活动ID" // @Success 200 {object} model.Activities // @Failure 400 {object} code.Failure // @Router /api/app/activities/{activity_id} [get] func (h *handler) GetActivityDetail() core.HandlerFunc { return func(ctx core.Context) { id, err := strconv.ParseInt(ctx.Param("activity_id"), 10, 64) if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递活动ID")) return } item, err := h.activity.GetActivity(ctx.RequestContext(), id) if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.GetActivityError, err.Error())) return } ctx.Payload(item) } }