群聊接口
This commit is contained in:
@@ -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, "更新成功")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user