wx-server/internal/server/post/list.go

98 lines
2.9 KiB
Go
Raw Normal View History

2024-06-04 21:22:50 +08:00
package post
import (
"fmt"
"mini_server/internal/dao"
"mini_server/internal/server/help"
"mini_server/internal/server/httpreply"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)
// 帖子列表查询接口。支持按照时间查询,以及角色查询。
type ListParam struct {
StartTime time.Time `form:"start_time" binding:"required" time_format:"2006-01-02 15:04:05"`
StopTime time.Time `form:"stop_time" binding:"required,gtfield=StartTime" time_format:"2006-01-02 15:04:05"`
RoleId *int32 `form:"role_id" binding:"min=0"`
}
type ListReply struct {
PostList []*PostInfo `json:"post_list"`
}
func List(c *gin.Context) {
reply := httpreply.NewDefaultReplyData()
defer httpreply.Reply(c, reply)
userId, ok := help.GetUserId(c)
if !ok {
reply.Status = http.StatusNotFound
reply.Message = "无法获取用户信息"
return
}
var param ListParam
if err := c.ShouldBindQuery(&param); err != nil {
reply.Status = http.StatusBadRequest
reply.Message = fmt.Sprintf("invalid query args,err:%v", err)
return
}
list, err := dao.Post_Page_Query(param.StartTime, param.StopTime, *param.RoleId)
if err != nil {
logrus.Errorf("帖子列表查询失败param:%v,error:%v", param, err)
reply.Status = http.StatusInternalServerError
reply.Message = "帖子列表查询失败"
return
}
// 批量查询帖子点赞信息
postIds := make([]uint64, len(list))
for i, data := range list {
postIds[i] = uint64(data.ID)
}
userIds := make([]int32, len(list))
for i, data := range list {
userIds[i] = data.UserId
}
like_count_map, err := dao.PostLike_Count_Batch(postIds)
if err != nil {
logrus.Errorf("帖子列表点赞数查询失败userId:%d,postIds:%v,err:%v", userId, postIds, err)
reply.Status = http.StatusInternalServerError
reply.Message = "帖子列表点赞数查询失败"
return
}
// 批量查询用户是否点赞
user_like_map, err := dao.PostLike_Exists_Batch(userId, postIds)
if err != nil {
logrus.Errorf("帖子列表用户点赞信息查询失败userId:%d,postId:%v,err:%v", userId, postIds, err)
reply.Status = http.StatusInternalServerError
reply.Message = "帖子列表用户点赞信息查询失败"
return
}
// 批量查询用户名和用户头像
user_info_map, err := dao.User_Query_List(userIds)
if err != nil {
logrus.Errorf("批量查询帖子发布者信息失败postIds:%v,userIds:%v,err:%v", postIds, userId, err)
reply.Status = http.StatusInternalServerError
reply.Message = "批量查询帖子发布者信息失败"
return
}
postList := make([]*PostInfo, len(list))
for i, data := range list {
var info PostInfo
current_post_id := uint64(data.ID)
current_user_id := data.UserId
copy_from_mysql(data, like_count_map[current_post_id], user_like_map[current_post_id], user_info_map[current_user_id], &info)
postList[i] = &info
}
reply.Data = &ListReply{PostList: postList}
}