49e4f46a创建于 4月23日历史提交
package controller

import (
	"com.zhangmeng/go-wechat/common"
	"com.zhangmeng/go-wechat/models"
	"com.zhangmeng/go-wechat/service"
	"com.zhangmeng/go-wechat/service/impl"
	"github.com/gin-gonic/gin"
)

// MessageController 消息控制器
type MessageController struct {
	messageService service.IMessageService
}

// NewMessageController 创建控制器实例
func NewMessageController() *MessageController {
	return &MessageController{
		messageService: &impl.MessageService{},
	}
}

// RegisterMessageRoute 注册消息相关路由
func RegisterMessageRoute(r *gin.RouterGroup) {
	mc := NewMessageController()

	// 所有消息接口都需要登录
	apiGroup := r.Group("/api")
	apiGroup.Use(common.JWTAuth())
	{
		// 会话列表
		apiGroup.GET("/conversations", mc.GetConversationList)

		// 消息历史
		apiGroup.GET("/messages/history", mc.GetMessageHistory)
	}
}

// GetConversationList 获取会话列表
func (mc *MessageController) GetConversationList(c *gin.Context) {
	userID := c.MustGet("userID").(uint64)

	conversations, err := mc.messageService.GetConversationList(userID)
	if err != nil {
		c.JSON(200, common.Fail(err.Error()))
		return
	}

	c.JSON(200, common.Success(conversations))
}

// GetMessageHistory 获取消息历史
func (mc *MessageController) GetMessageHistory(c *gin.Context) {
	var req models.GetHistoryRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		c.JSON(200, common.Fail("参数错误: "+err.Error()))
		return
	}

	if req.Page < 1 {
		req.Page = 1
	}
	if req.PageSize < 1 || req.PageSize > 100 {
		req.PageSize = 20
	}

	userID := c.MustGet("userID").(uint64)

	var messages []models.ChatMessage
	var total int64
	var err error

	if req.Type == 1 {
		// 单聊
		messages, total, err = mc.messageService.GetPrivateMessages(userID, req.TargetID, req.Page, req.PageSize)
	} else {
		// 群聊
		messages, total, err = mc.messageService.GetGroupMessages(userID, req.TargetID, req.Page, req.PageSize)
	}

	if err != nil {
		c.JSON(200, common.Fail(err.Error()))
		return
	}

	c.JSON(200, common.Success(gin.H{
		"list":      messages,
		"total":     total,
		"page":      req.Page,
		"page_size": req.PageSize,
	}))
}