message_controller.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package controller
  2. import (
  3. "log"
  4. "net/http"
  5. "strconv"
  6. "github.com/2930134478/AI-CS/backend/service"
  7. "github.com/gin-gonic/gin"
  8. )
  9. // MessageController 负责处理消息相关的 HTTP 请求。
  10. type MessageController struct {
  11. messageService *service.MessageService
  12. }
  13. // NewMessageController 创建 MessageController 实例。
  14. func NewMessageController(messageService *service.MessageService) *MessageController {
  15. return &MessageController{messageService: messageService}
  16. }
  17. type createMessageRequest struct {
  18. ConversationID uint `json:"conversation_id"`
  19. Content string `json:"content"`
  20. SenderIsAgent bool `json:"sender_is_agent"`
  21. SenderID uint `json:"sender_id"`
  22. }
  23. // CreateMessage 处理发送消息的请求。
  24. func (mc *MessageController) CreateMessage(c *gin.Context) {
  25. var req createMessageRequest
  26. if err := c.ShouldBindJSON(&req); err != nil || req.ConversationID == 0 || req.Content == "" {
  27. c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
  28. return
  29. }
  30. _, err := mc.messageService.CreateMessage(service.CreateMessageInput{
  31. ConversationID: req.ConversationID,
  32. Content: req.Content,
  33. SenderID: req.SenderID,
  34. SenderIsAgent: req.SenderIsAgent,
  35. })
  36. if err != nil {
  37. log.Printf("❌ 创建消息失败: 对话ID=%d, 错误=%v", req.ConversationID, err)
  38. switch err {
  39. case service.ErrConversationClosed:
  40. c.JSON(http.StatusBadRequest, gin.H{"error": "会话已关闭"})
  41. case service.ErrConversationNotFound:
  42. c.JSON(http.StatusBadRequest, gin.H{"error": "会话不存在"})
  43. default:
  44. c.JSON(http.StatusInternalServerError, gin.H{"error": "创建消息失败"})
  45. }
  46. return
  47. }
  48. c.JSON(http.StatusOK, gin.H{"message": "创建消息成功"})
  49. }
  50. // ListMessages 返回指定会话的消息列表。
  51. func (mc *MessageController) ListMessages(c *gin.Context) {
  52. conversationIDStr := c.Query("conversation_id")
  53. if conversationIDStr == "" {
  54. c.JSON(http.StatusBadRequest, gin.H{"error": "会话ID不能为空"})
  55. return
  56. }
  57. conversationID, err := strconv.ParseUint(conversationIDStr, 10, 64)
  58. if err != nil || conversationID == 0 {
  59. c.JSON(http.StatusBadRequest, gin.H{"error": "会话ID不合法"})
  60. return
  61. }
  62. messages, err := mc.messageService.ListMessages(uint(conversationID))
  63. if err != nil {
  64. c.JSON(http.StatusInternalServerError, gin.H{"error": "查询消息失败"})
  65. return
  66. }
  67. c.JSON(http.StatusOK, messages)
  68. }
  69. type markMessagesReadRequest struct {
  70. ConversationID uint `json:"conversation_id"`
  71. ReaderIsAgent bool `json:"reader_is_agent"`
  72. }
  73. // MarkMessagesRead 将指定会话的消息标记为已读。
  74. func (mc *MessageController) MarkMessagesRead(c *gin.Context) {
  75. var req markMessagesReadRequest
  76. if err := c.ShouldBindJSON(&req); err != nil || req.ConversationID == 0 {
  77. c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
  78. return
  79. }
  80. result, err := mc.messageService.MarkMessagesRead(req.ConversationID, req.ReaderIsAgent)
  81. if err != nil {
  82. c.JSON(http.StatusInternalServerError, gin.H{"error": "更新消息状态失败"})
  83. return
  84. }
  85. c.JSON(http.StatusOK, gin.H{
  86. "updated": len(result.MessageIDs),
  87. "message_ids": result.MessageIDs,
  88. "conversation_id": result.ConversationID,
  89. "unread_count": result.UnreadCount,
  90. "read_at": formatTimeValue(result.ReadAt),
  91. })
  92. }