getreplylistlogic.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package logic
  2. import (
  3. "context"
  4. "slowwild/internal/constants"
  5. "slowwild/internal/errorx"
  6. "slowwild/internal/model"
  7. "slowwild/internal/svc"
  8. "strconv"
  9. "strings"
  10. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
  11. "github.com/spf13/cast"
  12. "github.com/zeromicro/go-zero/core/logx"
  13. )
  14. type GetReplyListLogic struct {
  15. ctx context.Context
  16. svcCtx *svc.ServiceContext
  17. logx.Logger
  18. }
  19. func NewGetReplyListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetReplyListLogic {
  20. return &GetReplyListLogic{
  21. ctx: ctx,
  22. svcCtx: svcCtx,
  23. Logger: logx.WithContext(ctx),
  24. }
  25. }
  26. // 获取回复列表
  27. func (l *GetReplyListLogic) GetReplyList(in *slowwildserver.GetReplyListReq) (*slowwildserver.GetReplyListRsp, error) {
  28. // 从context中获取userId
  29. userId, _ := cast.ToInt64E(l.ctx.Value(constants.UserIDKey))
  30. if in.CommentId <= 0 || in.Page <= 0 || in.PageSize <= 0 {
  31. return nil, errorx.ErrInvalidParam
  32. }
  33. // 获取回复列表
  34. replies, err := l.svcCtx.CommentModel.GetReplyList(l.ctx, in.CommentId, int(in.Page), int(in.PageSize))
  35. if err != nil {
  36. l.Logger.Errorf("获取回复列表失败: %v", err)
  37. return nil, errorx.ErrCommentQueryFailed
  38. }
  39. // 收集所有用户ID(回复用户和被@用户)
  40. userIds := make(map[int64]bool)
  41. for _, reply := range replies {
  42. userIds[reply.UserId] = true
  43. if reply.WithUserIds != "" {
  44. for _, idStr := range strings.Split(reply.WithUserIds, ",") {
  45. if userId, err := strconv.ParseInt(idStr, 10, 64); err == nil {
  46. userIds[userId] = true
  47. }
  48. }
  49. }
  50. }
  51. // 批量获取用户信息
  52. var userIdList []int64
  53. for userId := range userIds {
  54. userIdList = append(userIdList, userId)
  55. }
  56. users, err := l.svcCtx.UserModel.FindByIds(l.ctx, userIdList)
  57. if err != nil {
  58. l.Logger.Errorf("批量获取用户信息失败: %v", err)
  59. return nil, errorx.ErrUserQueryFailed
  60. }
  61. // 构建用户信息map
  62. userMap := make(map[int64]*model.User)
  63. for _, user := range users {
  64. userMap[user.ID] = user
  65. }
  66. // 构建响应
  67. resp := &slowwildserver.GetReplyListRsp{
  68. List: make([]*slowwildserver.RepliesItem, 0, len(replies)),
  69. }
  70. for _, reply := range replies {
  71. // 获取回复用户信息
  72. user := userMap[reply.UserId]
  73. if user == nil {
  74. continue
  75. }
  76. // 获取@用户信息
  77. var withUsers []*slowwildserver.UserInfo
  78. if reply.WithUserIds != "" {
  79. for _, idStr := range strings.Split(reply.WithUserIds, ",") {
  80. if userId, err := strconv.ParseInt(idStr, 10, 64); err == nil {
  81. if atUser := userMap[userId]; atUser != nil {
  82. withUsers = append(withUsers, &slowwildserver.UserInfo{
  83. Id: atUser.ID,
  84. Nickname: atUser.Nickname,
  85. Avatar: atUser.Avatar,
  86. Sex: int32(atUser.Sex),
  87. })
  88. }
  89. }
  90. }
  91. }
  92. var isUpvoted bool
  93. // 获取回复点赞状态
  94. if userId > 0 {
  95. isUpvoted, err = l.svcCtx.CommentModel.IsCommentUpvotedByUser(l.ctx, userId, reply.ID)
  96. if err != nil {
  97. l.Logger.Errorf("获取回复点赞状态失败: %v", err)
  98. continue
  99. }
  100. }
  101. resp.List = append(resp.List, &slowwildserver.RepliesItem{
  102. Id: reply.ID,
  103. User: &slowwildserver.UserInfo{
  104. Id: user.ID,
  105. Nickname: user.Nickname,
  106. Avatar: user.Avatar,
  107. Sex: int32(user.Sex),
  108. },
  109. Content: reply.Content,
  110. WithUser: withUsers,
  111. UpvoteCount: reply.ThumbsUpCount,
  112. IpLoc: reply.IpLoc,
  113. CreatedOn: reply.CreatedOn,
  114. IsMine: userId == reply.UserId,
  115. IsLiked: isUpvoted,
  116. })
  117. }
  118. return resp, nil
  119. }