From 2e697714635b49f2d9e11913715bad8086a59fa2 Mon Sep 17 00:00:00 2001 From: Timo Notheisen Date: Tue, 28 Jan 2025 13:26:50 +0100 Subject: [PATCH] refactor: filter for distinct handles in PushService instead of in the repository --- .../Persistence/Repository/IPnsRegistrationsRepository.cs | 2 +- .../Persistence/Repository/PnsRegistrationsRepository.cs | 6 ++---- .../Devices.Infrastructure/PushNotifications/PushService.cs | 6 ++++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Modules/Devices/src/Devices.Application/Infrastructure/Persistence/Repository/IPnsRegistrationsRepository.cs b/Modules/Devices/src/Devices.Application/Infrastructure/Persistence/Repository/IPnsRegistrationsRepository.cs index 0ab61578a2..6c3a99fe99 100644 --- a/Modules/Devices/src/Devices.Application/Infrastructure/Persistence/Repository/IPnsRegistrationsRepository.cs +++ b/Modules/Devices/src/Devices.Application/Infrastructure/Persistence/Repository/IPnsRegistrationsRepository.cs @@ -9,7 +9,7 @@ public interface IPnsRegistrationsRepository Task Add(PnsRegistration registration, CancellationToken cancellationToken); Task Update(PnsRegistration registration, CancellationToken cancellationToken); Task FindByDeviceId(DeviceId deviceId, CancellationToken cancellationToken, bool track = false); - Task> FindDistinctByDeviceIds(DeviceId[] deviceIds, CancellationToken cancellationToken, bool track = false); + Task FindByDeviceIds(DeviceId[] deviceIds, CancellationToken cancellationToken, bool track = false); Task Delete(List deviceIds, CancellationToken cancellationToken); Task Delete(Expression> filter, CancellationToken cancellationToken); } diff --git a/Modules/Devices/src/Devices.Infrastructure/Persistence/Repository/PnsRegistrationsRepository.cs b/Modules/Devices/src/Devices.Infrastructure/Persistence/Repository/PnsRegistrationsRepository.cs index 644129ce8e..55cfc539ea 100644 --- a/Modules/Devices/src/Devices.Infrastructure/Persistence/Repository/PnsRegistrationsRepository.cs +++ b/Modules/Devices/src/Devices.Infrastructure/Persistence/Repository/PnsRegistrationsRepository.cs @@ -42,13 +42,11 @@ public async Task Add(PnsRegistration registration, CancellationToken cancellati .FirstOrDefaultAsync(registration => registration.DeviceId == deviceId, cancellationToken); } - public async Task> FindDistinctByDeviceIds(DeviceId[] deviceIds, CancellationToken cancellationToken, bool track = false) + public async Task FindByDeviceIds(DeviceId[] deviceIds, CancellationToken cancellationToken, bool track = false) { return await (track ? _registrations : _readonlyRegistrations) .Where(r => deviceIds.Contains(r.DeviceId)) - .GroupBy(r => r.Handle) - .Select(g => g.First()) - .ToListAsync(cancellationToken); + .ToArrayAsync(cancellationToken); } public async Task Delete(List deviceIds, CancellationToken cancellationToken) diff --git a/Modules/Devices/src/Devices.Infrastructure/PushNotifications/PushService.cs b/Modules/Devices/src/Devices.Infrastructure/PushNotifications/PushService.cs index 563f80c875..b0e6ed0878 100644 --- a/Modules/Devices/src/Devices.Infrastructure/PushNotifications/PushService.cs +++ b/Modules/Devices/src/Devices.Infrastructure/PushNotifications/PushService.cs @@ -69,9 +69,11 @@ private async Task SendNotificationInternal(IPushNotification notification, Devi { var deviceIds = devices.Select(d => d.Id).ToArray(); - var registrations = await _pnsRegistrationsRepository.FindDistinctByDeviceIds(deviceIds, cancellationToken); + var registrations = await _pnsRegistrationsRepository.FindByDeviceIds(deviceIds, cancellationToken); - var groups = registrations.GroupBy(registration => registration.Handle.Platform); + var groups = registrations + .DistinctBy(r => r.Handle) // Since there can be multiple registrations with the same handle, we should make sure we send the same push notification only once per handle + .GroupBy(r => r.Handle.Platform); foreach (var group in groups) {