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>> 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> updateUserStatus( @RequestParam String appId, @PathVariable String userId, @RequestBody Map 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>> listGroups(@RequestParam String appId) { return ResponseEntity.ok(ApiResponse.success(groupRepository.findByAppId(appId))); } /** Message statistics for the given appId. */ @GetMapping("/stats") public ResponseEntity>> 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 ))); } }