Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

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
}