getpostlogic.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package logic
  2. import (
  3. "context"
  4. "slowwild/internal/constants"
  5. "slowwild/internal/errorx"
  6. "slowwild/internal/svc"
  7. "strconv"
  8. "strings"
  9. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
  10. "github.com/spf13/cast"
  11. "github.com/zeromicro/go-zero/core/logx"
  12. )
  13. type GetPostLogic struct {
  14. ctx context.Context
  15. svcCtx *svc.ServiceContext
  16. logx.Logger
  17. }
  18. func NewGetPostLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPostLogic {
  19. return &GetPostLogic{
  20. ctx: ctx,
  21. svcCtx: svcCtx,
  22. Logger: logx.WithContext(ctx),
  23. }
  24. }
  25. // 获取动态详情
  26. func (l *GetPostLogic) GetPost(in *slowwildserver.GetPostReq) (*slowwildserver.GetPostRsp, error) {
  27. userId, _ := cast.ToInt64E(l.ctx.Value(constants.UserIDKey))
  28. if in.PostId <= 0 {
  29. return nil, errorx.ErrInvalidParam
  30. }
  31. // 获取帖子基本信息
  32. post, err := l.svcCtx.PostModel.GetPostDetail(l.ctx, in.PostId)
  33. if err != nil {
  34. l.Logger.Errorf("获取帖子详情失败: %v", err)
  35. return nil, errorx.ErrPostQueryFailed
  36. }
  37. // 获取帖子内容
  38. content, err := l.svcCtx.PostModel.GetPostContent(l.ctx, in.PostId)
  39. if err != nil {
  40. l.Logger.Errorf("获取帖子内容失败: %v", err)
  41. return nil, errorx.ErrPostQueryFailed
  42. }
  43. // 获取用户信息
  44. user, err := l.svcCtx.UserModel.FindOne(l.ctx, post.UserId)
  45. if err != nil {
  46. l.Logger.Errorf("获取用户信息失败: %v", err)
  47. return nil, errorx.ErrUserQueryFailed
  48. }
  49. // 获取话题信息
  50. var tagItems []*slowwildserver.TagItem
  51. if post.Tags != "" {
  52. tagStrs := strings.Split(post.Tags, ",")
  53. var tagIds []int64
  54. for _, tagStr := range tagStrs {
  55. tagId, err := strconv.ParseInt(tagStr, 10, 64)
  56. if err != nil {
  57. continue
  58. }
  59. tagIds = append(tagIds, tagId)
  60. }
  61. tags, err := l.svcCtx.TagModel.FindByIds(l.ctx, tagIds)
  62. if err != nil {
  63. l.Logger.Errorf("获取话题信息失败: %v", err)
  64. return nil, errorx.ErrPostQueryFailed
  65. }
  66. for _, tag := range tags {
  67. tagItems = append(tagItems, &slowwildserver.TagItem{
  68. Id: tag.ID,
  69. Name: tag.Name,
  70. })
  71. }
  72. }
  73. var isLiked, isCollected bool
  74. // 获取用户交互状态
  75. if userId > 0 {
  76. isLiked, err = l.svcCtx.UserModel.IsPostLikedByUser(l.ctx, userId, post.ID)
  77. if err != nil {
  78. l.Logger.Errorf("查询用户点赞状态失败: %v", err)
  79. return nil, errorx.ErrPostQueryFailed
  80. }
  81. isCollected, err = l.svcCtx.UserModel.IsPostCollectedByUser(l.ctx, userId, post.ID)
  82. if err != nil {
  83. l.Logger.Errorf("查询用户收藏状态失败: %v", err)
  84. return nil, errorx.ErrPostQueryFailed
  85. }
  86. }
  87. // 获取@用户信息
  88. var atUserInfos []*slowwildserver.UserInfo
  89. if post.WithUserIds != "" {
  90. // 解析用户ID列表
  91. atUserIdStrs := strings.Split(post.WithUserIds, ",")
  92. var atUserIds []int64
  93. for _, idStr := range atUserIdStrs {
  94. userId, err := strconv.ParseInt(idStr, 10, 64)
  95. if err != nil {
  96. continue
  97. }
  98. atUserIds = append(atUserIds, userId)
  99. }
  100. // 批量获取用户信息
  101. if len(atUserIds) > 0 {
  102. atUsers, err := l.svcCtx.UserModel.FindByIds(l.ctx, atUserIds)
  103. if err != nil {
  104. l.Logger.Errorf("获取@用户信息失败: %v", err)
  105. return nil, errorx.ErrUserQueryFailed
  106. }
  107. // 构建用户信息列表
  108. for _, atUser := range atUsers {
  109. atUserInfos = append(atUserInfos, &slowwildserver.UserInfo{
  110. Id: atUser.ID,
  111. Nickname: atUser.Nickname,
  112. Avatar: atUser.Avatar,
  113. Sex: int32(atUser.Sex),
  114. })
  115. }
  116. }
  117. }
  118. // 构建响应
  119. resp := &slowwildserver.GetPostRsp{
  120. Id: post.ID,
  121. User: &slowwildserver.UserInfo{
  122. Id: user.ID,
  123. Nickname: user.Nickname,
  124. Avatar: user.Avatar,
  125. Sex: int32(user.Sex),
  126. },
  127. PostType: post.PostType,
  128. Title: content.Title,
  129. Content: content.Content,
  130. ContentSummary: content.ContentSummary,
  131. Images: strings.Split(content.PostCovers, ","),
  132. VideoUrl: content.PostVideoUrl,
  133. VideoCover: content.PostVideoCover,
  134. CommentCount: post.CommentCount,
  135. CollectionCount: post.CollectionCount,
  136. UpvoteCount: post.UpvoteCount,
  137. ShareCount: post.ShareCount,
  138. Tags: tagItems,
  139. IpLoc: post.IpLoc,
  140. HotNum: post.HotNum,
  141. CreatedOn: post.CreatedOn,
  142. IsLiked: isLiked,
  143. IsCollected: isCollected,
  144. IsMine: userId == post.UserId,
  145. LatestRepliedOn: post.LatestRepliedOn,
  146. WithUser: atUserInfos,
  147. }
  148. return resp, nil
  149. }