From 9019ead439a9e28c8682f6e884acc042a5214e4f Mon Sep 17 00:00:00 2001 From: droideparanoico Date: Wed, 15 Jul 2026 16:23:45 +0200 Subject: [PATCH] Atomic swap on type toggle --- .../persistence/ReleaseGroupRepository.java | 22 +++++++++++++++ .../java/io/discdrop/service/SyncService.java | 27 +++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/discdrop/persistence/ReleaseGroupRepository.java b/src/main/java/io/discdrop/persistence/ReleaseGroupRepository.java index d043913..1ab021b 100644 --- a/src/main/java/io/discdrop/persistence/ReleaseGroupRepository.java +++ b/src/main/java/io/discdrop/persistence/ReleaseGroupRepository.java @@ -8,7 +8,10 @@ import java.time.Instant; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; @ApplicationScoped public class ReleaseGroupRepository { @@ -29,6 +32,25 @@ public class ReleaseGroupRepository { } } + @Transactional + public void replaceForArtist(String mbid, List newDtos) { + FollowedArtist artist = FollowedArtist.findByMbid(mbid); + if (artist == null) { + return; + } + Set newMbids = new HashSet<>(); + for (ReleaseGroupBrowseResult.ReleaseGroupDto rg : newDtos) { + newMbids.add(rg.id); + upsertOne(artist, rg); + } + List existing = ReleaseGroupEntity.list("artist", artist); + for (ReleaseGroupEntity rg : existing) { + if (!newMbids.contains(rg.mbid)) { + rg.delete(); + } + } + } + @Transactional public void markSynced(String mbid) { FollowedArtist artist = FollowedArtist.findByMbid(mbid); diff --git a/src/main/java/io/discdrop/service/SyncService.java b/src/main/java/io/discdrop/service/SyncService.java index bd6278f..55aba21 100644 --- a/src/main/java/io/discdrop/service/SyncService.java +++ b/src/main/java/io/discdrop/service/SyncService.java @@ -10,6 +10,8 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -109,7 +111,28 @@ public class SyncService { } public void resyncArtist(String mbid) { - repo.deleteByArtistMbid(mbid); - syncArtist(mbid); + syncing.add(mbid); + try { + Set enabledTypes = artistService.enabledTypes(mbid); + String typeFilter = enabledTypes.isEmpty() ? null : String.join("|", enabledTypes); + + List all = new ArrayList<>(); + int limit = 100; + int offset = 0; + boolean more = true; + while (more) { + ReleaseGroupBrowseResult page = mbzService.browseReleaseGroups(mbid, typeFilter, limit, offset); + if (page == null || page.releaseGroups == null || page.releaseGroups.isEmpty()) { + break; + } + all.addAll(page.releaseGroups); + offset += page.releaseGroups.size(); + more = page.releaseGroups.size() == limit && offset < page.count; + } + repo.replaceForArtist(mbid, all); + repo.markSynced(mbid); + } finally { + syncing.remove(mbid); + } } }