踢出群成员
This commit is contained in:
@@ -81,7 +81,19 @@ public class OpsController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 群主设置管理员
|
* 踢出群成员
|
||||||
|
* <p>
|
||||||
|
* 操作人需为该群群主或管理员;同时从本地数据库和 OpenIM 移除成员。
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
@PostMapping("/group/kick")
|
||||||
|
public R<Void> kickGroup(@Valid @RequestBody GroupMemberOperateDTO dto) {
|
||||||
|
Long operatorId = UserContext.getUserId();
|
||||||
|
groupService.kickUser(dto.getGroupId(), dto.getUserId(), operatorId);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* 操作人需为该群群主;同时本地与 OpenIM 角色都会更新(OpenIM roleLevel=60=管理员),
|
* 操作人需为该群群主;同时本地与 OpenIM 角色都会更新(OpenIM roleLevel=60=管理员),
|
||||||
* OpenIM 同步失败会抛异常回滚本地事务,保证本地与 IM 角色一致。
|
* OpenIM 同步失败会抛异常回滚本地事务,保证本地与 IM 角色一致。
|
||||||
|
|||||||
@@ -219,8 +219,11 @@ public class GroupServiceImpl implements IGroupService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public void kickUser(Long groupId, Long targetUserId, Long operatorId) {
|
public void kickUser(Long groupId, Long targetUserId, Long operatorId) {
|
||||||
Group group = groupMapper.selectById(groupId);
|
Group group = groupMapper.selectById(groupId);
|
||||||
|
if (group == null) {
|
||||||
|
throw new RuntimeException("群组不存在");
|
||||||
|
}
|
||||||
|
|
||||||
// 检查权限
|
// 检查操作人权限
|
||||||
GroupMember operator = groupMemberMapper.selectOne(new LambdaQueryWrapper<GroupMember>()
|
GroupMember operator = groupMemberMapper.selectOne(new LambdaQueryWrapper<GroupMember>()
|
||||||
.eq(GroupMember::getGroupId, groupId)
|
.eq(GroupMember::getGroupId, groupId)
|
||||||
.eq(GroupMember::getUserId, operatorId));
|
.eq(GroupMember::getUserId, operatorId));
|
||||||
@@ -228,8 +231,6 @@ public class GroupServiceImpl implements IGroupService {
|
|||||||
if (operator == null) {
|
if (operator == null) {
|
||||||
throw new RuntimeException("你不是群成员");
|
throw new RuntimeException("你不是群成员");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 只有群主和管理员可以踢人
|
|
||||||
if (operator.getRole() != ROLE_OWNER && operator.getRole() != ROLE_ADMIN) {
|
if (operator.getRole() != ROLE_OWNER && operator.getRole() != ROLE_ADMIN) {
|
||||||
throw new RuntimeException("只有群主和管理员可以踢人");
|
throw new RuntimeException("只有群主和管理员可以踢人");
|
||||||
}
|
}
|
||||||
@@ -239,10 +240,18 @@ public class GroupServiceImpl implements IGroupService {
|
|||||||
throw new RuntimeException("不能踢出群主");
|
throw new RuntimeException("不能踢出群主");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除成员
|
GroupMember target = groupMemberMapper.selectOne(new LambdaQueryWrapper<GroupMember>()
|
||||||
groupMemberMapper.delete(new LambdaQueryWrapper<GroupMember>()
|
|
||||||
.eq(GroupMember::getGroupId, groupId)
|
.eq(GroupMember::getGroupId, groupId)
|
||||||
.eq(GroupMember::getUserId, targetUserId));
|
.eq(GroupMember::getUserId, targetUserId));
|
||||||
|
if (target == null) {
|
||||||
|
throw new RuntimeException("目标用户不是群成员");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 先同步 OpenIM,失败时事务回滚,避免本地与 IM 状态不一致
|
||||||
|
openIMApiClient.kickGroupMember(
|
||||||
|
String.valueOf(groupId), List.of(String.valueOf(targetUserId)));
|
||||||
|
|
||||||
|
groupMemberMapper.deleteById(target.getId());
|
||||||
|
|
||||||
// 审计日志
|
// 审计日志
|
||||||
auditService.log(groupId, null, operatorId, "KICK_USER",
|
auditService.log(groupId, null, operatorId, "KICK_USER",
|
||||||
|
|||||||
Reference in New Issue
Block a user