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 }