新增总/子分类与曲目绑定;playlist 可按 categoryId 筛选并返回分类树; popadmin 支持行内改曲名/排序/上下架/会员开关与封面背景音频上传;文档同步。 Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
1.7 KiB
Go
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)
|
|
}
|