XuqmGroup-Server/im-service/src/main/java/com/xuqm/im/controller/ImAdminController.java
XuqmGroup 3285dfe79c feat: admin APIs for IM management and version management
- ImAdminController: list users (paged), ban/unban, list groups, message stats
- ImMessageRepository: countByAppId, countTodayByAppId
- AppVersionController: unpublish + gray release (grayEnabled, grayPercent)
- RnBundleController: list, unpublish, gray release
- AppVersionEntity/RnBundleEntity: add grayEnabled, grayPercent fields

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 16:16:33 +08:00

77 行
3.2 KiB
Java

package com.xuqm.im.controller;
import com.xuqm.common.model.ApiResponse;
import com.xuqm.im.entity.ImAccountEntity;
import com.xuqm.im.entity.ImGroupEntity;
import com.xuqm.im.repository.ImAccountRepository;
import com.xuqm.im.repository.ImGroupRepository;
import com.xuqm.im.repository.ImMessageRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/im/admin")
public class ImAdminController {
private final ImAccountRepository accountRepository;
private final ImGroupRepository groupRepository;
private final ImMessageRepository messageRepository;
public ImAdminController(ImAccountRepository accountRepository,
ImGroupRepository groupRepository,
ImMessageRepository messageRepository) {
this.accountRepository = accountRepository;
this.groupRepository = groupRepository;
this.messageRepository = messageRepository;
}
/** List all registered IM users for the given appId. */
@GetMapping("/users")
public ResponseEntity<ApiResponse<Page<ImAccountEntity>>> listUsers(
@RequestParam String appId,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
return ResponseEntity.ok(ApiResponse.success(
accountRepository.findByAppId(appId, PageRequest.of(page, size))));
}
/** Ban or unban a user. */
@PutMapping("/users/{userId}/status")
public ResponseEntity<ApiResponse<ImAccountEntity>> updateUserStatus(
@RequestParam String appId,
@PathVariable String userId,
@RequestBody Map<String, String> body) {
ImAccountEntity account = accountRepository.findByAppIdAndUserId(appId, userId)
.orElseThrow(() -> new RuntimeException("User not found"));
account.setStatus(ImAccountEntity.Status.valueOf(body.get("status").toUpperCase()));
return ResponseEntity.ok(ApiResponse.success(accountRepository.save(account)));
}
/** List all groups for the given appId. */
@GetMapping("/groups")
public ResponseEntity<ApiResponse<List<ImGroupEntity>>> listGroups(@RequestParam String appId) {
return ResponseEntity.ok(ApiResponse.success(groupRepository.findByAppId(appId)));
}
/** Message statistics for the given appId. */
@GetMapping("/stats")
public ResponseEntity<ApiResponse<Map<String, Object>>> stats(@RequestParam String appId) {
long totalMessages = messageRepository.countByAppId(appId);
long totalUsers = accountRepository.countByAppId(appId);
long totalGroups = groupRepository.countByAppId(appId);
long todayMessages = messageRepository.countTodayByAppId(appId);
return ResponseEntity.ok(ApiResponse.success(Map.of(
"totalMessages", totalMessages,
"totalUsers", totalUsers,
"totalGroups", totalGroups,
"todayMessages", todayMessages
)));
}
}