484 lines
10 KiB
Go
484 lines
10 KiB
Go
|
|
/**
|
|||
|
|
* package api
|
|||
|
|
* 作用:处理朋友圈相关的 HTTP 请求接口
|
|||
|
|
*/
|
|||
|
|
package api
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"strconv"
|
|||
|
|
"xk-websocket-v2/internal/model"
|
|||
|
|
"xk-websocket-v2/internal/service"
|
|||
|
|
"xk-websocket-v2/internal/utils"
|
|||
|
|
|
|||
|
|
"github.com/gin-gonic/gin"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// ==========================================
|
|||
|
|
// 动态相关接口
|
|||
|
|
// ==========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* CreateMomentHandler
|
|||
|
|
* 功能:发布动态
|
|||
|
|
* 路径:POST /api/moments
|
|||
|
|
*/
|
|||
|
|
func CreateMomentHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var req model.CreateMomentReq
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 校验内容不能为空(除非有媒体)
|
|||
|
|
if req.Content == "" && len(req.MediaURLs) == 0 {
|
|||
|
|
utils.BadRequest(c, "内容不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
moment, err := service.MomentSvc.CreateMoment(userID, &req)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, moment, "发布成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* DeleteMomentHandler
|
|||
|
|
* 功能:删除动态
|
|||
|
|
* 路径:DELETE /api/moments/:id
|
|||
|
|
*/
|
|||
|
|
func DeleteMomentHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.MomentSvc.DeleteMoment(userID, uint(momentID)); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "删除成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetMomentDetailHandler
|
|||
|
|
* 功能:获取动态详情
|
|||
|
|
* 路径:GET /api/moments/:id
|
|||
|
|
*/
|
|||
|
|
func GetMomentDetailHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
moment, err := service.MomentSvc.GetMomentDetail(userID, uint(momentID))
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, moment, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetMomentsHandler
|
|||
|
|
* 功能:获取好友动态列表
|
|||
|
|
* 路径:GET /api/moments
|
|||
|
|
*/
|
|||
|
|
func GetMomentsHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|||
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|||
|
|
|
|||
|
|
moments, total, err := service.MomentSvc.GetFriendsMoments(userID, page, pageSize)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保返回空数组而不是null
|
|||
|
|
if moments == nil {
|
|||
|
|
moments = []model.Moment{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, gin.H{
|
|||
|
|
"data": moments,
|
|||
|
|
"total": total,
|
|||
|
|
"page": page,
|
|||
|
|
"size": pageSize,
|
|||
|
|
}, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetUserMomentsHandler
|
|||
|
|
* 功能:获取指定用户的动态列表
|
|||
|
|
* 路径:GET /api/moments/user/:user_id
|
|||
|
|
*/
|
|||
|
|
func GetUserMomentsHandler(c *gin.Context) {
|
|||
|
|
viewerID := c.GetString("user_id")
|
|||
|
|
if viewerID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
targetUserID := c.Param("user_id")
|
|||
|
|
if targetUserID == "" {
|
|||
|
|
utils.BadRequest(c, "用户ID不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|||
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|||
|
|
|
|||
|
|
moments, total, err := service.MomentSvc.GetUserMoments(viewerID, targetUserID, page, pageSize)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if moments == nil {
|
|||
|
|
moments = []model.Moment{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, gin.H{
|
|||
|
|
"data": moments,
|
|||
|
|
"total": total,
|
|||
|
|
"page": page,
|
|||
|
|
"size": pageSize,
|
|||
|
|
}, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==========================================
|
|||
|
|
// 点赞相关接口
|
|||
|
|
// ==========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* LikeMomentHandler
|
|||
|
|
* 功能:点赞动态
|
|||
|
|
* 路径:POST /api/moments/:id/like
|
|||
|
|
*/
|
|||
|
|
func LikeMomentHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.MomentSvc.LikeMoment(userID, uint(momentID)); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "点赞成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* UnlikeMomentHandler
|
|||
|
|
* 功能:取消点赞
|
|||
|
|
* 路径:DELETE /api/moments/:id/like
|
|||
|
|
*/
|
|||
|
|
func UnlikeMomentHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.MomentSvc.UnlikeMoment(userID, uint(momentID)); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "取消点赞成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetMomentLikesHandler
|
|||
|
|
* 功能:获取动态的点赞列表
|
|||
|
|
* 路径:GET /api/moments/:id/likes
|
|||
|
|
*/
|
|||
|
|
func GetMomentLikesHandler(c *gin.Context) {
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
likes, err := service.MomentSvc.GetMomentLikes(uint(momentID))
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if likes == nil {
|
|||
|
|
likes = []model.MomentLike{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, likes, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==========================================
|
|||
|
|
// 评论相关接口
|
|||
|
|
// ==========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* CreateCommentHandler
|
|||
|
|
* 功能:发表评论
|
|||
|
|
* 路径:POST /api/moments/:id/comments
|
|||
|
|
*/
|
|||
|
|
func CreateCommentHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var req model.CreateCommentReq
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if req.Content == "" {
|
|||
|
|
utils.BadRequest(c, "评论内容不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
comment, err := service.MomentSvc.CreateComment(userID, uint(momentID), &req)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, comment, "评论成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* DeleteCommentHandler
|
|||
|
|
* 功能:删除评论
|
|||
|
|
* 路径:DELETE /api/moments/comments/:id
|
|||
|
|
*/
|
|||
|
|
func DeleteCommentHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
commentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的评论ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := service.MomentSvc.DeleteComment(userID, uint(commentID)); err != nil {
|
|||
|
|
utils.BadRequest(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "删除成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetMomentCommentsHandler
|
|||
|
|
* 功能:获取动态的评论列表
|
|||
|
|
* 路径:GET /api/moments/:id/comments
|
|||
|
|
*/
|
|||
|
|
func GetMomentCommentsHandler(c *gin.Context) {
|
|||
|
|
momentID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.BadRequest(c, "无效的动态ID")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
comments, err := service.MomentSvc.GetMomentComments(uint(momentID))
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if comments == nil {
|
|||
|
|
comments = []model.MomentComment{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, comments, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==========================================
|
|||
|
|
// 通知相关接口
|
|||
|
|
// ==========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetMomentNotificationsHandler
|
|||
|
|
* 功能:获取朋友圈通知列表
|
|||
|
|
* 路径:GET /api/moments/notifications
|
|||
|
|
*/
|
|||
|
|
func GetMomentNotificationsHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|||
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|||
|
|
|
|||
|
|
notifications, total, err := service.MomentSvc.GetNotifications(userID, page, pageSize)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if notifications == nil {
|
|||
|
|
notifications = []model.MomentNotification{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, gin.H{
|
|||
|
|
"data": notifications,
|
|||
|
|
"total": total,
|
|||
|
|
"page": page,
|
|||
|
|
"size": pageSize,
|
|||
|
|
}, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* MarkNotificationsReadHandler
|
|||
|
|
* 功能:标记通知为已读
|
|||
|
|
* 路径:POST /api/moments/notifications/read
|
|||
|
|
*/
|
|||
|
|
func MarkNotificationsReadHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var req struct {
|
|||
|
|
IDs []uint `json:"ids"`
|
|||
|
|
All bool `json:"all"` // 是否标记全部已读
|
|||
|
|
}
|
|||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|||
|
|
utils.BadRequest(c, "参数错误")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var err error
|
|||
|
|
if req.All {
|
|||
|
|
err = service.MomentSvc.MarkAllNotificationsRead(userID)
|
|||
|
|
} else if len(req.IDs) > 0 {
|
|||
|
|
err = service.MomentSvc.MarkNotificationsRead(userID, req.IDs)
|
|||
|
|
} else {
|
|||
|
|
utils.BadRequest(c, "请提供通知ID或设置all为true")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.Success(c, "标记成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* GetUnreadCountHandler
|
|||
|
|
* 功能:获取未读通知数量
|
|||
|
|
* 路径:GET /api/moments/notifications/unread-count
|
|||
|
|
*/
|
|||
|
|
func GetUnreadCountHandler(c *gin.Context) {
|
|||
|
|
userID := c.GetString("user_id")
|
|||
|
|
if userID == "" {
|
|||
|
|
utils.Unauthorized(c, "未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
count, err := service.MomentSvc.GetUnreadCount(userID)
|
|||
|
|
if err != nil {
|
|||
|
|
utils.InternalError(c, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
utils.SuccessWithData(c, gin.H{"count": count}, "获取成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ==========================================
|
|||
|
|
// 路由注册函数
|
|||
|
|
// ==========================================
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* RegisterMomentRoutes
|
|||
|
|
* 功能:注册朋友圈相关路由
|
|||
|
|
*/
|
|||
|
|
func RegisterMomentRoutes(r *gin.RouterGroup) {
|
|||
|
|
moments := r.Group("/moments")
|
|||
|
|
{
|
|||
|
|
// 动态相关
|
|||
|
|
moments.POST("", CreateMomentHandler)
|
|||
|
|
moments.GET("", GetMomentsHandler)
|
|||
|
|
moments.GET("/:id", GetMomentDetailHandler)
|
|||
|
|
moments.DELETE("/:id", DeleteMomentHandler)
|
|||
|
|
moments.GET("/user/:user_id", GetUserMomentsHandler)
|
|||
|
|
|
|||
|
|
// 点赞相关
|
|||
|
|
moments.POST("/:id/like", LikeMomentHandler)
|
|||
|
|
moments.DELETE("/:id/like", UnlikeMomentHandler)
|
|||
|
|
moments.GET("/:id/likes", GetMomentLikesHandler)
|
|||
|
|
|
|||
|
|
// 评论相关
|
|||
|
|
moments.POST("/:id/comments", CreateCommentHandler)
|
|||
|
|
moments.GET("/:id/comments", GetMomentCommentsHandler)
|
|||
|
|
moments.DELETE("/comments/:id", DeleteCommentHandler)
|
|||
|
|
|
|||
|
|
// 通知相关
|
|||
|
|
moments.GET("/notifications", GetMomentNotificationsHandler)
|
|||
|
|
moments.POST("/notifications/read", MarkNotificationsReadHandler)
|
|||
|
|
moments.GET("/notifications/unread-count", GetUnreadCountHandler)
|
|||
|
|
}
|
|||
|
|
}
|