Files
nl-im-service/internal/api/conversation_handler.go
2025-12-05 16:35:14 +08:00

150 lines
3.4 KiB
Go
Raw 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
* 作用:会话列表(最近聊天)相关 API 处理器
*/
package api
import (
"xk-websocket-v2/internal/service"
"xk-websocket-v2/internal/utils"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
/**
* GetConversationListHandler
* 功能:获取当前用户的会话列表
* 路径GET /api/conversations
*/
func GetConversationListHandler(c *gin.Context) {
userID, _ := c.Get("user_id")
list, err := service.ConversationSvc.GetConversations(userID.(string))
if err != nil {
utils.InternalError(c, "查询失败")
return
}
utils.SuccessWithData(c, list, "获取成功")
}
/**
* ResetConversationUnreadHandler
* 功能:重置会话未读数
* 路径POST /api/conversations/reset-unread
*/
func ResetConversationUnreadHandler(c *gin.Context) {
userID, _ := c.Get("user_id")
var req struct {
TargetID string `json:"target_id" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, "参数错误")
return
}
if err := service.ConversationSvc.ResetUnread(userID.(string), req.TargetID); err != nil {
utils.InternalError(c, "操作失败")
return
}
utils.Success(c, "已重置未读")
}
/**
* UpdateConversationHandler
* 功能:更新会话标记(置顶、免打扰、特别关心)
* 路径POST /api/conversations/update
*/
func UpdateConversationHandler(c *gin.Context) {
userID, _ := c.Get("user_id")
var req struct {
TargetID string `json:"target_id" binding:"required"`
IsTop *bool `json:"is_top"`
IsMuted *bool `json:"is_muted"`
IsSpecialCare *bool `json:"is_special_care"`
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, "参数错误")
return
}
updates := make(map[string]interface{})
if req.IsTop != nil {
updates["is_top"] = *req.IsTop
}
if req.IsMuted != nil {
updates["is_muted"] = *req.IsMuted
}
if req.IsSpecialCare != nil {
updates["is_special_care"] = *req.IsSpecialCare
}
if len(updates) == 0 {
utils.BadRequest(c, "没有可更新的字段")
return
}
if err := service.ConversationSvc.UpdateConversationFlags(userID.(string), req.TargetID, updates); err != nil {
utils.InternalError(c, "更新失败")
return
}
utils.Success(c, "更新成功")
}
/**
* DeleteConversationHandler
* 功能:删除会话
* 路径POST /api/conversations/delete
*/
func DeleteConversationHandler(c *gin.Context) {
userID, _ := c.Get("user_id")
var req struct {
TargetID string `json:"target_id" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, "参数错误")
return
}
if err := service.ConversationSvc.DeleteConversation(userID.(string), req.TargetID); err != nil {
utils.InternalError(c, "删除失败")
return
}
utils.Success(c, "删除成功")
}
/**
* GetConversationByRoomHandler
* 功能:根据 room_id 获取会话(不自动创建)
* 路径GET /api/conversations/by-room/:room_id
*/
func GetConversationByRoomHandler(c *gin.Context) {
userID, _ := c.Get("user_id")
roomID := c.Param("room_id")
if roomID == "" {
utils.BadRequest(c, "room_id 不能为空")
return
}
conv, err := service.ConversationSvc.GetOrCreateConversationByRoom(userID.(string), roomID)
if err != nil {
if err == gorm.ErrRecordNotFound {
utils.NotFound(c, "会话不存在")
} else {
utils.InternalError(c, "查询失败")
}
return
}
utils.SuccessWithData(c, conv, "获取成功")
}