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 com.xuqm.im.service.ImAccountService; import com.xuqm.im.service.ImGroupService; 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; private final ImAccountService accountService; private final ImGroupService groupService; public ImAdminController(ImAccountRepository accountRepository, ImGroupRepository groupRepository, ImMessageRepository messageRepository, ImAccountService accountService, ImGroupService groupService) { this.accountRepository = accountRepository; this.groupRepository = groupRepository; this.messageRepository = messageRepository; this.accountService = accountService; this.groupService = groupService; } /** 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))); } /** Admin registers a new IM user (or returns existing). */ @PostMapping("/users") public ResponseEntity> registerUser( @RequestParam String appId, @RequestBody RegisterUserRequest req) { accountService.loginOrRegister(appId, req.userId(), req.nickname(), req.avatar()); ImAccountEntity account = accountRepository.findByAppIdAndUserId(appId, req.userId()) .orElseThrow(); return ResponseEntity.ok(ApiResponse.success(account)); } /** Admin creates a group. */ @PostMapping("/groups") public ResponseEntity> createGroup( @RequestParam String appId, @RequestBody CreateGroupRequest req) { return ResponseEntity.ok(ApiResponse.success( groupService.create(appId, req.name(), req.creatorId(), req.memberIds()))); } /** 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 ))); } public record RegisterUserRequest(String userId, String nickname, String avatar) {} public record CreateGroupRequest(String name, String creatorId, List memberIds) {} }