Files
web_huangguo2_server/app/service/playletcache/guess_like.go
T
2026-09-29 10:47:38 +08:00

102 lines
3.2 KiB
Go

package playletcache
import (
"context"
"videoweb/pub/common/log"
"videoweb/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
}