Files
nl-im-service/internal/api/moment_handler.go
2025-12-08 09:08:10 +08:00

484 lines
10 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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)
}
}