2026-04-24 11:14:47 +08:00
|
|
|
package com.xuqm.im.controller;
|
|
|
|
|
|
|
|
|
|
import com.xuqm.common.model.ApiResponse;
|
|
|
|
|
import com.xuqm.im.entity.ImGroupEntity;
|
2026-04-28 09:45:20 +08:00
|
|
|
import com.xuqm.im.entity.ImGroupJoinRequestEntity;
|
2026-04-24 11:14:47 +08:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-27 23:41:58 +08:00
|
|
|
@GetMapping("/{groupId}")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> get(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.get(groupId, userId)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-24 11:14:47 +08:00
|
|
|
@PostMapping
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> create(
|
|
|
|
|
@RequestBody CreateGroupRequest req,
|
|
|
|
|
@AuthenticationPrincipal String userId,
|
|
|
|
|
@RequestParam String appId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(
|
2026-04-28 09:45:20 +08:00
|
|
|
groupService.create(appId, req.name(), userId, req.memberIds(), req.groupType())));
|
2026-04-24 11:14:47 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@GetMapping
|
|
|
|
|
public ResponseEntity<ApiResponse<List<ImGroupEntity>>> list(
|
2026-04-27 11:57:46 +08:00
|
|
|
@RequestParam String appId,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.listUserGroups(appId, userId)));
|
2026-04-24 11:14:47 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-28 09:45:20 +08:00
|
|
|
@GetMapping("/public")
|
|
|
|
|
public ResponseEntity<ApiResponse<List<ImGroupEntity>>> listPublic(
|
|
|
|
|
@RequestParam String appId,
|
|
|
|
|
@RequestParam(required = false) String keyword) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.listPublicGroups(appId, keyword)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 20:11:38 +08:00
|
|
|
@GetMapping("/search")
|
|
|
|
|
public ResponseEntity<ApiResponse<List<ImGroupEntity>>> search(
|
|
|
|
|
@RequestParam String appId,
|
|
|
|
|
@RequestParam String keyword,
|
|
|
|
|
@RequestParam(defaultValue = "20") int size) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.searchGroups(appId, keyword, size)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-27 23:41:58 +08:00
|
|
|
@PutMapping("/{groupId}")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> update(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@RequestBody UpdateGroupRequest req,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(
|
|
|
|
|
groupService.update(groupId, userId, req.name(), req.announcement())));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-24 11:14:47 +08:00
|
|
|
@PostMapping("/{groupId}/members")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> addMember(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@RequestBody MemberRequest req,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
2026-04-27 23:41:58 +08:00
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.addMember(groupId, req.userId(), userId)));
|
2026-04-24 11:14:47 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-28 21:05:06 +08:00
|
|
|
@PostMapping("/{groupId}/members/batch")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> addMembers(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@RequestBody MemberBatchRequest req,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.addMembers(groupId, req.userIds(), userId)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-24 11:14:47 +08:00
|
|
|
@DeleteMapping("/{groupId}/members/{targetUserId}")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> removeMember(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@PathVariable String targetUserId,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.removeMember(groupId, targetUserId, userId)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 21:05:06 +08:00
|
|
|
@PostMapping("/{groupId}/members/batch/remove")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> removeMembers(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@RequestBody MemberBatchRequest req,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.removeMembers(groupId, req.userIds(), userId)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-27 23:41:58 +08:00
|
|
|
@PostMapping("/{groupId}/roles")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupEntity>> 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<ApiResponse<ImGroupEntity>> 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<ApiResponse<Void>> dismiss(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@AuthenticationPrincipal String userId) {
|
|
|
|
|
groupService.dismiss(groupId, userId);
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.ok());
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 09:45:20 +08:00
|
|
|
@PostMapping("/{groupId}/join-requests")
|
|
|
|
|
public ResponseEntity<ApiResponse<ImGroupJoinRequestEntity>> 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<ApiResponse<List<ImGroupJoinRequestEntity>>> 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<ApiResponse<ImGroupJoinRequestEntity>> 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<ApiResponse<ImGroupJoinRequestEntity>> rejectJoinRequest(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@PathVariable String requestId,
|
|
|
|
|
@AuthenticationPrincipal String userId,
|
|
|
|
|
@RequestParam String appId) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(groupService.rejectJoinRequest(appId, requestId, userId)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 21:05:06 +08:00
|
|
|
@PostMapping("/{groupId}/join-requests/batch/accept")
|
|
|
|
|
public ResponseEntity<ApiResponse<List<ImGroupJoinRequestEntity>>> acceptJoinRequests(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@AuthenticationPrincipal String userId,
|
|
|
|
|
@RequestParam String appId,
|
|
|
|
|
@RequestBody RequestBatch req) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(
|
|
|
|
|
groupService.acceptJoinRequests(appId, groupId, req.requestIds(), userId)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/{groupId}/join-requests/batch/reject")
|
|
|
|
|
public ResponseEntity<ApiResponse<List<ImGroupJoinRequestEntity>>> rejectJoinRequests(
|
|
|
|
|
@PathVariable String groupId,
|
|
|
|
|
@AuthenticationPrincipal String userId,
|
|
|
|
|
@RequestParam String appId,
|
|
|
|
|
@RequestBody RequestBatch req) {
|
|
|
|
|
return ResponseEntity.ok(ApiResponse.success(
|
|
|
|
|
groupService.rejectJoinRequests(appId, groupId, req.requestIds(), userId)));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 09:45:20 +08:00
|
|
|
public record CreateGroupRequest(String name, List<String> memberIds, String groupType) {}
|
2026-04-27 23:41:58 +08:00
|
|
|
public record UpdateGroupRequest(String name, String announcement) {}
|
2026-04-24 11:14:47 +08:00
|
|
|
public record MemberRequest(String userId) {}
|
2026-04-28 21:05:06 +08:00
|
|
|
public record MemberBatchRequest(List<String> userIds) {}
|
2026-04-27 23:41:58 +08:00
|
|
|
public record SetRoleRequest(String userId, String role) {}
|
|
|
|
|
public record MuteMemberRequest(String userId, long minutes) {}
|
2026-04-28 21:05:06 +08:00
|
|
|
public record RequestBatch(List<String> requestIds) {}
|
2026-04-24 11:14:47 +08:00
|
|
|
}
|