群聊接口

This commit is contained in:
2025-12-05 13:12:48 +08:00
parent 0f6f2f3675
commit 7d58b89f4e
8 changed files with 485 additions and 31 deletions

View File

@@ -5,6 +5,7 @@
package api
import (
"log"
"strconv"
"xk-websocket-v2/internal/model"
"xk-websocket-v2/internal/service"
@@ -116,6 +117,91 @@ func CreateChatGroupHandler(c *gin.Context) {
utils.SuccessWithData(c, room, "创建群聊成功")
}
/**
* ListUserGroupsHandler
* 功能:获取用户所在的所有群聊列表(带分组信息)
* 路径GET /api/groups
*/
func ListUserGroupsHandler(c *gin.Context) {
userID, exists := c.Get("user_id")
if !exists {
utils.Unauthorized(c, "未授权")
return
}
groups, members, err := service.RoomSvc.ListUserGroups(userID.(string))
if err != nil {
utils.InternalError(c, "查询失败")
return
}
// 确保返回空数组而不是null
if groups == nil {
groups = []model.ChatRoom{}
}
if members == nil {
members = []model.RoomMember{}
}
// 为每个群的所有成员创建缺失的会话记录
if service.ConversationSvc != nil {
for _, group := range groups {
if err := service.ConversationSvc.EnsureGroupConversations(group.RoomID); err != nil {
// 记录错误但不中断流程
log.Printf("⚠️ 创建群聊会话失败 (roomID: %s): %v", group.RoomID, err)
}
}
}
// 创建成员映射表,方便快速查找
memberMap := make(map[string]model.RoomMember)
for _, member := range members {
memberMap[member.RoomID] = member
}
// 转换为前端期望的格式,包含 category 和 role
result := make([]map[string]interface{}, 0, len(groups))
for _, group := range groups {
// 获取用户在群中的角色
member, exists := memberMap[group.RoomID]
if !exists {
continue // 跳过无法获取成员信息的群
}
// 确定分类created/managed/joined
category := "joined"
if group.CreatorID == userID.(string) {
category = "created"
} else if member.Role == 1 || member.Role == 2 {
category = "managed"
}
// 格式化时间
var lastMessageTime *string
if group.LastMessageTime != nil {
timeStr := group.LastMessageTime.Format("2006-01-02T15:04:05Z07:00")
lastMessageTime = &timeStr
}
result = append(result, map[string]interface{}{
"room_id": group.RoomID,
"room_type": group.RoomType,
"room_name": group.RoomName,
"room_avatar": group.RoomAvatar,
"owner_id": group.OwnerID,
"creator_id": group.CreatorID,
"category": category,
"role": int(member.Role),
"last_message_time": lastMessageTime,
"last_message": group.LastMessage,
"created_at": group.CreatedAt.Format("2006-01-02T15:04:05Z07:00"),
"updated_at": group.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"),
})
}
utils.SuccessWithData(c, result, "获取成功")
}
/**
* GetGroupInfoHandler
* 功能:获取群聊基础信息及成员数量
@@ -420,3 +506,52 @@ func GetGroupNotificationsHandler(c *gin.Context) {
"page_size": pageSize,
}, "获取成功")
}
/**
* GetGroupAnnouncementHandler
* 功能:获取群公告
* 路径GET /api/groups/:room_id/announcement
*/
func GetGroupAnnouncementHandler(c *gin.Context) {
roomID := c.Param("room_id")
announcement, err := service.RoomSvc.GetGroupAnnouncement(roomID)
if err != nil {
if err == gorm.ErrRecordNotFound {
utils.NotFound(c, "群聊不存在")
return
}
utils.InternalError(c, "查询失败")
return
}
utils.SuccessWithData(c, gin.H{
"announcement": announcement,
}, "获取成功")
}
/**
* UpdateGroupAnnouncementHandler
* 功能:更新群公告
* 路径POST /api/groups/:room_id/announcement
*/
func UpdateGroupAnnouncementHandler(c *gin.Context) {
userID, _ := c.Get("user_id")
roomID := c.Param("room_id")
var req struct {
Announcement string `json:"announcement" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, "参数错误: "+err.Error())
return
}
if err := service.RoomSvc.UpdateGroupAnnouncement(roomID, userID.(string), req.Announcement); err != nil {
utils.BadRequest(c, err.Error())
return
}
utils.Success(c, "更新成功")
}