252 lines
7.5 KiB
Go
252 lines
7.5 KiB
Go
package commentser
|
|
|
|
import (
|
|
"91porn-server/common"
|
|
"91porn-server/common/log"
|
|
"91porn-server/common/stderr"
|
|
"91porn-server/models/cache/quicksearchdata"
|
|
"91porn-server/models/commod"
|
|
"91porn-server/models/v/cmtmod"
|
|
"91porn-server/models/v/mediamod"
|
|
"91porn-server/models/v/usermod"
|
|
"91porn-server/models/v/vidmod"
|
|
"fmt"
|
|
"math/rand"
|
|
"sync"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
// GetParentCmtList 获取父评论列表
|
|
func GetParentCmtList(uid uint64, objID ObjectID, objType cmtmod.OType, curTime time.Time, page commod.Page) (code stderr.Code, data []cmtmod.ParentRespList, hasNext bool, err error) {
|
|
user, err := usermod.FindUserByUID(uid)
|
|
if err != nil {
|
|
code = stderr.ErrDbQueryError
|
|
return
|
|
}
|
|
if user == nil || user.ID.IsZero() || user.HasBanned || user.HasLocked {
|
|
code = stderr.UserIsNotExists
|
|
return
|
|
}
|
|
var publisherID uint64
|
|
if objType == cmtmod.OTypeCartoon || objType == cmtmod.OTypeDrama {
|
|
media, mediaErr := mediamod.GetInfo(objID)
|
|
if mediaErr != nil || media.ID.IsZero() || media.Status != 1 || media.IsDelete ||
|
|
(objType == cmtmod.OTypeDrama && media.MediaType != mediamod.MediaTypeDrama) {
|
|
code = stderr.CommentErrGetDataFail
|
|
err = mediaErr
|
|
return
|
|
}
|
|
} else {
|
|
// 获取视频作者
|
|
videoInfo, videoErr := vidmod.GetVideoInfo(objID.Hex())
|
|
if videoErr != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
err = videoErr
|
|
return
|
|
}
|
|
publisherID = videoInfo.PublisherID
|
|
}
|
|
skip, limit := getNewPageInfo(0, int64(page.PageNumber), int64(page.PageSize))
|
|
var (
|
|
isGodList = make([]cmtmod.Comment, 0)
|
|
aList = make([]cmtmod.Comment, 0)
|
|
hLikeList = make([]cmtmod.Comment, 0)
|
|
hReplyList = make([]cmtmod.Comment, 0)
|
|
)
|
|
wg := sync.WaitGroup{}
|
|
wg.Add(3)
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
// 获神评论
|
|
isGodList, err = getIsGodCommentParentCmtList(user.IsAdvertiser, objID, curTime)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return
|
|
}
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
// 获取作者的评论
|
|
aList, err = getAuthorParentCmtList(user.IsAdvertiser, objID, publisherID, curTime)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return
|
|
}
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
// 获取热门评论(回复数)
|
|
hReplyList, err = getHotReplyParentCmeList(user.UID, user.IsAdvertiser, objID, 0, 3, curTime)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return
|
|
}
|
|
noIds := []primitive.ObjectID{}
|
|
for _, v := range hReplyList {
|
|
noIds = append(noIds, v.ID)
|
|
}
|
|
// 获取热门评论(点赞数)
|
|
hLikeList, err = getHotParentCmeList(user.UID, user.IsAdvertiser, noIds, objID, 0, 5, curTime)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return
|
|
}
|
|
})
|
|
|
|
wg.Wait()
|
|
aList = append(isGodList, aList...) // 神评论+作者评论
|
|
aList = append(aList, hLikeList...)
|
|
aList = append(aList, hReplyList...)
|
|
var mList []cmtmod.Comment
|
|
if len(aList) > int(page.PageNumber*page.PageSize) {
|
|
mList = aList[skip : skip+limit]
|
|
} else if len(aList) > int((page.PageNumber-1)*page.PageSize) && len(aList) < int(page.PageNumber*page.PageSize) {
|
|
mList = aList[skip:]
|
|
}
|
|
var aIds []ObjectID // 作者+热评的id
|
|
for _, v := range aList {
|
|
aIds = append(aIds, v.ID)
|
|
}
|
|
if aIds == nil {
|
|
aIds = []ObjectID{}
|
|
}
|
|
if len(mList) <= int(page.PageSize) {
|
|
skip, limit = getNewPageInfo(int64(len(aList)), int64(page.PageNumber), int64(page.PageSize))
|
|
//获取普通评论
|
|
cList, err := getParentCmtList(user.IsAdvertiser, objID, aIds, skip, limit, curTime)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return code, data, false, err
|
|
}
|
|
mList = append(mList, cList...)
|
|
}
|
|
list, err := getParentCommentTackInfo(uid, mList)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return
|
|
}
|
|
var ids []ObjectID
|
|
for _, v := range mList {
|
|
ids = append(ids, v.ID)
|
|
}
|
|
// 获取首条子评论
|
|
data, err = getFstChildCmtOfParent(user.IsAdvertiser, objID, list, ids, uid, publisherID, curTime)
|
|
if err != nil {
|
|
code = stderr.CommentErrGetDataFail
|
|
return
|
|
}
|
|
if len(data) > int(page.PageSize) {
|
|
hasNext = true
|
|
data = data[:page.PageSize]
|
|
}
|
|
code = stderr.Success
|
|
return
|
|
}
|
|
|
|
func QuickSearch(objID string, data []cmtmod.ParentRespList) []cmtmod.ParentRespList {
|
|
//获取置顶评论,走缓存
|
|
quickSearches, err := quicksearchdata.GetAllFromCache(bson.M{"enabled": true, "type": 1})
|
|
if err != nil {
|
|
return data
|
|
}
|
|
count := len(quickSearches)
|
|
if count > 0 {
|
|
var (
|
|
info = make([]cmtmod.ChildRespList, 0)
|
|
s = rand.Intn(count)
|
|
q = quickSearches[s]
|
|
)
|
|
cmts := []cmtmod.ParentRespList{
|
|
cmtmod.ParentRespList{
|
|
Info: info,
|
|
ID: q.ID.Hex(),
|
|
ObjID: objID,
|
|
UserID: 100001,
|
|
UserName: "91PORN运营",
|
|
UserPortrait: "cf230705/image/cg/227/fg/1bw/a86065d7ab4cbb11ebbebaefc0ee4444.png",
|
|
Content: q.Title,
|
|
LinkStr: q.Link,
|
|
LinkType: q.LinkType,
|
|
SearchKeyword: q.SearchKeyword,
|
|
Level: 1,
|
|
Status: 1,
|
|
City: "香港",
|
|
CreatedAt: time.Now(),
|
|
}}
|
|
user, err := usermod.FindUserByUID(100001)
|
|
if err == nil && user != nil {
|
|
cmts[0].UserName = user.Name
|
|
cmts[0].UserPortrait = user.Portrait
|
|
}
|
|
data = append(cmts, data...)
|
|
}
|
|
return data
|
|
}
|
|
|
|
// 获取作者的父评论及其数量
|
|
func getAuthorParentCmtList(isAdvertiser bool, objID ObjectID, author uint64, curTime time.Time) (data []cmtmod.Comment, err error) {
|
|
return cmtmod.GetAuthorParentCmt(isAdvertiser, objID, author, curTime)
|
|
}
|
|
|
|
// 获取神评论及其数量
|
|
func getIsGodCommentParentCmtList(isAdvertiser bool, objID ObjectID, curTime time.Time) (data []cmtmod.Comment, err error) {
|
|
return cmtmod.GetIsGodCommentParentCmt(isAdvertiser, objID, curTime)
|
|
}
|
|
|
|
// 获取热门评论(点赞数)
|
|
func getHotParentCmeList(uid uint64, isAdvertiser bool, noIds []primitive.ObjectID, objID ObjectID, skip int64, limit int64, cutTime time.Time) (data []cmtmod.Comment, err error) {
|
|
return cmtmod.GetHotParentCmtList(uid, isAdvertiser, noIds, objID, skip, limit, cutTime)
|
|
}
|
|
|
|
// 获取热门评论(回复数)
|
|
func getHotReplyParentCmeList(uid uint64, isAdvertiser bool, objID ObjectID, skip int64, limit int64, cutTime time.Time) (data []cmtmod.Comment, err error) {
|
|
return cmtmod.GetHotReplyParentCmtList(uid, isAdvertiser, objID, skip, limit, cutTime)
|
|
}
|
|
|
|
// 获取其余评论
|
|
func getParentCmtList(isAdvertiser bool, objID ObjectID, ids []ObjectID, skip int64, limit int64, cutTime time.Time) (data []cmtmod.Comment, err error) {
|
|
// 获取作者+热评
|
|
return cmtmod.GetParentCmtList(isAdvertiser, objID, ids, skip, limit, cutTime)
|
|
}
|
|
|
|
// GetMyCmtList 获取我的评论列表
|
|
func GetMyCmtList(uid uint64, page commod.Page) (list []cmtmod.MyCmt, hasNext bool, err error) {
|
|
skip := int64(page.Skip())
|
|
list, hasNext, err = cmtmod.GetMyCmtList(uid, skip, int64(page.PageSize))
|
|
if err != nil {
|
|
log.Error(fmt.Sprintf("cmtmod.GetMyCmtList err:%v", err))
|
|
return
|
|
}
|
|
if len(list) == 0 {
|
|
list = []cmtmod.MyCmt{}
|
|
return
|
|
}
|
|
vids := []primitive.ObjectID{}
|
|
for _, v := range list {
|
|
vids = append(vids, v.ObjID)
|
|
}
|
|
vidList, err := vidmod.GetVideoListByIDsNoStatus(vids)
|
|
if err != nil {
|
|
log.Error(fmt.Sprintf("vidmod.GetVideoListByIDsNoStatus err:%v", err))
|
|
return
|
|
}
|
|
videoMap := make(map[primitive.ObjectID]*vidmod.VideoModel)
|
|
for _, v := range vidList {
|
|
videoMap[v.ID] = v
|
|
}
|
|
for i, v := range list {
|
|
// 从map中取出video对象
|
|
vid, ok := videoMap[v.ObjID]
|
|
if !ok {
|
|
continue
|
|
}
|
|
v.VidTitle = vid.Title
|
|
v.VidCover = vid.Cover
|
|
list[i] = v
|
|
}
|
|
return
|
|
}
|