package com.xuqm.im.controller; import com.xuqm.common.model.ApiResponse; import com.xuqm.im.entity.ImGroupEntity; import com.xuqm.im.entity.ImGroupJoinRequestEntity; import com.xuqm.im.service.ImGroupService; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/im/groups") public class GroupController { private final ImGroupService groupService; public GroupController(ImGroupService groupService) { this.groupService = groupService; } @GetMapping("/{groupId}") public ResponseEntity> get( @PathVariable String groupId, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success(groupService.get(groupId, userId))); } @PostMapping public ResponseEntity> create( @RequestBody CreateGroupRequest req, @AuthenticationPrincipal String userId, @RequestParam String appId) { return ResponseEntity.ok(ApiResponse.success( groupService.create(appId, req.name(), userId, req.memberIds(), req.groupType()))); } @GetMapping public ResponseEntity>> list( @RequestParam String appId, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success(groupService.listUserGroups(appId, userId))); } @GetMapping("/public") public ResponseEntity>> listPublic( @RequestParam String appId, @RequestParam(required = false) String keyword) { return ResponseEntity.ok(ApiResponse.success(groupService.listPublicGroups(appId, keyword))); } @PutMapping("/{groupId}") public ResponseEntity> update( @PathVariable String groupId, @RequestBody UpdateGroupRequest req, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success( groupService.update(groupId, userId, req.name(), req.announcement()))); } @PostMapping("/{groupId}/members") public ResponseEntity> addMember( @PathVariable String groupId, @RequestBody MemberRequest req, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success(groupService.addMember(groupId, req.userId(), userId))); } @DeleteMapping("/{groupId}/members/{targetUserId}") public ResponseEntity> removeMember( @PathVariable String groupId, @PathVariable String targetUserId, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success(groupService.removeMember(groupId, targetUserId, userId))); } @PostMapping("/{groupId}/roles") public ResponseEntity> setRole( @PathVariable String groupId, @RequestBody SetRoleRequest req, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success( groupService.setRole(groupId, userId, req.userId(), req.role()))); } @PostMapping("/{groupId}/mute") public ResponseEntity> muteMember( @PathVariable String groupId, @RequestBody MuteMemberRequest req, @AuthenticationPrincipal String userId) { return ResponseEntity.ok(ApiResponse.success( groupService.muteMember(groupId, userId, req.userId(), req.minutes()))); } @DeleteMapping("/{groupId}") public ResponseEntity> dismiss( @PathVariable String groupId, @AuthenticationPrincipal String userId) { groupService.dismiss(groupId, userId); return ResponseEntity.ok(ApiResponse.ok()); } @PostMapping("/{groupId}/join-requests") public ResponseEntity> sendJoinRequest( @PathVariable String groupId, @AuthenticationPrincipal String userId, @RequestParam String appId, @RequestParam(required = false) String remark) { return ResponseEntity.ok(ApiResponse.success(groupService.sendJoinRequest(appId, groupId, userId, remark))); } @GetMapping("/{groupId}/join-requests") public ResponseEntity>> listJoinRequests( @PathVariable String groupId, @AuthenticationPrincipal String userId, @RequestParam String appId) { return ResponseEntity.ok(ApiResponse.success(groupService.listJoinRequests(appId, groupId, userId))); } @PostMapping("/{groupId}/join-requests/{requestId}/accept") public ResponseEntity> acceptJoinRequest( @PathVariable String groupId, @PathVariable String requestId, @AuthenticationPrincipal String userId, @RequestParam String appId) { return ResponseEntity.ok(ApiResponse.success(groupService.acceptJoinRequest(appId, requestId, userId))); } @PostMapping("/{groupId}/join-requests/{requestId}/reject") public ResponseEntity> rejectJoinRequest( @PathVariable String groupId, @PathVariable String requestId, @AuthenticationPrincipal String userId, @RequestParam String appId) { return ResponseEntity.ok(ApiResponse.success(groupService.rejectJoinRequest(appId, requestId, userId))); } public record CreateGroupRequest(String name, List memberIds, String groupType) {} public record UpdateGroupRequest(String name, String announcement) {} public record MemberRequest(String userId) {} public record SetRoleRequest(String userId, String role) {} public record MuteMemberRequest(String userId, long minutes) {} }