XuqmGroup-Server/im-service/src/main/java/com/xuqm/im/controller/GroupController.java
XuqmGroup 73060518f0 feat(im): 添加即时通讯SDK核心功能
- 实现IM API接口定义,包括消息、群组、好友、黑名单等功能
- 定义IM消息相关数据模型,包含聊天类型、消息类型、用户资料等
- 实现ImSDK单例类,提供登录、消息发送、群组管理、好友管理等核心功能
- 添加WebSocket连接管理,支持自动重连机制
- 实现历史消息查询、群组操作、用户资料管理等API调用
- 添加会话状态管理,支持置顶、静音、草稿等功能
- 集成文件上传结果,支持多媒体消息发送
- 实现连接状态监听和事件回调机制
2026-04-28 21:05:06 +08:00

191 行
8.2 KiB
Java

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<ApiResponse<ImGroupEntity>> get(
@PathVariable String groupId,
@AuthenticationPrincipal String userId) {
return ResponseEntity.ok(ApiResponse.success(groupService.get(groupId, userId)));
}
@PostMapping
public ResponseEntity<ApiResponse<ImGroupEntity>> 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<ApiResponse<List<ImGroupEntity>>> list(
@RequestParam String appId,
@AuthenticationPrincipal String userId) {
return ResponseEntity.ok(ApiResponse.success(groupService.listUserGroups(appId, userId)));
}
@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)));
}
@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)));
}
@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())));
}
@PostMapping("/{groupId}/members")
public ResponseEntity<ApiResponse<ImGroupEntity>> addMember(
@PathVariable String groupId,
@RequestBody MemberRequest req,
@AuthenticationPrincipal String userId) {
return ResponseEntity.ok(ApiResponse.success(groupService.addMember(groupId, req.userId(), userId)));
}
@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)));
}
@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)));
}
@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)));
}
@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());
}
@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)));
}
@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)));
}
public record CreateGroupRequest(String name, List<String> memberIds, String groupType) {}
public record UpdateGroupRequest(String name, String announcement) {}
public record MemberRequest(String userId) {}
public record MemberBatchRequest(List<String> userIds) {}
public record SetRoleRequest(String userId, String role) {}
public record MuteMemberRequest(String userId, long minutes) {}
public record RequestBatch(List<String> requestIds) {}
}