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...) } if item.CategoryIds != nil { cp.CategoryIds = append([]int64(nil), item.CategoryIds...) } return &cp }