Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
156 lines
4.7 KiB
Go
156 lines
4.7 KiB
Go
package playletser
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"videoweb/app/service/authser"
|
|
"videoweb/app/service/upstream"
|
|
"videoweb/pub/common/log"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const (
|
|
collectSetPath = "/api/app/playlet/collect/set"
|
|
collectListPath = "/api/app/playlet/collect/list"
|
|
defaultCollectPageSize = 40
|
|
|
|
CollectTypePlaylet = "playlet"
|
|
CollectTypeChapter = "chapter"
|
|
)
|
|
|
|
// PlayletCollectSetReq 对应 swagger proto.PlayletCollectSetReq
|
|
type PlayletCollectSetReq struct {
|
|
ID int64 `json:"id"`
|
|
IsCollect bool `json:"isCollect"`
|
|
}
|
|
|
|
// PlayletCollectSetResp 对应 swagger proto.PlayletCollectSetResp
|
|
type PlayletCollectSetResp struct {
|
|
ID int64 `json:"id"`
|
|
CountCollect int64 `json:"countCollect"`
|
|
IsCollect int `json:"isCollect"`
|
|
}
|
|
|
|
// PlayletCollectData 对应 swagger proto.PlayletCollectData
|
|
type PlayletCollectData struct {
|
|
ID int64 `json:"id"`
|
|
Title string `json:"title"`
|
|
Slug string `json:"slug"`
|
|
Cover string `json:"cover"`
|
|
Desc string `json:"desc"`
|
|
TagIDs []int64 `json:"tagIds"`
|
|
TagNames []string `json:"tagNames"`
|
|
TagSlugs []string `json:"tagSlugs"`
|
|
ThemeIDs []int64 `json:"themeIds"`
|
|
ThemeNames []string `json:"themeNames"`
|
|
ThemeSlugs []string `json:"themeSlugs"`
|
|
TotalEpisode int `json:"totalEpisode"`
|
|
UpdateStatus int `json:"updateStatus"`
|
|
CountBrowse int64 `json:"countBrowse"`
|
|
CountCollect int64 `json:"countCollect"`
|
|
CountLike int64 `json:"countLike"`
|
|
IsFeatured bool `json:"isFeatured"`
|
|
IsNew bool `json:"isNew"`
|
|
IsRecommend bool `json:"isRecommend"`
|
|
IsCollect int `json:"isCollect"`
|
|
CollectedAt string `json:"collectedAt"`
|
|
WatchedCount int `json:"watchedCount"`
|
|
UnwatchedCount int `json:"unwatchedCount"`
|
|
LastChapterID int64 `json:"lastChapterId"`
|
|
LastEpisode int `json:"lastEpisode"`
|
|
}
|
|
|
|
// PlayletCollectListResp 对应 swagger proto.PlayletCollectListResp
|
|
type PlayletCollectListResp struct {
|
|
List []PlayletCollectData `json:"list"`
|
|
PageNum int `json:"pageNum"`
|
|
PageSize int `json:"pageSize"`
|
|
TotalCount int64 `json:"totalCount"`
|
|
}
|
|
|
|
// CollectListQuery 收藏列表分页参数。
|
|
type CollectListQuery struct {
|
|
PageNum int
|
|
PageSize int
|
|
Type string // playlet | chapter
|
|
}
|
|
|
|
// NormalizeCollectType 归一化收藏类型。
|
|
func NormalizeCollectType(raw string) string {
|
|
switch strings.TrimSpace(strings.ToLower(raw)) {
|
|
case CollectTypeChapter, "2", "episode", "ep":
|
|
return CollectTypeChapter
|
|
default:
|
|
return CollectTypePlaylet
|
|
}
|
|
}
|
|
|
|
// Normalize 校正分页默认值。
|
|
func (q *CollectListQuery) Normalize() {
|
|
if q.PageNum <= 0 {
|
|
q.PageNum = 1
|
|
}
|
|
if q.PageSize <= 0 {
|
|
q.PageSize = defaultCollectPageSize
|
|
}
|
|
if q.PageSize > 50 {
|
|
q.PageSize = 50
|
|
}
|
|
q.Type = NormalizeCollectType(q.Type)
|
|
}
|
|
|
|
// CollectSet 设置短剧收藏/取消收藏。
|
|
func CollectSet(c *gin.Context, req PlayletCollectSetReq) (*APIEnvelope[PlayletCollectSetResp], error) {
|
|
if req.ID <= 0 {
|
|
return nil, fmt.Errorf("playlet collect invalid id")
|
|
}
|
|
var env APIEnvelope[PlayletCollectSetResp]
|
|
if _, err := upstream.PostJSON(c, collectSetPath, req, &env); err != nil {
|
|
return nil, err
|
|
}
|
|
return &env, nil
|
|
}
|
|
|
|
// FetchCollectList 拉取当前用户短剧收藏列表。
|
|
// 第二个返回值为上游业务 code(网络错误时为 0)。
|
|
func FetchCollectList(c *gin.Context, q CollectListQuery) (*PlayletCollectListResp, int, error) {
|
|
q.Normalize()
|
|
params := url.Values{}
|
|
params.Set("pageNum", strconv.Itoa(q.PageNum))
|
|
params.Set("pageSize", strconv.Itoa(q.PageSize))
|
|
|
|
var env APIEnvelope[PlayletCollectListResp]
|
|
if err := upstream.GetJSON(c, collectListPath+"?"+params.Encode(), &env); err != nil {
|
|
return nil, 0, err
|
|
}
|
|
if env.Code != 200 {
|
|
return nil, env.Code, fmt.Errorf("playlet collect list code=%d msg=%s", env.Code, env.Msg)
|
|
}
|
|
return &env.Data, env.Code, nil
|
|
}
|
|
|
|
// FetchCollectListOrEmpty 失败时返回空列表;游客会话失效时尝试重登后重试一次。
|
|
func FetchCollectListOrEmpty(c *gin.Context, q CollectListQuery) *PlayletCollectListResp {
|
|
data, code, err := FetchCollectList(c, q)
|
|
if err == nil {
|
|
if data == nil {
|
|
return &PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize}
|
|
}
|
|
return data
|
|
}
|
|
if retry, _ := authser.OnSessionExpired(c, code); retry {
|
|
data, _, err = FetchCollectList(c, q)
|
|
if err == nil {
|
|
if data == nil {
|
|
return &PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize}
|
|
}
|
|
return data
|
|
}
|
|
}
|
|
log.Error("fetch playlet collect list failed", log.E(err))
|
|
return &PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize}
|
|
}
|