package logic import ( "context" "slowwild/internal/constants" "slowwild/internal/errorx" "slowwild/internal/svc" "strconv" "strings" "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/logx" ) type GetPostLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewGetPostLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPostLogic { return &GetPostLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // 获取动态详情 func (l *GetPostLogic) GetPost(in *slowwildserver.GetPostReq) (*slowwildserver.GetPostRsp, error) { userId, _ := cast.ToInt64E(l.ctx.Value(constants.UserIDKey)) if in.PostId <= 0 { return nil, errorx.ErrInvalidParam } // 获取帖子基本信息 post, err := l.svcCtx.PostModel.GetPostDetail(l.ctx, in.PostId) if err != nil { l.Logger.Errorf("获取帖子详情失败: %v", err) return nil, errorx.ErrPostQueryFailed } // 获取帖子内容 content, err := l.svcCtx.PostModel.GetPostContent(l.ctx, in.PostId) if err != nil { l.Logger.Errorf("获取帖子内容失败: %v", err) return nil, errorx.ErrPostQueryFailed } // 获取用户信息 user, err := l.svcCtx.UserModel.FindOne(l.ctx, post.UserId) if err != nil { l.Logger.Errorf("获取用户信息失败: %v", err) return nil, errorx.ErrUserQueryFailed } // 获取话题信息 var tagItems []*slowwildserver.TagItem if post.Tags != "" { tagStrs := strings.Split(post.Tags, ",") var tagIds []int64 for _, tagStr := range tagStrs { tagId, err := strconv.ParseInt(tagStr, 10, 64) if err != nil { continue } tagIds = append(tagIds, tagId) } tags, err := l.svcCtx.TagModel.FindByIds(l.ctx, tagIds) if err != nil { l.Logger.Errorf("获取话题信息失败: %v", err) return nil, errorx.ErrPostQueryFailed } for _, tag := range tags { tagItems = append(tagItems, &slowwildserver.TagItem{ Id: tag.ID, Name: tag.Name, }) } } var isLiked, isCollected bool // 获取用户交互状态 if userId > 0 { isLiked, err = l.svcCtx.UserModel.IsPostLikedByUser(l.ctx, userId, post.ID) if err != nil { l.Logger.Errorf("查询用户点赞状态失败: %v", err) return nil, errorx.ErrPostQueryFailed } isCollected, err = l.svcCtx.UserModel.IsPostCollectedByUser(l.ctx, userId, post.ID) if err != nil { l.Logger.Errorf("查询用户收藏状态失败: %v", err) return nil, errorx.ErrPostQueryFailed } } // 获取@用户信息 var atUserInfos []*slowwildserver.UserInfo if post.WithUserIds != "" { // 解析用户ID列表 atUserIdStrs := strings.Split(post.WithUserIds, ",") var atUserIds []int64 for _, idStr := range atUserIdStrs { userId, err := strconv.ParseInt(idStr, 10, 64) if err != nil { continue } atUserIds = append(atUserIds, userId) } // 批量获取用户信息 if len(atUserIds) > 0 { atUsers, err := l.svcCtx.UserModel.FindByIds(l.ctx, atUserIds) if err != nil { l.Logger.Errorf("获取@用户信息失败: %v", err) return nil, errorx.ErrUserQueryFailed } // 构建用户信息列表 for _, atUser := range atUsers { atUserInfos = append(atUserInfos, &slowwildserver.UserInfo{ Id: atUser.ID, Nickname: atUser.Nickname, Avatar: atUser.Avatar, Sex: int32(atUser.Sex), }) } } } // 构建响应 resp := &slowwildserver.GetPostRsp{ Id: post.ID, User: &slowwildserver.UserInfo{ Id: user.ID, Nickname: user.Nickname, Avatar: user.Avatar, Sex: int32(user.Sex), }, PostType: post.PostType, Title: content.Title, Content: content.Content, ContentSummary: content.ContentSummary, Images: strings.Split(content.PostCovers, ","), VideoUrl: content.PostVideoUrl, VideoCover: content.PostVideoCover, CommentCount: post.CommentCount, CollectionCount: post.CollectionCount, UpvoteCount: post.UpvoteCount, ShareCount: post.ShareCount, Tags: tagItems, IpLoc: post.IpLoc, HotNum: post.HotNum, CreatedOn: post.CreatedOn, IsLiked: isLiked, IsCollected: isCollected, IsMine: userId == post.UserId, LatestRepliedOn: post.LatestRepliedOn, WithUser: atUserInfos, } return resp, nil }