package vidmod import ( "strconv" "91porn-server/common/timeutil/timerange" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" ) func (receiver *AppListReq) LatestFilter() (primitive.M, error) { // 时间对齐5分钟 recentMinute := timerange.RecentMinute(receiver.Time, 5) // 视频帖子并且已通过审核 filter := bson.M{ "newsType": "SP", "status": 1, "reviewAt": bson.M{"$lte": recentMinute}, } if receiver.Tag != "" { tagID, err := primitive.ObjectIDFromHex(receiver.Tag) if err != nil { return nil, err } filter["tags"] = bson.M{"$elemMatch": bson.M{"$eq": tagID}} } if receiver.PaymentType == PaymentVIP { filter["coins"] = 0 } else if receiver.PaymentType == PaymentGold { filter["coins"] = bson.M{"$gt": 0} } if receiver.Type == LongVideo { filter["playTime"] = bson.M{"$gte": 600} } else if receiver.Type == ShortVideo { filter["playTime"] = bson.M{"$lt": 600} } return filter, nil } // MostLikedFilter 点赞最多搜索条件 func (receiver AppListReq) MostLikedFilter() (primitive.M, error) { // 视频帖子并且已通过审核 filter := bson.M{ "newsType": "SP", "status": 1, } if receiver.Tag != "" { tagID, err := primitive.ObjectIDFromHex(receiver.Tag) if err != nil { return nil, err } filter["tags"] = bson.M{"$elemMatch": bson.M{"$eq": tagID}} } if receiver.PaymentType == PaymentVIP { filter["coins"] = 0 } else if receiver.PaymentType == PaymentGold { filter["coins"] = bson.M{"$gt": 0} } if receiver.Type == LongVideo { filter["playTime"] = bson.M{"$gte": 600} } else if receiver.Type == ShortVideo { filter["playTime"] = bson.M{"$lt": 600} } return filter, nil } // MostPlayFilter 播放最多搜索条件 func (receiver *AppListReq) MostPlayFilter() (primitive.M, error) { // 视频帖子并且已通过审核 filter := bson.M{ "newsType": "SP", "status": 1, } if receiver.Tag != "" { tagID, err := primitive.ObjectIDFromHex(receiver.Tag) if err != nil { return nil, err } filter["tags"] = bson.M{"$elemMatch": bson.M{"$eq": tagID}} } if receiver.PaymentType == PaymentVIP { filter["coins"] = 0 } else if receiver.PaymentType == PaymentGold { filter["coins"] = bson.M{"$gt": 0} } if receiver.Type == LongVideo { filter["playTime"] = bson.M{"$gte": 600} } else if receiver.Type == ShortVideo { filter["playTime"] = bson.M{"$lt": 600} } return filter, nil } func (receiver *AppListReq) HappinessPlazaFilter() (primitive.M, error) { // 时间对齐5分钟 recentMinute := timerange.RecentMinute(receiver.Time, 5) // 视频帖子并且已通过审核 filter := bson.M{ "newsType": "COVER", "status": 1, "reviewAt": bson.M{"$lte": recentMinute}, } return filter, nil } func (receiver *AppListReq) Filter(uid uint64) (primitive.M, error) { // 视频帖子并且已通过审核 filter := bson.M{ "newsType": SP, "status": 1, } if receiver.Tag != "" { tagID, err := primitive.ObjectIDFromHex(receiver.Tag) if err != nil { return nil, err } filter["tags"] = tagID // bson.M{"$elemMatch": bson.M{"$eq": tagID}} } if receiver.PaymentType == PaymentVIP { filter["coins"] = 0 } else if receiver.PaymentType == PaymentGold { filter["coins"] = bson.M{"$gt": 0} } switch receiver.Type { case LongVideo: filter["playTime"] = bson.M{"$gte": 600} case ShortVideo: filter["playTime"] = bson.M{"$lt": 600} case Image: filter["newsType"] = COVER } // 时间对齐5分钟 recentMinute := timerange.RecentMinute(receiver.Time, 5) switch receiver.Model { case LatestZone: filter["reviewAt"] = bson.M{"$lte": recentMinute} case HappinessPlaza: filter["reviewAt"] = bson.M{"$lte": recentMinute} case MyImage: if receiver.UID != 0 { filter["publisherID"] = receiver.UID } else { filter["publisherID"] = uid delete(filter, "status") } } return filter, nil } // Options 分页及排序处理 func (receiver *AppListReq) Options() *options.FindOptions { opts := options.Find() //如果是幸福广场,不进行分页 if receiver.Model != HappinessPlaza { //否则进行分页 opts.SetSkip(int64((receiver.PageNumber - 1) * receiver.PageSize)).SetLimit(int64(receiver.PageSize + 1)) } var sort bson.D if receiver.FilterType == 1 { sort = bson.D{{Key: "recoWeigh", Value: -1}} opts.SetSort(sort) } else if receiver.FilterType == 2 { sort = bson.D{{Key: "createdAt", Value: -1}} opts.SetSort(sort) } switch receiver.Model { case LatestZone: opts.SetSort(mergeSort(sort, bson.D{{Key: "reviewAt", Value: -1}})) case HottestZone: opts.SetSort(mergeSort(sort, bson.D{{Key: "hot", Value: -1}, {Key: "reviewAt", Value: -1}})) case MostLiked: opts.SetSort(mergeSort(sort, bson.D{{Key: "likeCount", Value: -1}, {Key: "reviewAt", Value: -1}})) case MostPlay: opts.SetSort(mergeSort(sort, bson.D{{Key: "playCount", Value: -1}, {Key: "reviewAt", Value: -1}})) case MyImage: opts.SetSort(mergeSort(sort, bson.D{{Key: "createdAt", Value: -1}})) case HappinessPlaza: //opts.SetSort(bson.D{{"happinessPlazaTop", -1}, {"reviewAt", -1}}) opts.SetSort(mergeSort(sort, bson.D{{Key: "reviewAt", Value: -1}})) //统一默认按照审核时间排序 } return opts } func mergeSort(m bson.D, mm bson.D) bson.D { if len(m) == 0 { return mm } if len(mm) == 0 { return m } for _, vv := range mm { for _, v := range m { if v.Key == vv.Key { continue } } m = append(m, vv) } return m } // RedisKey 获取redis缓存key func (receiver *AppListReq) RedisKey(uid uint64) string { redisKey := "appListReqCache:status:1" if receiver.Type == Image { redisKey += ":newsType:" + COVER } else { redisKey += ":newsType:" + SP } if receiver.Tag != "" { tagID, err := primitive.ObjectIDFromHex(receiver.Tag) if err != nil { return "" } redisKey += ":tags:" + tagID.Hex() } if receiver.PaymentType == PaymentVIP { redisKey += ":coins:0" } else if receiver.PaymentType == PaymentGold { redisKey += ":coins:gt0" } if receiver.Type == LongVideo { redisKey += ":playTime:gte600" } if receiver.Type == ShortVideo { redisKey += ":playTime:lt600" } // 时间对齐5分钟 recentMinute := timerange.RecentMinute(receiver.Time, 5) switch receiver.Model { case LatestZone: redisKey += ":reviewAt:lte" + recentMinute.Format("200601021504") case HappinessPlaza: redisKey += ":reviewAt:lte" + recentMinute.Format("200601021504") case MyImage: if receiver.UID != 0 { redisKey += ":publisherID:" + strconv.FormatUint(receiver.UID, 10) } else { redisKey += ":publisherID:" + strconv.FormatUint(receiver.UID, 10) redisKey += ":status:delete" } } if receiver.Model != HappinessPlaza { //分页信息 redisKey += ":skip:" + strconv.FormatUint((receiver.PageNumber-1)*receiver.PageSize, 10) + ":limit:" + strconv.FormatUint((receiver.PageSize+1), 10) } switch receiver.Model { case LatestZone: redisKey += ":reviewAt:-1" case HottestZone: redisKey += ":hot:-1:reviewAt:-1" case MostLiked: redisKey += ":likeCount:-1:reviewAt:-1" case MostPlay: redisKey += ":playCount:-1:reviewAt:-1" case MyImage: redisKey += ":createdAt:-1" case HappinessPlaza: redisKey += ":reviewAt:-1" } redisKey += ":filterType:" + strconv.FormatInt(int64(receiver.FilterType), 10) return redisKey }