@@ -0,0 +1,262 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user