329 lines
7.8 KiB
Go
329 lines
7.8 KiB
Go
package commentser
|
|
|
|
import (
|
|
"91porn-server/app/service/userser"
|
|
"91porn-server/common"
|
|
"91porn-server/common/constant"
|
|
"91porn-server/models/v/cmtmod"
|
|
"91porn-server/models/v/followmod"
|
|
"91porn-server/models/v/likemod"
|
|
"91porn-server/models/v/usermod"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type ObjectID = primitive.ObjectID
|
|
|
|
// 获取父评论的附加信息--用户头像/是否点赞/是否是关注
|
|
func getParentCommentTackInfo(uid uint64, cModList []cmtmod.Comment) (data []cmtmod.ParentRespList, err error) {
|
|
now := time.Now()
|
|
if cModList == nil {
|
|
return []cmtmod.ParentRespList{}, err
|
|
}
|
|
var CIDs []ObjectID
|
|
var UIDs []uint64
|
|
for _, value := range cModList {
|
|
if uid != value.UserID && value.IsAdvertiser {
|
|
continue
|
|
}
|
|
tmp := cmtmod.ParentRespList{
|
|
ID: value.ID.Hex(),
|
|
ObjID: value.ObjID.Hex(),
|
|
UserID: value.UserID,
|
|
LikeCount: value.LikeCount,
|
|
LinkStr: value.LinkStr,
|
|
IsFollow: false,
|
|
IsAuthor: value.IsAuthor,
|
|
IsLike: false,
|
|
IsDelete: value.IsDelete,
|
|
IsGodComment: value.IsGodComment,
|
|
CommCount: value.CommentCount,
|
|
CommCountBurden: value.CommentCount,
|
|
Content: value.Content,
|
|
Image: value.Image,
|
|
Status: value.Status,
|
|
City: value.City,
|
|
QuoteType: value.QuoteType,
|
|
QuoteID: value.QuoteID,
|
|
QuoteTitle: value.QuoteTitle,
|
|
QuoteImg: value.QuoteImg,
|
|
CreatedAt: value.CreatedAt,
|
|
Info: []cmtmod.ChildRespList{}, // 空值处理
|
|
}
|
|
CIDs = append(CIDs, value.ID)
|
|
UIDs = append(UIDs, value.UserID)
|
|
data = append(data, tmp)
|
|
}
|
|
var wg = sync.WaitGroup{}
|
|
var errs []error
|
|
wg.Add(3)
|
|
// 获取点赞记录信息
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
likedList, err1 := likemod.FindLikesByObjIDS(constant.LikeTypeComment, uid, CIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
for k, v := range data {
|
|
for _, ls := range likedList {
|
|
if v.ID == ls.ObjID.Hex() {
|
|
data[k].IsLike = true
|
|
break
|
|
}
|
|
}
|
|
}
|
|
})
|
|
// 获取用户昵称/性别/头像地址
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
users, err1 := usermod.FindUsersByUID(UIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
|
|
for k, v := range data {
|
|
for _, u := range users {
|
|
if v.UserID == u.UID {
|
|
data[k].UserName = u.Name
|
|
data[k].UserPortrait = u.Portrait
|
|
data[k].Gender = u.Gender
|
|
data[k].Age = u.Age()
|
|
data[k].Level = u.VipLevel
|
|
data[k].VipLevel = u.VipLevel
|
|
data[k].SuperUser = u.GetSuperUser(now)
|
|
data[k].Awards = u.Awards
|
|
data[k].AwardsExpire = userser.HandleUserAwardsExpire(u)
|
|
data[k].VipExpireDate = u.VipExpireDate
|
|
break
|
|
}
|
|
}
|
|
}
|
|
})
|
|
// 是否关注
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
fMap, err1 := followmod.IsFollowUsers(uid, UIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
for k, v := range data {
|
|
if fMap[v.UserID] {
|
|
data[k].IsFollow = true
|
|
} else {
|
|
data[k].IsFollow = false
|
|
}
|
|
}
|
|
})
|
|
wg.Wait()
|
|
if len(errs) > 0 {
|
|
err = errs[0]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取父评论的作者或者热门的首条子评论
|
|
func getFstChildCmtOfParent(isAdvertiser bool, objID ObjectID, list []cmtmod.ParentRespList, ids []ObjectID, uid uint64, author uint64, curTime time.Time) (data []cmtmod.ParentRespList, err error) {
|
|
if list == nil || ids == nil {
|
|
return
|
|
}
|
|
// 先获取作者的子评论
|
|
aList, err := cmtmod.GetFstAuthorCmtOfParentCmt(isAdvertiser, objID, ids, author, curTime)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var cmtMap = make(map[ObjectID]*cmtmod.Comment)
|
|
for _, v := range aList {
|
|
_v := v
|
|
cmtMap[v.CID] = &_v
|
|
}
|
|
// 获取其余的子评论
|
|
cList, err := cmtmod.GetFstCmtOfParentCmt(isAdvertiser, objID, ids, curTime)
|
|
for _, v := range cList {
|
|
_v := v
|
|
if cmtMap[v.CID] == nil {
|
|
cmtMap[v.CID] = &_v
|
|
}
|
|
}
|
|
var childList []cmtmod.Comment
|
|
for _, v := range cmtMap {
|
|
childList = append(childList, *v)
|
|
}
|
|
cResList, err := getChildCommentTackInfo(uid, childList)
|
|
var childMap = make(map[string]*cmtmod.ChildRespList)
|
|
for _, v := range cResList {
|
|
_v := v
|
|
childMap[v.CID] = &_v
|
|
}
|
|
for _, v := range list {
|
|
if childMap[v.ID] != nil {
|
|
v.Info = []cmtmod.ChildRespList{*childMap[v.ID]}
|
|
data = append(data, v)
|
|
} else {
|
|
data = append(data, v)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// 获取子评论的附加信息--用户头像/是否点赞/是否是关注
|
|
func getChildCommentTackInfo(uid uint64, cModList []cmtmod.Comment) (data []cmtmod.ChildRespList, err error) {
|
|
now := time.Now()
|
|
if len(cModList) == 0 {
|
|
return
|
|
}
|
|
var CIDs []ObjectID
|
|
var UIDs []uint64
|
|
var toUIDs []uint64
|
|
|
|
for _, value := range cModList {
|
|
if uid != value.UserID && value.IsAdvertiser {
|
|
continue
|
|
}
|
|
tmp := cmtmod.ChildRespList{
|
|
ID: value.ID.Hex(),
|
|
ObjID: value.ObjID.Hex(),
|
|
CID: value.CID.Hex(),
|
|
UserID: value.UserID,
|
|
ToUserID: value.ToUserID,
|
|
LikeCount: value.LikeCount,
|
|
LinkStr: value.LinkStr,
|
|
Level: value.Level,
|
|
IsFollow: false,
|
|
IsAuthor: value.IsAuthor,
|
|
IsLike: false,
|
|
IsDelete: value.IsDelete,
|
|
Content: value.Content,
|
|
Image: value.Image,
|
|
Status: value.Status,
|
|
City: value.City,
|
|
QuoteType: value.QuoteType,
|
|
QuoteID: value.QuoteID,
|
|
QuoteTitle: value.QuoteTitle,
|
|
QuoteImg: value.QuoteImg,
|
|
CreatedAt: value.CreatedAt,
|
|
}
|
|
CIDs = append(CIDs, value.ID)
|
|
UIDs = append(UIDs, value.UserID)
|
|
data = append(data, tmp)
|
|
if value.ToUserID != 0 {
|
|
toUIDs = append(UIDs, value.ToUserID)
|
|
}
|
|
}
|
|
var wg = sync.WaitGroup{}
|
|
var errs []error
|
|
wg.Add(4)
|
|
// 是否点赞
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
likedList, err1 := likemod.FindLikesByObjIDS(constant.LikeTypeComment, uid, CIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
for k, v := range data {
|
|
for _, ls := range likedList {
|
|
if v.ID == ls.ObjID.Hex() {
|
|
data[k].IsLike = true
|
|
break
|
|
}
|
|
}
|
|
}
|
|
})
|
|
// 获取用户昵称/性别/头像地址
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
users, err1 := usermod.FindUsersByUID(UIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
|
|
for k, v := range data {
|
|
for _, u := range users {
|
|
if v.UserID == u.UID {
|
|
data[k].UserName = u.Name
|
|
data[k].UserPortrait = u.Portrait
|
|
data[k].Gender = u.Gender
|
|
data[k].Age = u.Age()
|
|
data[k].VipLevel = u.VipLevel
|
|
data[k].Awards = u.Awards
|
|
data[k].AwardsExpire = userser.HandleUserAwardsExpire(u)
|
|
data[k].SuperUser = u.GetSuperUser(now)
|
|
data[k].VipExpireDate = u.VipExpireDate
|
|
break
|
|
}
|
|
}
|
|
}
|
|
})
|
|
// 获取回复用户
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
if toUIDs == nil || len(toUIDs) == 0 {
|
|
return
|
|
}
|
|
toUsers, err1 := usermod.FindUsersByUID(toUIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
for k, v := range data {
|
|
for _, u := range toUsers {
|
|
if v.ToUserID == u.UID {
|
|
data[k].ToUserName = u.Name
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return
|
|
})
|
|
// 是否关注
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
followers, err1 := followmod.IsFollowUsers(uid, UIDs)
|
|
if err1 != nil {
|
|
errs = append(errs, err1)
|
|
return
|
|
}
|
|
for k, v := range data {
|
|
data[k].IsFollow = followers[v.UserID]
|
|
}
|
|
})
|
|
wg.Wait()
|
|
if len(errs) > 0 {
|
|
err = errs[0]
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// 计算分页信息
|
|
func getNewPageInfo(total int64, pageNumber int64, pageSize int64) (int64, int64) {
|
|
var curPage = pageNumber - total/pageSize
|
|
var skip, limit int64
|
|
if curPage == 1 {
|
|
skip = 0
|
|
limit = (pageSize - total%pageSize) + 1
|
|
} else {
|
|
skip = pageSize - total%pageSize + (curPage-2)*pageSize
|
|
limit = (pageSize) + 1
|
|
}
|
|
return skip, limit
|
|
}
|
|
|
|
// 排序
|
|
func sortCmtList(ids []ObjectID, cmtList []cmtmod.Comment) (list []cmtmod.Comment) {
|
|
var cMap = make(map[ObjectID]cmtmod.Comment)
|
|
for _, v := range cmtList {
|
|
cMap[v.ID] = v
|
|
}
|
|
for _, v := range ids {
|
|
list = append(list, cMap[v])
|
|
}
|
|
return
|
|
}
|