feat(push): 添加租户侧推送管理接口
新增 PushManagementController,提供 /api/push/admin/** 接口供 租户平台查询用户设备在线状态、设备登录日志及发送测试离线推送。 在 PushDiagnosticsService 增加 searchByUserId 方法。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
父节点
a408b2b39a
当前提交
7dc00f18bf
@ -0,0 +1,67 @@
|
||||
package com.xuqm.push.controller;
|
||||
|
||||
import com.xuqm.common.model.ApiResponse;
|
||||
import com.xuqm.push.entity.DeviceLoginLogEntity;
|
||||
import com.xuqm.push.service.PushDiagnosticsService;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/push/admin")
|
||||
public class PushManagementController {
|
||||
|
||||
private final PushDiagnosticsService diagnosticsService;
|
||||
|
||||
public PushManagementController(PushDiagnosticsService diagnosticsService) {
|
||||
this.diagnosticsService = diagnosticsService;
|
||||
}
|
||||
|
||||
@GetMapping("/user-status")
|
||||
public ResponseEntity<ApiResponse<PushDiagnosticsService.PushTokenDiagnostics>> userStatus(
|
||||
@RequestParam String appId,
|
||||
@RequestParam String userId) {
|
||||
return ResponseEntity.ok(ApiResponse.success(diagnosticsService.searchByUserId(appId, userId)));
|
||||
}
|
||||
|
||||
@GetMapping("/device-logs")
|
||||
public ResponseEntity<ApiResponse<Map<String, Object>>> deviceLogs(
|
||||
@RequestParam String appId,
|
||||
@RequestParam String userId,
|
||||
@RequestParam(defaultValue = "0") int page,
|
||||
@RequestParam(defaultValue = "20") int size) {
|
||||
Page<DeviceLoginLogEntity> result = diagnosticsService.deviceLogs(appId, userId, page, size);
|
||||
return ResponseEntity.ok(ApiResponse.success(Map.of(
|
||||
"content", result.getContent(),
|
||||
"total", result.getTotalElements(),
|
||||
"totalPages", result.getTotalPages()
|
||||
)));
|
||||
}
|
||||
|
||||
@PostMapping("/test-offline")
|
||||
public ResponseEntity<ApiResponse<PushDiagnosticsService.TestPushResult>> testOffline(
|
||||
@RequestBody TestOfflineRequest request) {
|
||||
PushDiagnosticsService.TestPushResult result = diagnosticsService.sendTestOfflineMessage(
|
||||
request.appId(),
|
||||
request.userId(),
|
||||
request.title(),
|
||||
request.body(),
|
||||
request.payload());
|
||||
return ResponseEntity.ok(ApiResponse.success(result));
|
||||
}
|
||||
|
||||
public record TestOfflineRequest(
|
||||
String appId,
|
||||
String userId,
|
||||
String title,
|
||||
String body,
|
||||
String payload
|
||||
) {}
|
||||
}
|
||||
@ -90,6 +90,28 @@ public class PushDiagnosticsService {
|
||||
devices.stream().map(DeviceInfo::from).toList());
|
||||
}
|
||||
|
||||
public PushTokenDiagnostics searchByUserId(String appId, String userId) {
|
||||
ImPresenceClient.PresenceStatus presence = presenceClient.userStatus(appId, userId)
|
||||
.orElse(new ImPresenceClient.PresenceStatus(appId, userId, false, 0L));
|
||||
List<DeviceTokenEntity> devices = tokenRepository.findByAppIdAndUserIdOrderByLastLoginAtDescUpdatedAtDesc(appId, userId);
|
||||
List<DeviceInfo> deliverableDevices = pushDispatcher.selectedPushTargets(appId, userId)
|
||||
.stream()
|
||||
.map(DeviceInfo::from)
|
||||
.toList();
|
||||
DeviceInfo deliverable = deliverableDevices.isEmpty() ? null : deliverableDevices.get(0);
|
||||
boolean canSendOffline = !presence.online() && !deliverableDevices.isEmpty();
|
||||
return new PushTokenDiagnostics(
|
||||
"USER",
|
||||
appId,
|
||||
userId,
|
||||
presence.online(),
|
||||
presence.lastSeenAt(),
|
||||
canSendOffline,
|
||||
deliverable,
|
||||
deliverableDevices,
|
||||
devices.stream().map(DeviceInfo::from).toList());
|
||||
}
|
||||
|
||||
public TestPushResult sendTestOfflineMessage(String appId, String userId, String title, String body, String payload) {
|
||||
List<DeviceInfo> targets = pushDispatcher.selectedPushTargets(appId, userId)
|
||||
.stream()
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户