diff --git a/internal/handler/app.go b/internal/handler/app.go new file mode 100644 index 0000000..393fe6e --- /dev/null +++ b/internal/handler/app.go @@ -0,0 +1,103 @@ +package handler + +import ( + "strconv" + + "gotest/internal/service" + + "github.com/gin-gonic/gin" +) + +// AppHandler 应用数据处理器 +type AppHandler struct { + svc *service.AppService +} + +// NewAppHandler 创建应用数据处理器 +func NewAppHandler(svc *service.AppService) *AppHandler { + return &AppHandler{svc: svc} +} + +// GetHomeData 获取应用首页数据 GET /api/v1/app/home +func (h *AppHandler) GetHomeData(c *gin.Context) { + data, err := h.svc.GetHomeData() + if err != nil { + FailInternal(c, "获取首页数据失败") + return + } + Success(c, data) +} + +// ListCategories 获取应用分类 GET /api/v1/app/categories +func (h *AppHandler) ListCategories(c *gin.Context) { + data, err := h.svc.ListCategories() + if err != nil { + FailInternal(c, "获取分类失败") + return + } + Success(c, data) +} + +// ListApps 获取应用列表 GET /api/v1/app/apps?category_id=&keyword=&sort=&page=&page_size= +func (h *AppHandler) ListApps(c *gin.Context) { + categoryID, _ := strconv.ParseUint(c.Query("category_id"), 10, 64) + keyword := c.Query("keyword") + sort := c.Query("sort") + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "12")) + if page < 1 { + page = 1 + } + if pageSize < 1 || pageSize > 100 { + pageSize = 12 + } + data, err := h.svc.ListApps(uint(categoryID), keyword, sort, page, pageSize) + if err != nil { + FailInternal(c, "获取应用列表失败") + return + } + Success(c, data) +} + +// GetApp 获取应用详情 GET /api/v1/app/apps/:id +func (h *AppHandler) GetApp(c *gin.Context) { + id, err := strconv.ParseUint(c.Param("id"), 10, 64) + if err != nil { + FailBadRequest(c, "无效的应用 ID") + return + } + data, err := h.svc.GetApp(uint(id)) + if err != nil { + FailBadRequest(c, "应用不存在") + return + } + Success(c, data) +} + +// ListFeatured 获取精选应用 GET /api/v1/app/featured?limit= +func (h *AppHandler) ListFeatured(c *gin.Context) { + limit, _ := strconv.Atoi(c.DefaultQuery("limit", "8")) + if limit < 1 || limit > 50 { + limit = 8 + } + data, err := h.svc.ListFeatured(limit) + if err != nil { + FailInternal(c, "获取精选应用失败") + return + } + Success(c, data) +} + +// ListNew 获取新上架应用 GET /api/v1/app/new?limit= +func (h *AppHandler) ListNew(c *gin.Context) { + limit, _ := strconv.Atoi(c.DefaultQuery("limit", "4")) + if limit < 1 || limit > 50 { + limit = 4 + } + data, err := h.svc.ListNew(limit) + if err != nil { + FailInternal(c, "获取新上架应用失败") + return + } + Success(c, data) +}