|
|
|
@@ -0,0 +1,387 @@
|
|
|
|
|
package collectmod
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"91porn-server/common/constant"
|
|
|
|
|
"91porn-server/common/db"
|
|
|
|
|
"91porn-server/common/log"
|
|
|
|
|
"91porn-server/models"
|
|
|
|
|
"91porn-server/models/commod"
|
|
|
|
|
"fmt"
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var mdb *db.MongoDB
|
|
|
|
|
var maxCollectTagsSize = 30
|
|
|
|
|
|
|
|
|
|
const table = models.Collect
|
|
|
|
|
|
|
|
|
|
func coll(t *db.MongoTool) *db.MongoTool {
|
|
|
|
|
if t == nil {
|
|
|
|
|
return mdb.Coll(table)
|
|
|
|
|
}
|
|
|
|
|
return t.Coll(table)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// initCollectIndex 初始化索引
|
|
|
|
|
func initIndex() {
|
|
|
|
|
many := []mongo.IndexModel{
|
|
|
|
|
{
|
|
|
|
|
Keys: bson.D{{"uid", 1}, {"type", 1}},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Keys: bson.D{{"uid", 1}, {"type", 1}, {"objID", 1}},
|
|
|
|
|
Options: options.Index().SetUnique(true),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
Keys: bson.D{{"uniq", 1}},
|
|
|
|
|
Options: options.Index().SetUnique(true),
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
_, err := coll(nil).CreateIndex(many)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollInsertOne 插入收藏消息记录
|
|
|
|
|
func CollInsertOne(c *Collect) (err error) {
|
|
|
|
|
c.Uniq = Unique(c.UID, c.Type, c.ObjID)
|
|
|
|
|
c.CreatedAt = time.Now()
|
|
|
|
|
if _, err = coll(nil).InsertOne(c); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollInsertOne", table, "InsertOne", err))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollInsertMany 插入收藏消息记录
|
|
|
|
|
func CollInsertMany(c *[]Collect) (err error) {
|
|
|
|
|
if _, err = coll(nil).InsertMany(c); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollInsertMany", table, "InsertMany", err))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollDeleteOne 取消收藏
|
|
|
|
|
func CollDeleteOne(uid uint64, cType string, objID primitive.ObjectID) (err error) {
|
|
|
|
|
var query = bson.M{"uid": uid, "type": cType, "objID": objID}
|
|
|
|
|
if _, err = coll(nil).DeleteOne(query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollDeleteOne", table, "DeleteOne", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("cType", cType),
|
|
|
|
|
log.Any("objID", objID),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollDeleteMany 取消收藏
|
|
|
|
|
func CollDeleteMany(ids []string) (err error) {
|
|
|
|
|
var query = bson.M{"uniq": bson.M{"$in": ids}}
|
|
|
|
|
if _, err = coll(nil).DeleteMany(query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollDeleteMany", table, "DeleteMany", err),
|
|
|
|
|
log.Any("ids", ids),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindOneByUidAndObjID 获取单条收藏信息 用于验证是否已经收藏
|
|
|
|
|
func CollFindOneByUidAndObjID(uid uint64, objID primitive.ObjectID) (data Collect, err error) {
|
|
|
|
|
var query = bson.M{"uid": uid, "objID": objID}
|
|
|
|
|
if err = coll(nil).FindOne(&data, query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindOneByUidAndObjID", table, "FindOne", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("objID", objID),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindOneByUidAndObjIds 获取多条收藏信息 用于验证是否已经收藏
|
|
|
|
|
func CollFindOneByUidAndObjIds(uid uint64, objIDS []primitive.ObjectID) (data []Collect, err error) {
|
|
|
|
|
var query = bson.M{"uid": uid, "objID": bson.M{"$in": objIDS}}
|
|
|
|
|
if err = coll(nil).Find(&data, query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindOneByUidAndObjIds", table, "Find", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("objIDS", objIDS),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindCollects 获取收藏列表
|
|
|
|
|
func CollFindCollects(uid uint64, cType string, stdQuery commod.StdQuery) (data []Collect, err error) {
|
|
|
|
|
*stdQuery.Order = append(*stdQuery.Order, commod.OrderBy{Key: "createdAt", Desc: true})
|
|
|
|
|
var query = bson.M{"uid": uid, "type": cType}
|
|
|
|
|
if err = coll(nil).Find(&data, query, commod.ConvertToListQuery(stdQuery)); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindOneByUidAndObjID", table, "FindOne", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("objID", cType),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindCollectsByUIDAndObjIDs 获取包含指定对象收藏列表
|
|
|
|
|
func CollFindCollectsByUIDAndObjIDs(uid uint64, cType string, objIDs []primitive.ObjectID) (data []Collect, err error) {
|
|
|
|
|
var query = bson.M{"uid": uid, "type": cType, "objID": bson.M{"$in": objIDs}}
|
|
|
|
|
if err = coll(nil).Find(&data, query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindOneByUidAndObjID", table, "FindOne", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("objID", cType),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindCollectsByUIDAndObjId 获取包含指定对象收藏列表
|
|
|
|
|
func CollFindCollectsByUIDAndObjId(uid uint64, objId primitive.ObjectID) (data Collect, err error) {
|
|
|
|
|
var query = bson.M{"uid": uid, "objID": objId}
|
|
|
|
|
if err = coll(nil).FindOne(&data, query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindCollectsByUIDAndObjId", table, "FindOne", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
func QuickList(uid uint64, cType string, skip, limit int64) ([]Collect, int64, error) {
|
|
|
|
|
filter := bson.M{"uid": uid, "type": cType}
|
|
|
|
|
const maxLimit = 450 //iphone 11 一屏显示3项 1页3屏 1页9项 50页450项
|
|
|
|
|
opt := (&options.FindOptions{}).SetLimit(maxLimit)
|
|
|
|
|
var totalList []Collect
|
|
|
|
|
err := coll(nil).Find(&totalList, filter, opt) //取总共的数据 最多1000条
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
total := int64(len(totalList))
|
|
|
|
|
if total == 0 {
|
|
|
|
|
return []Collect{}, 0, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//内存中分页 skip + limit ∈ [0, total)
|
|
|
|
|
if skip+limit > total {
|
|
|
|
|
if skip > total {
|
|
|
|
|
return []Collect{}, 0, nil
|
|
|
|
|
}
|
|
|
|
|
limit = total - skip
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
list := make([]Collect, 0, limit)
|
|
|
|
|
for i := skip; i < skip+limit; i++ {
|
|
|
|
|
list = append(list, totalList[i])
|
|
|
|
|
}
|
|
|
|
|
return list, total, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindCountByUID 获取收藏数量
|
|
|
|
|
func CollFindCountByUID(uid uint64) (data int64, err error) {
|
|
|
|
|
data, err = coll(nil).Count(bson.M{"uid": uid})
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindCountByUID", table, "Count", err), log.Any("uid", uid))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindCountByUidAndType 更具uid/type获取标签数量
|
|
|
|
|
func CollFindCountByUidAndType(uid uint64, cType string) (data int64, err error) {
|
|
|
|
|
var query = bson.M{"uid": uid, "type": cType, "videoCount": bson.M{"$gt": 0}}
|
|
|
|
|
if data, err = coll(nil).Count(query); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindCountByUidAndType", table, "Count", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("cType", cType),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollFindCollectByTypeAndUID 我的收藏
|
|
|
|
|
func CollFindCollectByTypeAndUID(uid uint64, cType string) (cIDs []primitive.ObjectID, total int64, err error) {
|
|
|
|
|
var opt options.FindOptions
|
|
|
|
|
opt.SetSort(bson.M{"_id": -1}).SetLimit(4)
|
|
|
|
|
query := bson.M{"uid": uid, "type": cType}
|
|
|
|
|
var collects []*Collect
|
|
|
|
|
if err = coll(nil).Find(&collects, query, &opt); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindCollectByTypeAndUID", table, "Find", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("cType", cType),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
for _, v := range collects {
|
|
|
|
|
cIDs = append(cIDs, v.ObjID)
|
|
|
|
|
}
|
|
|
|
|
total, err = coll(nil).Count(query)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CollFindCollectByTypeAndUID", table, "Count", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("cType", cType),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CollIsExisted 是否收藏
|
|
|
|
|
func CollIsExisted(uid uint64, cType string, objID primitive.ObjectID) (isExists bool, err error) {
|
|
|
|
|
cnt, err := coll(nil).Count(bson.M{"uid": uid, "type": cType, "objID": objID})
|
|
|
|
|
isExists = false
|
|
|
|
|
if err != nil || cnt == 0 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
isExists = true
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从给定的uniq列表中获取收藏状态映射:uniq->Statue
|
|
|
|
|
// uniq通过uniq()获取
|
|
|
|
|
func CltStatueMap(uniqList []string) (map[string]bool, error) {
|
|
|
|
|
if len(uniqList) == 0 {
|
|
|
|
|
return make(map[string]bool), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
filter := bson.M{
|
|
|
|
|
"uniq": bson.M{"$in": uniqList},
|
|
|
|
|
}
|
|
|
|
|
existCltList := make([]Collect, 0, len(uniqList))
|
|
|
|
|
err := coll(nil).Find(&existCltList, filter)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
m := make(map[string]bool, len(existCltList))
|
|
|
|
|
//初始化
|
|
|
|
|
for _, uniq := range uniqList {
|
|
|
|
|
m[uniq] = false
|
|
|
|
|
}
|
|
|
|
|
//已经收藏的
|
|
|
|
|
for _, v := range existCltList {
|
|
|
|
|
m[v.Uniq] = true
|
|
|
|
|
}
|
|
|
|
|
return m, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsCollectVideos 是否收藏视频
|
|
|
|
|
func IsCollectVideos(uid uint64, videoIDs []primitive.ObjectID) (map[primitive.ObjectID]bool, error) {
|
|
|
|
|
m := make(map[primitive.ObjectID]bool)
|
|
|
|
|
videoIDs = uniqueVideoIDs(videoIDs)
|
|
|
|
|
if len(videoIDs) == 0 {
|
|
|
|
|
return m, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var infos []Collect
|
|
|
|
|
query := collectVideoStatusFilter(uid, videoIDs)
|
|
|
|
|
opts := options.Find().SetProjection(bson.M{"_id": 0, "objID": 1})
|
|
|
|
|
if err := coll(nil).Find(&infos, query, opts); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "IsCollectVideos", table, "Find", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("videoIDs", videoIDs),
|
|
|
|
|
)
|
|
|
|
|
return m, err
|
|
|
|
|
}
|
|
|
|
|
for _, i := range infos {
|
|
|
|
|
m[i.ObjID] = true
|
|
|
|
|
}
|
|
|
|
|
return m, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func collectVideoStatusFilter(uid uint64, videoIDs []primitive.ObjectID) bson.M {
|
|
|
|
|
return bson.M{
|
|
|
|
|
"uid": uid,
|
|
|
|
|
"type": bson.M{"$in": []string{
|
|
|
|
|
constant.CollectTypeSP,
|
|
|
|
|
constant.CollectTypeShort,
|
|
|
|
|
constant.CollectTypeCover,
|
|
|
|
|
constant.CollectTypePIC,
|
|
|
|
|
constant.CollectTypeSEED_LINK,
|
|
|
|
|
constant.CollectTypeAiPlaza,
|
|
|
|
|
}},
|
|
|
|
|
"objID": bson.M{"$in": videoIDs},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func uniqueVideoIDs(ids []primitive.ObjectID) []primitive.ObjectID {
|
|
|
|
|
if len(ids) < 2 {
|
|
|
|
|
return ids
|
|
|
|
|
}
|
|
|
|
|
seen := make(map[primitive.ObjectID]struct{}, len(ids))
|
|
|
|
|
unique := make([]primitive.ObjectID, 0, len(ids))
|
|
|
|
|
for _, id := range ids {
|
|
|
|
|
if _, ok := seen[id]; ok {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
seen[id] = struct{}{}
|
|
|
|
|
unique = append(unique, id)
|
|
|
|
|
}
|
|
|
|
|
return unique
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetLocsCollectCnt2Map 获取位置的收藏数
|
|
|
|
|
func GetLocsCollectCnt2Map(locIDs []primitive.ObjectID) (map[primitive.ObjectID]int, error) {
|
|
|
|
|
if locIDs == nil {
|
|
|
|
|
locIDs = []primitive.ObjectID{}
|
|
|
|
|
}
|
|
|
|
|
m := make(map[primitive.ObjectID]int)
|
|
|
|
|
var data []CityCount
|
|
|
|
|
p := []bson.M{
|
|
|
|
|
{"$match": bson.M{"type": constant.CollectTypeLocation, "objID": bson.M{"$in": locIDs}}},
|
|
|
|
|
{"$group": bson.M{"_id": "$objID", "count": bson.M{"$sum": 1}}},
|
|
|
|
|
}
|
|
|
|
|
if err := coll(nil).Aggregate(&data, p); err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetLocsCollectCnt2Map", table, "Aggregate", err), log.Any("locIDs", locIDs))
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
for _, d := range data {
|
|
|
|
|
m[d.ID] = d.Count
|
|
|
|
|
}
|
|
|
|
|
return m, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MyCollectTags 获取收藏标签
|
|
|
|
|
func MyCollectTags(uid uint64, top int) ([]primitive.ObjectID, error) {
|
|
|
|
|
var ids []primitive.ObjectID
|
|
|
|
|
stdQuery := commod.StdQuery{Page: &commod.PageBy{Num: 1, Size: uint64(top)}, Order: &[]commod.OrderBy{}}
|
|
|
|
|
data, err := CollFindCollects(uid, constant.CollectTypeTag, stdQuery)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return ids, nil
|
|
|
|
|
}
|
|
|
|
|
for _, d := range data {
|
|
|
|
|
ids = append(ids, d.ObjID)
|
|
|
|
|
}
|
|
|
|
|
return ids, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据标签id获取收藏列表
|
|
|
|
|
func GetCollectTagList(uid uint64, tagsID []primitive.ObjectID) (data []Collect, err error) {
|
|
|
|
|
if tagsID == nil || uid == 0 {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var query = bson.M{
|
|
|
|
|
"uid": uid,
|
|
|
|
|
"type": constant.CollectTypeTag,
|
|
|
|
|
"objID": bson.M{"$in": tagsID},
|
|
|
|
|
}
|
|
|
|
|
err = coll(nil).Find(&data, query)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetCollectTagList", table, "Find", err),
|
|
|
|
|
log.Any("uid", uid),
|
|
|
|
|
log.Any("tagsID", tagsID),
|
|
|
|
|
)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|