Files
mengyastore/mengyastore-backend-go/internal/handlers/admin_chat.go
2026-05-16 19:03:36 +08:00

133 lines
4.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 handlers
import (
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
// GetAllConversations 返回所有用户会话列表。
// @Summary 管理端:列出全部聊天会话
// @Description 返回每个有过消息的用户账号等信息,供客服选择会话;需管理令牌 `X-Admin-Token`。
// @Tags 管理端-聊天
// @Produce json
// @Security AdminToken
// @Success 200 {object} map[string]interface{}
// @Failure 401 {object} SwaggerErrorBody
// @Failure 500 {object} SwaggerErrorBody
// @Router /api/admin/chat [get]
func (h *AdminHandler) GetAllConversations(c *gin.Context) {
if !h.requireAdmin(c) {
return
}
convs, err := h.chatStore.ListConversations()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": gin.H{"conversations": convs}})
}
// GetConversation 返回指定账号的全部消息记录。
// @Summary 管理端:查看某用户的完整聊天记录
// @Description 路径参数 `account` 为用户账号标识;返回按时间排列的消息数组;需管理令牌。
// @Tags 管理端-聊天
// @Produce json
// @Security AdminToken
// @Param account path string true "用户账号(路径)"
// @Success 200 {object} SwaggerMessagesWrap
// @Failure 400 {object} SwaggerErrorBody
// @Failure 401 {object} SwaggerErrorBody
// @Failure 500 {object} SwaggerErrorBody
// @Router /api/admin/chat/{account} [get]
func (h *AdminHandler) GetConversation(c *gin.Context) {
if !h.requireAdmin(c) {
return
}
accountID := c.Param("account")
if accountID == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "缺少账号参数"})
return
}
msgs, err := h.chatStore.GetMessages(accountID)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": gin.H{"messages": msgs}})
}
type AdminChatPayload struct {
Content string `json:"content"`
}
// AdminReply 向指定用户发送管理员回复。
// @Summary 管理端:向用户回复一条消息
// @Description 路径为对方账号JSON body 含 `content`;写入后用户侧拉取可见。
// @Tags 管理端-聊天
// @Accept json
// @Produce json
// @Security AdminToken
// @Param account path string true "用户账号(路径)"
// @Param body body AdminChatPayload true "回复正文 JSON"
// @Success 200 {object} SwaggerOneChatMsgWrap
// @Failure 400 {object} SwaggerErrorBody
// @Failure 401 {object} SwaggerErrorBody
// @Failure 500 {object} SwaggerErrorBody
// @Router /api/admin/chat/{account} [post]
func (h *AdminHandler) AdminReply(c *gin.Context) {
if !h.requireAdmin(c) {
return
}
accountID := c.Param("account")
if accountID == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "缺少账号参数"})
return
}
var payload AdminChatPayload
if err := c.ShouldBindJSON(&payload); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数有误"})
return
}
content := strings.TrimSpace(payload.Content)
if content == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "消息不能为空"})
return
}
msg, err := h.chatStore.SendAdminMessage(accountID, content)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": gin.H{"message": msg}})
}
// ClearConversation 清除与指定用户的全部消息记录。
// @Summary 管理端:清空与某用户的会话
// @Description 删除该账号在系统中的全部聊天消息记录;不可恢复请谨慎使用。
// @Tags 管理端-聊天
// @Produce json
// @Security AdminToken
// @Param account path string true "用户账号(路径)"
// @Success 200 {object} SwaggerBoolOKWrap
// @Failure 400 {object} SwaggerErrorBody
// @Failure 401 {object} SwaggerErrorBody
// @Failure 500 {object} SwaggerErrorBody
// @Router /api/admin/chat/{account} [delete]
func (h *AdminHandler) ClearConversation(c *gin.Context) {
if !h.requireAdmin(c) {
return
}
accountID := c.Param("account")
if accountID == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "缺少账号参数"})
return
}
if err := h.chatStore.ClearConversation(accountID); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": gin.H{"ok": true}})
}