132 lines
3.7 KiB
Go
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,
|
|
})
|
|
}
|