diff --git a/src/main/java/com/discdrop/service/FeedService.java b/src/main/java/com/discdrop/service/FeedService.java index 40931ce..5be1e9b 100644 --- a/src/main/java/com/discdrop/service/FeedService.java +++ b/src/main/java/com/discdrop/service/FeedService.java @@ -30,43 +30,54 @@ public class FeedService { var artists = artistService.findAll(); if (artists.isEmpty()) return List.of(); - var artistMbids = new ArrayList(); - for (var a : artists) { - if (cacheService.needsRefresh(a.mbid())) { - var types = getMonitoredTypes(a); - releaseGroupService.fetchAndCache(a.mbid(), a.name(), types); - } - artistMbids.add(a.mbid()); - } - + var artistMbids = artistMbidsWithRefresh(artists); var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other"); - var monitoredTypes = new ArrayList(); - for (var a : artists) { - monitoredTypes.addAll(getMonitoredTypes(a)); - } - return db.getFeed(artistMbids, monitoredTypes.isEmpty() ? allTypes : monitoredTypes, 0, 0).entries(); + var allEntries = db.getFeed(artistMbids, allTypes, 0, 0).entries(); + return filterByArtistMonitoring(allEntries, artists); } public FeedResult getFeedEntries(int page) { var artists = artistService.findAll(); if (artists.isEmpty()) return new FeedResult(List.of(), false); - var artistMbids = new ArrayList(); + var artistMbids = artistMbidsWithRefresh(artists); + var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other"); + var allEntries = db.getFeed(artistMbids, allTypes, 0, 0).entries(); + var filtered = filterByArtistMonitoring(allEntries, artists); + + var fromIndex = (page - 1) * PAGE_SIZE; + if (fromIndex >= filtered.size()) return new FeedResult(List.of(), false); + var toIndex = Math.min(fromIndex + PAGE_SIZE, filtered.size()); + var pageEntries = filtered.subList(fromIndex, toIndex); + var hasMore = toIndex < filtered.size(); + return new FeedResult(pageEntries, hasMore); + } + + private List artistMbidsWithRefresh(List artists) { + var mbids = new ArrayList(); for (var a : artists) { if (cacheService.needsRefresh(a.mbid())) { var types = getMonitoredTypes(a); releaseGroupService.fetchAndCache(a.mbid(), a.name(), types); } - artistMbids.add(a.mbid()); + mbids.add(a.mbid()); } + return mbids; + } - var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other"); - var monitoredTypes = new ArrayList(); + private List filterByArtistMonitoring(List entries, List artists) { + var flags = new java.util.HashMap>(); for (var a : artists) { - monitoredTypes.addAll(getMonitoredTypes(a)); + flags.put(a.mbid(), java.util.Set.copyOf(getMonitoredTypes(a))); } - - return db.getFeed(artistMbids, monitoredTypes.isEmpty() ? allTypes : monitoredTypes, PAGE_SIZE, (page - 1) * PAGE_SIZE); + var result = new ArrayList(); + for (var e : entries) { + var artistFlags = flags.get(e.artistMbid()); + if (artistFlags != null && artistFlags.contains(e.primaryType())) { + result.add(e); + } + } + return result; } private List getMonitoredTypes(TrackedArtist a) {