package musichandler import ( "strconv" "github.com/gin-gonic/gin" musiclogic "spark-server/internal/module/music/logic" "spark-server/internal/pkg/errs" "spark-server/internal/transport/http/respond" ) type Handler struct { svc *musiclogic.Service } func New(svc *musiclogic.Service) *Handler { return &Handler{svc: svc} } // Playlist GET /v1/music/playlist — public curated list + category tree. // Query categoryId>0 filters tracks belonging to that category or its descendants. func (h *Handler) Playlist(c *gin.Context) { if h == nil || h.svc == nil || !h.svc.Ready() { respond.JSONError(c, errs.ErrAvailable) return } var categoryID int64 if raw := c.Query("categoryId"); raw != "" { n, err := strconv.ParseInt(raw, 10, 64) if err != nil || n < 0 { respond.JSONError(c, errs.ErrInvalidArgument.WithMsg("categoryId 无效")) return } categoryID = n } out, err := h.svc.Playlist(c.Request.Context(), categoryID) if err != nil { respond.JSONError(c, err) return } respond.JSON(c, out) } // Categories GET /v1/music/categories — enabled category tree. func (h *Handler) Categories(c *gin.Context) { if h == nil || h.svc == nil || !h.svc.Ready() { respond.JSONError(c, errs.ErrAvailable) return } out, err := h.svc.CategoryTree(c.Request.Context(), true) if err != nil { respond.JSONError(c, err) return } respond.JSON(c, gin.H{"categories": out}) } // Settings GET /v1/music/settings — global member preview seconds only. func (h *Handler) Settings(c *gin.Context) { if h == nil || h.svc == nil || !h.svc.Ready() { respond.JSONError(c, errs.ErrAvailable) return } out, err := h.svc.Settings(c.Request.Context()) if err != nil { respond.JSONError(c, err) return } respond.JSON(c, out) }