Files
web_huakui_server/app/service/playletcache/guess_like.go
T
rootandClaude Opus 4.7 85c0071fd8 feat: 从黄果 NET hgdjnet-server 9bfbafe 导入 HKDJ 官网后端
来源:hgdjnet-server 9bfbafe10d417deea959bd53117bc88a10e60a83
项目身份 HKDJ / JHA-216,独立官网仓库,Jenkins 守卫键 hkdjnet
测试目录 /server/hkdj_net,App/Web API 30331/30332

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-16 11:20:04 +08:00

102 lines
3.2 KiB
Go

package playletcache
import (
"context"
"hkdj-web-server/pub/common/log"
"hkdj-web-server/pub/models/playletmod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
const GuessLikeLimit = 15
var guessLikeProjection = bson.D{
{Key: playletmod.FN.Playlet.Id, Value: 1},
{Key: playletmod.FN.Playlet.Status, Value: 1},
{Key: playletmod.FN.Playlet.IsFeatured, Value: 1},
{Key: playletmod.FN.Playlet.IsRecommend, Value: 1},
{Key: playletmod.FN.Playlet.ShowOnBanner, Value: 1},
{Key: playletmod.FN.Playlet.Banner, Value: 1},
{Key: playletmod.FN.Playlet.OnlineAt, Value: 1},
{Key: playletmod.FN.Playlet.MediaCreatedAt, Value: 1},
{Key: playletmod.FN.Playlet.MediaUpdatedAt, Value: 1},
{Key: playletmod.FN.Playlet.ThemeIds, Value: 1},
{Key: playletmod.FN.Playlet.Title, Value: 1},
{Key: playletmod.FN.Playlet.PlayName, Value: 1},
{Key: playletmod.FN.Playlet.Description, Value: 1},
{Key: playletmod.FN.Playlet.Slug, Value: 1},
{Key: playletmod.FN.Playlet.Desc, Value: 1},
{Key: playletmod.FN.Playlet.Anchor, Value: 1},
{Key: playletmod.FN.Playlet.Cover, Value: 1},
{Key: playletmod.FN.Playlet.CompressedCover, Value: 1},
{Key: playletmod.FN.Playlet.TagIds, Value: 1},
{Key: playletmod.FN.Playlet.TotalEpisode, Value: 1},
{Key: playletmod.FN.Playlet.UpdateStatus, Value: 1},
{Key: playletmod.FN.Playlet.CountBrowse, Value: 1},
{Key: playletmod.FN.Playlet.HeatValue, Value: 1},
{Key: playletmod.FN.Playlet.CountCollect, Value: 1},
{Key: playletmod.FN.Playlet.CountLike, Value: 1},
{Key: playletmod.FN.Playlet.VirtualCountLike, Value: 1},
{Key: playletmod.FN.Playlet.IsOriginal, Value: 1},
{Key: playletmod.FN.Playlet.OperateType, Value: 1},
{Key: playletmod.FN.Playlet.CreatedAt, Value: 1},
{Key: playletmod.FN.Playlet.UpdatedAt, Value: 1},
{Key: "seoInfo", Value: 1},
}
func updateGuessLikeCache(ctx context.Context) {
list, err := playletmod.FindManyPlaylet(ctx, bson.M{
playletmod.FN.Playlet.Status: playletmod.StatusUp,
}, options.Find().
SetProjection(guessLikeProjection).
SetSort(bson.D{
{Key: playletmod.FN.Playlet.CountCollect, Value: -1},
{Key: playletmod.FN.Playlet.Id, Value: -1},
}).
SetLimit(GuessLikeLimit))
if err != nil {
log.Warn("playletcache.updateGuessLikeCache failed", log.E(err))
return
}
temp := make([]*playletmod.Playlet, 0, len(list))
for _, item := range list {
if cloned := clonePlaylet(item); cloned != nil {
temp = append(temp, cloned)
}
}
cache.lock.Lock()
cache.guessLike = temp
cache.lock.Unlock()
}
// ListGuessLike 返回收藏量最多的上架短剧,最多15部。
func ListGuessLike() []*playletmod.Playlet {
cache.lock.RLock()
defer cache.lock.RUnlock()
if len(cache.guessLike) == 0 {
return make([]*playletmod.Playlet, 0)
}
result := make([]*playletmod.Playlet, 0, len(cache.guessLike))
for _, item := range cache.guessLike {
if cloned := clonePlaylet(item); cloned != nil {
result = append(result, cloned)
}
}
return result
}
func clonePlaylet(item *playletmod.Playlet) *playletmod.Playlet {
if item == nil || item.Id <= 0 {
return nil
}
cp := *item
if item.ThemeIds != nil {
cp.ThemeIds = append([]int64(nil), item.ThemeIds...)
}
if item.TagIds != nil {
cp.TagIds = append([]int64(nil), item.TagIds...)
}
return &cp
}