getpostlogic.go 4.2 KB

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