李寻欢 080fdb66ab
All checks were successful
BuildImage / build-image (push) Successful in 2m2s
🎨 添加定时任务调度,优化消息同步逻辑,更新相关API接口调用
2025-04-07 16:08:55 +08:00

132 lines
3.7 KiB
Go

package handler
import (
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
"strconv"
"gitee.ltd/lxh/wechat-robot/internal/model"
)
// ListContacts 列出机器人的联系人
func ListContacts(c *fiber.Ctx) error {
robotID, err := strconv.Atoi(c.Params("id"))
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, "无效的机器人ID")
}
var robot model.Robot
db := model.GetDB()
if err := db.First(&robot, robotID).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fiber.NewError(fiber.StatusNotFound, "机器人不存在")
}
return fiber.NewError(fiber.StatusInternalServerError, "查询数据库失败")
}
// 获取联系人列表
var contacts []model.Contact
if err = db.Where("robot_id = ?", robotID).Find(&contacts).Error; err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "获取联系人列表失败")
}
return c.Render("contact/index", fiber.Map{
"Title": "联系人列表",
"Robot": robot,
"Contacts": contacts,
})
}
// ShowContact 显示联系人详情与聊天记录
func ShowContact(c *fiber.Ctx) error {
robotID, err := strconv.Atoi(c.Params("id"))
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, "无效的机器人ID")
}
contactID, err := strconv.Atoi(c.Params("contactId"))
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, "无效的联系人ID")
}
db := model.GetDB()
// 获取机器人信息
var robot model.Robot
if err := db.First(&robot, robotID).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fiber.NewError(fiber.StatusNotFound, "机器人不存在")
}
return fiber.NewError(fiber.StatusInternalServerError, "查询机器人失败")
}
// 获取联系人信息
var contact model.Contact
if err := db.First(&contact, contactID).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return fiber.NewError(fiber.StatusNotFound, "联系人不存在")
}
return fiber.NewError(fiber.StatusInternalServerError, "查询联系人失败")
}
// 获取聊天记录
var messages []model.Message
if err := db.Where("robot_id = ? AND contact_id = ?", robotID, contactID).
Order("send_time DESC").Limit(50).Find(&messages).Error; err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "获取聊天记录失败")
}
return c.Render("contact/show", fiber.Map{
"Title": contact.Nickname,
"Robot": robot,
"Contact": contact,
"Messages": messages,
})
}
// ListGroupMembers 列出群成员
func ListGroupMembers(c *fiber.Ctx) error {
robotID, err := strconv.Atoi(c.Params("id"))
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, "无效的机器人ID")
}
contactID, err := strconv.Atoi(c.Params("contactId"))
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, "无效的联系人ID")
}
db := model.GetDB()
// 获取机器人信息
var robot model.Robot
if err := db.First(&robot, robotID).Error; err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "查询机器人失败")
}
// 获取联系人信息(群)
var contact model.Contact
if err := db.First(&contact, contactID).Error; err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "查询群信息失败")
}
// 确保联系人是群组
if contact.Type != model.ContactTypeGroup {
return fiber.NewError(fiber.StatusBadRequest, "指定的联系人不是群组")
}
// 获取群成员
var members []model.GroupMember
if err = db.Where("group_id = ?", contactID).Find(&members).Error; err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "获取群成员失败")
}
return c.Render("contact/members", fiber.Map{
"Title": contact.Nickname + " 群成员",
"Robot": robot,
"Contact": contact,
"Members": members,
})
}