群聊接口
This commit is contained in:
@@ -5,10 +5,12 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"xk-websocket-v2/internal/model"
|
||||
"xk-websocket-v2/internal/service"
|
||||
"xk-websocket-v2/internal/utils"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
/**
|
||||
@@ -20,10 +22,10 @@ func CreateRoomHandler(c *gin.Context) {
|
||||
userID, _ := c.Get("user_id")
|
||||
|
||||
var req struct {
|
||||
RoomType string `json:"room_type" binding:"required,oneof=p2p group"`
|
||||
Members []string `json:"members" binding:"required"`
|
||||
RoomName string `json:"room_name"`
|
||||
RoomAvatar string `json:"room_avatar"`
|
||||
RoomType string `json:"room_type" binding:"required,oneof=p2p group"`
|
||||
Members []string `json:"members" binding:"required"`
|
||||
RoomName string `json:"room_name"`
|
||||
RoomAvatar string `json:"room_avatar"`
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
@@ -69,3 +71,236 @@ func GetRoomHandler(c *gin.Context) {
|
||||
utils.SuccessWithData(c, room, "获取成功")
|
||||
}
|
||||
|
||||
/**
|
||||
* CreateChatGroupHandler
|
||||
* 功能:创建群聊
|
||||
* 路径:POST /api/groups
|
||||
*/
|
||||
func CreateChatGroupHandler(c *gin.Context) {
|
||||
userID, _ := c.Get("user_id")
|
||||
|
||||
var req struct {
|
||||
Name string `json:"name" binding:"required"`
|
||||
Avatar string `json:"avatar"`
|
||||
MemberIDs []string `json:"member_ids" binding:"required"`
|
||||
AdminIDs []string `json:"admin_ids"`
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
utils.BadRequest(c, "参数错误: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
creatorID := userID.(string)
|
||||
members := req.MemberIDs
|
||||
|
||||
// 确保创建者在成员列表中
|
||||
found := false
|
||||
for _, id := range members {
|
||||
if id == creatorID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
members = append(members, creatorID)
|
||||
}
|
||||
|
||||
room, err := service.RoomSvc.CreateGroupRoom(creatorID, members, req.Name, req.Avatar, req.AdminIDs)
|
||||
if err != nil {
|
||||
utils.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
utils.SuccessWithData(c, room, "创建群聊成功")
|
||||
}
|
||||
|
||||
/**
|
||||
* GetGroupInfoHandler
|
||||
* 功能:获取群聊基础信息及成员数量
|
||||
* 路径:GET /api/groups/:room_id
|
||||
*/
|
||||
func GetGroupInfoHandler(c *gin.Context) {
|
||||
roomID := c.Param("room_id")
|
||||
|
||||
room, err := service.RoomSvc.GetRoom(roomID)
|
||||
if err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
utils.NotFound(c, "群聊不存在")
|
||||
return
|
||||
}
|
||||
utils.InternalError(c, "查询失败")
|
||||
return
|
||||
}
|
||||
|
||||
members, err := service.RoomSvc.ListGroupMembers(roomID)
|
||||
if err != nil {
|
||||
utils.InternalError(c, "查询成员失败")
|
||||
return
|
||||
}
|
||||
|
||||
// 统计管理员ID
|
||||
adminIDs := make([]string, 0)
|
||||
for _, m := range members {
|
||||
if m.Role == 1 {
|
||||
adminIDs = append(adminIDs, m.UserID)
|
||||
}
|
||||
}
|
||||
|
||||
utils.SuccessWithData(c, gin.H{
|
||||
"room": room,
|
||||
"member_count": len(members),
|
||||
"admin_ids": adminIDs,
|
||||
"owner_id": room.OwnerID,
|
||||
}, "获取成功")
|
||||
}
|
||||
|
||||
/**
|
||||
* ListGroupMembersHandler
|
||||
* 功能:获取群成员列表
|
||||
* 路径:GET /api/groups/:room_id/members
|
||||
*/
|
||||
func ListGroupMembersHandler(c *gin.Context) {
|
||||
roomID := c.Param("room_id")
|
||||
|
||||
members, err := service.RoomSvc.ListGroupMembers(roomID)
|
||||
if err != nil {
|
||||
utils.InternalError(c, "查询失败")
|
||||
return
|
||||
}
|
||||
|
||||
utils.SuccessWithData(c, members, "获取成功")
|
||||
}
|
||||
|
||||
/**
|
||||
* AddGroupMembersHandler
|
||||
* 功能:邀请/拉人入群
|
||||
* 路径:POST /api/groups/:room_id/members
|
||||
*/
|
||||
func AddGroupMembersHandler(c *gin.Context) {
|
||||
userID, _ := c.Get("user_id")
|
||||
roomID := c.Param("room_id")
|
||||
|
||||
var req struct {
|
||||
MemberIDs []string `json:"member_ids" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
utils.BadRequest(c, "参数错误: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if err := service.RoomSvc.AddGroupMembers(roomID, userID.(string), req.MemberIDs); err != nil {
|
||||
utils.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
utils.Success(c, "添加成员成功")
|
||||
}
|
||||
|
||||
/**
|
||||
* RemoveGroupMemberHandler
|
||||
* 功能:移除群成员或退群
|
||||
* 路径:DELETE /api/groups/:room_id/members/:user_id
|
||||
*/
|
||||
func RemoveGroupMemberHandler(c *gin.Context) {
|
||||
operatorID, _ := c.Get("user_id")
|
||||
roomID := c.Param("room_id")
|
||||
memberID := c.Param("user_id")
|
||||
|
||||
// 自己移除自己 = 退群
|
||||
if operatorID.(string) == memberID {
|
||||
if err := service.RoomSvc.QuitGroup(roomID, memberID); err != nil {
|
||||
utils.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
utils.Success(c, "已退出群聊")
|
||||
return
|
||||
}
|
||||
|
||||
// 否则为管理员/群主踢人
|
||||
if err := service.RoomSvc.RemoveGroupMember(roomID, operatorID.(string), memberID); err != nil {
|
||||
utils.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
utils.Success(c, "已移除成员")
|
||||
}
|
||||
|
||||
/**
|
||||
* UpdateGroupInfoHandler
|
||||
* 功能:修改群名称/头像
|
||||
* 路径:PATCH /api/groups/:room_id
|
||||
*/
|
||||
func UpdateGroupInfoHandler(c *gin.Context) {
|
||||
userID, _ := c.Get("user_id")
|
||||
roomID := c.Param("room_id")
|
||||
|
||||
var req struct {
|
||||
Name string `json:"name"`
|
||||
Avatar string `json:"avatar"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
utils.BadRequest(c, "参数错误: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// 仅群主或管理员可修改群信息
|
||||
ok, err := service.RoomSvc.IsGroupAdminOrOwner(roomID, userID.(string))
|
||||
if err != nil {
|
||||
utils.InternalError(c, "权限校验失败")
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
utils.Forbidden(c, "无权限修改群信息")
|
||||
return
|
||||
}
|
||||
|
||||
updates := make(map[string]interface{})
|
||||
if req.Name != "" {
|
||||
updates["room_name"] = req.Name
|
||||
}
|
||||
if req.Avatar != "" {
|
||||
updates["room_avatar"] = req.Avatar
|
||||
}
|
||||
|
||||
if len(updates) == 0 {
|
||||
utils.BadRequest(c, "没有可更新的字段")
|
||||
return
|
||||
}
|
||||
|
||||
// 更新群基础信息
|
||||
if err := service.RoomSvc.DB.Model(&model.ChatRoom{}).
|
||||
Where("room_id = ?", roomID).
|
||||
Updates(updates).Error; err != nil {
|
||||
utils.InternalError(c, "更新失败")
|
||||
return
|
||||
}
|
||||
|
||||
utils.Success(c, "更新成功")
|
||||
}
|
||||
|
||||
/**
|
||||
* ChangeMemberRoleHandler
|
||||
* 功能:调整成员角色
|
||||
* 路径:PATCH /api/groups/:room_id/members/:user_id/role
|
||||
*/
|
||||
func ChangeMemberRoleHandler(c *gin.Context) {
|
||||
operatorID, _ := c.Get("user_id")
|
||||
roomID := c.Param("room_id")
|
||||
memberID := c.Param("user_id")
|
||||
|
||||
var req struct {
|
||||
Role int8 `json:"role" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
utils.BadRequest(c, "参数错误: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if err := service.RoomSvc.ChangeMemberRole(roomID, operatorID.(string), memberID, req.Role); err != nil {
|
||||
utils.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
utils.Success(c, "角色已更新")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user