package logic import ( "context" "slowwild/internal/errorx" "slowwild/internal/model" "slowwild/internal/svc" "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver" "strconv" "strings" "github.com/zeromicro/go-zero/core/logx" ) type GetPostListLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewGetPostListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPostListLogic { return &GetPostListLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // 获取帖子列表 func (l *GetPostListLogic) GetPostList(in *slowwildserver.GetPostListReq) (*slowwildserver.GetPostListRsp, error) { if in.Page <= 0 || in.PageSize <= 0 { return nil, errorx.ErrInvalidParam } posts, err := l.svcCtx.PostModel.GetPostList(l.ctx, in) if err != nil { l.Logger.Errorf("获取帖子列表失败: %v", err) return nil, errorx.ErrPostQueryFailed } // 构建响应 resp := &slowwildserver.GetPostListRsp{ List: make([]*slowwildserver.GetPostListItem, 0, len(posts)), } // 收集所有用户ID userIds := make([]int64, 0, len(posts)) for _, post := range posts { userIds = append(userIds, post.UserId) } // 批量获取用户信息 users, err := l.svcCtx.UserModel.FindByIds(l.ctx, userIds) if err != nil { l.Logger.Errorf("批量获取用户信息失败: %v", err) return nil, errorx.ErrUserQueryFailed } // 构建用户信息map userMap := make(map[int64]*model.User) for _, user := range users { userMap[user.ID] = user } // 获取所有话题ID var allTagIds []int64 for _, post := range posts { if post.Tags != "" { tagStrs := strings.Split(post.Tags, ",") for _, tagStr := range tagStrs { tagId, err := strconv.ParseInt(tagStr, 10, 64) if err != nil { continue } allTagIds = append(allTagIds, tagId) } } } // 批量获取话题信息 tags, err := l.svcCtx.TagModel.FindByIds(l.ctx, allTagIds) if err != nil { l.Logger.Errorf("批量获取话题信息失败: %v", err) return nil, errorx.ErrPostQueryFailed } // 构建话题信息map tagMap := make(map[int64]*model.Tag) for _, tag := range tags { tagMap[tag.ID] = tag } // 收集所有帖子ID postIds := make([]int64, 0, len(posts)) for _, post := range posts { postIds = append(postIds, post.ID) } // 批量获取帖子内容 postContents, err := l.svcCtx.PostModel.GetPostContents(l.ctx, postIds) if err != nil { l.Logger.Errorf("批量获取帖子内容失败: %v", err) return nil, errorx.ErrPostQueryFailed } for _, post := range posts { // 查询用户状态 isLiked, err := l.svcCtx.UserModel.IsPostLikedByUser(l.ctx, in.UserId, post.ID) if err != nil { l.Logger.Errorf("查询用户点赞状态失败: %v", err) return nil, errorx.ErrPostQueryFailed } isCollected, err := l.svcCtx.UserModel.IsPostCollectedByUser(l.ctx, in.UserId, post.ID) if err != nil { l.Logger.Errorf("查询用户收藏状态失败: %v", err) return nil, errorx.ErrPostQueryFailed } // 获取话题信息 var tagItems []*slowwildserver.TagItem if post.Tags != "" { tagStrs := strings.Split(post.Tags, ",") for _, tagStr := range tagStrs { tagId, err := strconv.ParseInt(tagStr, 10, 64) if err != nil { continue } if tag, ok := tagMap[tagId]; ok { tagItems = append(tagItems, &slowwildserver.TagItem{ Id: tag.ID, Name: tag.Name, }) } } } // 获取用户信息 user := userMap[post.UserId] if user == nil { continue } // 获取帖子内容 content := postContents[post.ID] if content == nil { continue } resp.List = append(resp.List, &slowwildserver.GetPostListItem{ 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, 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: in.UserId == post.UserId, }) } return resp, nil }