spark-server/internal/transport/http/handler/music/handler.go
DESKTOP-L8OUL9F\gfl0034 d3a68c3cad feat(music): 分类多对多、后台完整编辑与 OpenAPI
新增总/子分类与曲目绑定;playlist 可按 categoryId 筛选并返回分类树;
popadmin 支持行内改曲名/排序/上下架/会员开关与封面背景音频上传;文档同步。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 10:38:06 +08:00

72 lines
1.7 KiB
Go

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)
}