From b89cd35b155ea99b7b7de1a06995bc7e77c27295 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Wed, 29 Apr 2026 10:04:17 +0800 Subject: [PATCH] feat(im): add tenant admin edit flows --- .../xuqm/im/controller/GroupController.java | 6 +- .../xuqm/im/controller/ImAdminController.java | 68 +++++++++++++++++-- .../com/xuqm/im/service/ImAccountService.java | 15 ++++ .../com/xuqm/im/service/ImGroupService.java | 15 +++- 4 files changed, 92 insertions(+), 12 deletions(-) diff --git a/im-service/src/main/java/com/xuqm/im/controller/GroupController.java b/im-service/src/main/java/com/xuqm/im/controller/GroupController.java index 84f877f..548112f 100644 --- a/im-service/src/main/java/com/xuqm/im/controller/GroupController.java +++ b/im-service/src/main/java/com/xuqm/im/controller/GroupController.java @@ -34,7 +34,7 @@ public class GroupController { @AuthenticationPrincipal String userId, @RequestParam String appId) { return ResponseEntity.ok(ApiResponse.success( - groupService.create(appId, req.name(), userId, req.memberIds(), req.groupType()))); + groupService.create(appId, req.name(), userId, req.memberIds(), req.groupType(), null))); } @GetMapping @@ -83,7 +83,7 @@ public class GroupController { @RequestBody UpdateGroupRequest req, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success( - groupService.update(groupId, userId, req.name(), req.announcement()))); + groupService.update(groupId, userId, req.name(), req.groupType(), req.announcement()))); } @PostMapping("/{groupId}/members") @@ -200,7 +200,7 @@ public class GroupController { } public record CreateGroupRequest(String name, List memberIds, String groupType) {} - public record UpdateGroupRequest(String name, String announcement) {} + public record UpdateGroupRequest(String name, String groupType, String announcement) {} public record MemberRequest(String userId) {} public record MemberBatchRequest(List userIds) {} public record SetRoleRequest(String userId, String role) {} diff --git a/im-service/src/main/java/com/xuqm/im/controller/ImAdminController.java b/im-service/src/main/java/com/xuqm/im/controller/ImAdminController.java index 2ed278c..fa92dde 100644 --- a/im-service/src/main/java/com/xuqm/im/controller/ImAdminController.java +++ b/im-service/src/main/java/com/xuqm/im/controller/ImAdminController.java @@ -89,6 +89,24 @@ public class ImAdminController { return ResponseEntity.ok(ApiResponse.success(saved)); } + /** Update a registered IM user profile without changing userId. */ + @PutMapping("/users/{userId}") + public ResponseEntity> updateUser( + @RequestParam String appId, + @PathVariable String userId, + @AuthenticationPrincipal String operatorId, + @RequestBody UpdateUserRequest req) { + ImAccountEntity saved = accountService.updateAccount( + appId, + userId, + req.nickname(), + req.avatar(), + req.gender(), + req.status()); + operationLogService.record(appId, operatorId, "UPDATE_USER", "ACCOUNT", userId, req.nickname()); + return ResponseEntity.ok(ApiResponse.success(saved)); + } + /** List all groups for the given appId. */ @GetMapping("/groups") public ResponseEntity>> listGroups(@RequestParam String appId) { @@ -101,9 +119,13 @@ public class ImAdminController { @RequestParam String appId, @AuthenticationPrincipal String operatorId, @RequestBody RegisterUserRequest req) { - accountService.loginOrRegister(appId, req.userId(), req.nickname(), req.avatar()); - ImAccountEntity account = accountRepository.findByAppIdAndUserId(appId, req.userId()) - .orElseThrow(); + ImAccountEntity account = accountService.importAccount( + appId, + req.userId(), + req.nickname(), + req.avatar(), + req.gender(), + req.status()); operationLogService.record(appId, operatorId, "REGISTER_USER", "ACCOUNT", req.userId(), req.nickname()); return ResponseEntity.ok(ApiResponse.success(account)); } @@ -114,11 +136,34 @@ public class ImAdminController { @RequestParam String appId, @AuthenticationPrincipal String operatorId, @RequestBody CreateGroupRequest req) { - ImGroupEntity group = groupService.create(appId, req.name(), req.creatorId(), req.memberIds(), "WORK"); + ImGroupEntity group = groupService.create( + appId, + req.name(), + req.creatorId(), + req.memberIds(), + req.groupType(), + req.announcement()); operationLogService.record(appId, operatorId, "CREATE_GROUP", "GROUP", group.getId(), group.getName()); return ResponseEntity.ok(ApiResponse.success(group)); } + /** Admin updates a group without changing its id. */ + @PutMapping("/groups/{groupId}") + public ResponseEntity> updateGroup( + @RequestParam String appId, + @PathVariable String groupId, + @AuthenticationPrincipal String operatorId, + @RequestBody UpdateGroupRequest req) { + ImGroupEntity group = groupService.update( + groupId, + operatorId, + req.name(), + req.groupType(), + req.announcement()); + operationLogService.record(appId, operatorId, "UPDATE_GROUP", "GROUP", groupId, req.name()); + return ResponseEntity.ok(ApiResponse.success(group)); + } + /** Fuzzy search users by userId or nickname. */ @GetMapping("/users/search") public ResponseEntity>> searchUsers( @@ -317,8 +362,19 @@ public class ImAdminController { operationLogService.list(appId, PageRequest.of(page, size)))); } - public record RegisterUserRequest(String userId, String nickname, String avatar) {} - public record CreateGroupRequest(String name, String creatorId, List memberIds) {} + public record RegisterUserRequest( + String userId, + String nickname, + String avatar, + ImAccountEntity.Gender gender, + ImAccountEntity.Status status) {} + public record UpdateUserRequest( + String nickname, + String avatar, + ImAccountEntity.Gender gender, + ImAccountEntity.Status status) {} + public record CreateGroupRequest(String name, String creatorId, List memberIds, String groupType, String announcement) {} + public record UpdateGroupRequest(String name, String groupType, String announcement) {} public record WebhookConfigRequest(String url, String secret, Boolean enabled) {} public record KeywordFilterRequest(String pattern, String replacement, String action, Boolean enabled) {} } diff --git a/im-service/src/main/java/com/xuqm/im/service/ImAccountService.java b/im-service/src/main/java/com/xuqm/im/service/ImAccountService.java index 8a85d89..f61e310 100644 --- a/im-service/src/main/java/com/xuqm/im/service/ImAccountService.java +++ b/im-service/src/main/java/com/xuqm/im/service/ImAccountService.java @@ -90,6 +90,21 @@ public class ImAccountService { return accountRepository.save(account); } + public ImAccountEntity updateAccount( + String appId, + String userId, + String nickname, + String avatar, + ImAccountEntity.Gender gender, + ImAccountEntity.Status status) { + ImAccountEntity account = getAccount(appId, userId); + if (nickname != null) account.setNickname(nickname); + if (avatar != null) account.setAvatar(avatar); + if (gender != null) account.setGender(gender); + if (status != null) account.setStatus(status); + return accountRepository.save(account); + } + public ImAccountEntity importAccount(String appId, String userId, String nickname, String avatar, ImAccountEntity.Gender gender, ImAccountEntity.Status status) { diff --git a/im-service/src/main/java/com/xuqm/im/service/ImGroupService.java b/im-service/src/main/java/com/xuqm/im/service/ImGroupService.java index a228e68..753eb14 100644 --- a/im-service/src/main/java/com/xuqm/im/service/ImGroupService.java +++ b/im-service/src/main/java/com/xuqm/im/service/ImGroupService.java @@ -54,7 +54,13 @@ public class ImGroupService { } @Transactional - public ImGroupEntity create(String appId, String name, String creatorId, List memberIds, String groupType) { + public ImGroupEntity create( + String appId, + String name, + String creatorId, + List memberIds, + String groupType, + String announcement) { List members = new ArrayList<>(memberIds); if (!members.contains(creatorId)) members.add(creatorId); @@ -66,7 +72,7 @@ public class ImGroupService { group.setCreatorId(creatorId); group.setMemberIds(toJson(members)); group.setAdminIds(toJson(List.of(creatorId))); - group.setAnnouncement(null); + group.setAnnouncement(announcement); group.setCreatedAt(LocalDateTime.now()); return groupRepository.save(group); } @@ -155,12 +161,15 @@ public class ImGroupService { } @Transactional - public ImGroupEntity update(String groupId, String operatorId, String name, String announcement) { + public ImGroupEntity update(String groupId, String operatorId, String name, String groupType, String announcement) { ImGroupEntity group = get(groupId); ensureCanManage(group, operatorId); if (name != null && !name.isBlank()) { group.setName(name); } + if (groupType != null && !groupType.isBlank()) { + group.setGroupType(normalizeGroupType(groupType)); + } if (announcement != null) { group.setAnnouncement(announcement); }