98 lines
2.9 KiB
Go
98 lines
2.9 KiB
Go
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(¶m); 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}
|
||
}
|