80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package playletser
|
||
|
||
import (
|
||
"fmt"
|
||
"net/url"
|
||
"strconv"
|
||
"videoweb/app/service/upstream"
|
||
"videoweb/pub/common/log"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
const (
|
||
rankPath = "/api/app/playlet/rank"
|
||
|
||
defaultRankPageSize = 30
|
||
|
||
// 排行榜 sortOrder:1-热播榜,2-新剧榜,3-追剧榜
|
||
rankSortHot = 1
|
||
rankSortNew = 2
|
||
rankSortBinge = 3
|
||
)
|
||
|
||
// RankQuery 排行榜查询参数。
|
||
type RankQuery struct {
|
||
PageNum int
|
||
PageSize int
|
||
SortOrder int
|
||
}
|
||
|
||
// Normalize 校正分页与榜单类型。
|
||
func (q *RankQuery) Normalize() {
|
||
if q.PageNum <= 0 {
|
||
q.PageNum = 1
|
||
}
|
||
if q.PageSize <= 0 {
|
||
q.PageSize = defaultRankPageSize
|
||
}
|
||
if q.PageSize > 50 {
|
||
q.PageSize = 50
|
||
}
|
||
switch q.SortOrder {
|
||
case rankSortNew, rankSortBinge:
|
||
default:
|
||
q.SortOrder = rankSortHot
|
||
}
|
||
}
|
||
|
||
// FetchRank 分页查询短剧排行榜。
|
||
func FetchRank(c *gin.Context, q RankQuery) (*PlayletVideoResp, error) {
|
||
q.Normalize()
|
||
params := url.Values{}
|
||
params.Set("pageNum", strconv.Itoa(q.PageNum))
|
||
params.Set("pageSize", strconv.Itoa(q.PageSize))
|
||
params.Set("sortOrder", strconv.Itoa(q.SortOrder))
|
||
|
||
var env APIEnvelope[PlayletVideoResp]
|
||
if err := upstream.GetPublicJSON(c, rankPath+"?"+params.Encode(), &env); err != nil {
|
||
return nil, err
|
||
}
|
||
if env.Code != 200 {
|
||
return nil, fmt.Errorf("playlet rank code=%d msg=%s", env.Code, env.Msg)
|
||
}
|
||
return &env.Data, nil
|
||
}
|
||
|
||
// FetchRankOrEmpty 失败时返回空榜单。
|
||
func FetchRankOrEmpty(c *gin.Context, q RankQuery) *PlayletVideoResp {
|
||
data, err := FetchRank(c, q)
|
||
if err != nil {
|
||
log.Error("fetch playlet rank failed", log.E(err))
|
||
return &PlayletVideoResp{PageNum: q.PageNum, PageSize: q.PageSize}
|
||
}
|
||
if data == nil {
|
||
return &PlayletVideoResp{PageNum: q.PageNum, PageSize: q.PageSize}
|
||
}
|
||
data.SeoInfo.Normalize()
|
||
return data
|
||
}
|