| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- 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
- }
|