263 lines
7.2 KiB
Go
263 lines
7.2 KiB
Go
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
|
|
}
|