diff --git a/push-service/src/main/java/com/xuqm/push/repository/DeviceTokenRepository.java b/push-service/src/main/java/com/xuqm/push/repository/DeviceTokenRepository.java index 898f4a6..7ccd495 100644 --- a/push-service/src/main/java/com/xuqm/push/repository/DeviceTokenRepository.java +++ b/push-service/src/main/java/com/xuqm/push/repository/DeviceTokenRepository.java @@ -19,8 +19,8 @@ public interface DeviceTokenRepository extends JpaRepository findByAppKeyAndUserIdOrderByLastLoginAtDescUpdatedAtDesc(String appKey, String userId); void deleteByAppKeyAndUserIdAndVendor(String appKey, String userId, DeviceTokenEntity.Vendor vendor); void deleteByAppKeyAndUserIdAndDeviceId(String appKey, String userId, String deviceId); - // Find device by appKey+deviceId regardless of userId (for cross-user eviction) - Optional findByAppKeyAndDeviceId(String appKey, String deviceId); - // Find device by appKey+token regardless of userId (token rotation detection) - Optional findByAppKeyAndToken(String appKey, String token); + // Find all entries for this device across all users (for cross-user eviction) + List findByAppKeyAndDeviceId(String appKey, String deviceId); + // Find all entries for this token across all users (token rotation detection) + List findByAppKeyAndToken(String appKey, String token); } diff --git a/push-service/src/main/java/com/xuqm/push/service/PushDispatcher.java b/push-service/src/main/java/com/xuqm/push/service/PushDispatcher.java index bb15aa9..cfa36a2 100644 --- a/push-service/src/main/java/com/xuqm/push/service/PushDispatcher.java +++ b/push-service/src/main/java/com/xuqm/push/service/PushDispatcher.java @@ -247,18 +247,18 @@ public class PushDispatcher { String romVersion) { String resolvedDeviceId = normalizeDeviceId(deviceId, vendor, token); - // Evict previous owner: if this device (by deviceId OR token) is registered to another user, remove it - tokenRepository.findByAppKeyAndDeviceId(appKey, resolvedDeviceId) + // Evict all other users who hold this device (by deviceId) or this token + tokenRepository.findByAppKeyAndDeviceId(appKey, resolvedDeviceId).stream() .filter(prev -> !userId.equals(prev.getUserId())) - .ifPresent(prev -> { - log.info("Device {} re-registered by new user={}, evicting previous user={}", resolvedDeviceId, userId, prev.getUserId()); + .forEach(prev -> { + log.info("Device {} re-registered by user={}, evicting previous user={}", resolvedDeviceId, userId, prev.getUserId()); recordLog(prev, DeviceLoginLogEntity.EventType.UNREGISTER); tokenRepository.delete(prev); }); - tokenRepository.findByAppKeyAndToken(appKey, token) + tokenRepository.findByAppKeyAndToken(appKey, token).stream() .filter(prev -> !userId.equals(prev.getUserId())) - .ifPresent(prev -> { - log.info("Token re-registered by new user={}, evicting previous user={} deviceId={}", userId, prev.getUserId(), prev.getDeviceId()); + .forEach(prev -> { + log.info("Token re-registered by user={}, evicting previous user={} deviceId={}", userId, prev.getUserId(), prev.getDeviceId()); recordLog(prev, DeviceLoginLogEntity.EventType.UNREGISTER); tokenRepository.delete(prev); });