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