diff --git a/src/main/java/com/discdrop/db/DatabaseService.java b/src/main/java/com/discdrop/db/DatabaseService.java index e189d35..2a4be27 100644 --- a/src/main/java/com/discdrop/db/DatabaseService.java +++ b/src/main/java/com/discdrop/db/DatabaseService.java @@ -211,9 +211,11 @@ public class DatabaseService { } } - public List getFeed(List artistMbids, List primaryTypes) { + public record FeedResult(List entries, boolean hasMore) {} + + public FeedResult getFeed(List artistMbids, List primaryTypes, int limit, int offset) { var groups = new ArrayList(); - if (artistMbids.isEmpty()) return groups; + if (artistMbids.isEmpty()) return new FeedResult(groups, false); var placeholders = String.join(",", artistMbids.stream().map(m -> "?").toList()); var sql = "SELECT * FROM release_group_cache WHERE artist_mbid IN (" + placeholders + ")"; @@ -222,12 +224,15 @@ public class DatabaseService { sql += " AND primary_type IN (" + typePlaceholders + ")"; } sql += " ORDER BY (CASE WHEN first_release_date IS NULL OR first_release_date = '' THEN 1 ELSE 0 END), first_release_date DESC"; + sql += " LIMIT ? OFFSET ?"; try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { int idx = 1; for (var mbid : artistMbids) ps.setString(idx++, mbid); for (var type : primaryTypes) ps.setString(idx++, type); + ps.setInt(idx++, limit + 1); + ps.setInt(idx, offset); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { groups.add(mapReleaseGroup(rs)); @@ -236,7 +241,9 @@ public class DatabaseService { } catch (SQLException e) { throw new RuntimeException(e); } - return groups; + boolean hasMore = groups.size() > limit; + if (hasMore) groups.remove(groups.size() - 1); + return new FeedResult(groups, hasMore); } public void deleteReleaseGroupsForArtist(String mbid) { diff --git a/src/main/java/com/discdrop/service/FeedService.java b/src/main/java/com/discdrop/service/FeedService.java index a77d5da..92c084e 100644 --- a/src/main/java/com/discdrop/service/FeedService.java +++ b/src/main/java/com/discdrop/service/FeedService.java @@ -1,6 +1,7 @@ package com.discdrop.service; import com.discdrop.db.DatabaseService; +import com.discdrop.db.DatabaseService.FeedResult; import com.discdrop.db.Record.ReleaseGroup; import com.discdrop.db.Record.TrackedArtist; import jakarta.enterprise.context.ApplicationScoped; @@ -23,9 +24,15 @@ public class FeedService { @Inject DatabaseService db; + public static final int PAGE_SIZE = 20; + public List getFeedEntries() { + return getFeedEntries(1).entries(); + } + + public FeedResult getFeedEntries(int page) { var artists = artistService.findAll(); - if (artists.isEmpty()) return List.of(); + if (artists.isEmpty()) return new FeedResult(List.of(), false); var artistMbids = new ArrayList(); for (var a : artists) { @@ -42,7 +49,7 @@ public class FeedService { monitoredTypes.addAll(getMonitoredTypes(a)); } - return db.getFeed(artistMbids, monitoredTypes.isEmpty() ? allTypes : monitoredTypes); + return db.getFeed(artistMbids, monitoredTypes.isEmpty() ? allTypes : monitoredTypes, PAGE_SIZE, (page - 1) * PAGE_SIZE); } private List getMonitoredTypes(TrackedArtist a) { diff --git a/src/main/java/com/discdrop/web/ArtistController.java b/src/main/java/com/discdrop/web/ArtistController.java index d157ddc..a31b730 100644 --- a/src/main/java/com/discdrop/web/ArtistController.java +++ b/src/main/java/com/discdrop/web/ArtistController.java @@ -1,5 +1,6 @@ package com.discdrop.web; +import com.discdrop.db.DatabaseService.FeedResult; import com.discdrop.db.Record.MonitoringFlags; import com.discdrop.db.Record.TrackedArtist; import com.discdrop.service.ArtistService; @@ -106,9 +107,12 @@ public class ArtistController { @GET @Path("/feed-table") @Produces(MediaType.TEXT_HTML) - public TemplateInstance feedTable() { - var entries = feedService.getFeedEntries(); - return feedEntriesTemplate.data("entries", entries); + public TemplateInstance feedTable(@QueryParam("page") @DefaultValue("1") int page) { + var result = feedService.getFeedEntries(page); + return feedEntriesTemplate + .data("entries", result.entries()) + .data("hasMore", result.hasMore()) + .data("nextPage", page + 1); } private List getMonitoredTypes(TrackedArtist a) { diff --git a/src/main/resources/templates/fragments/feed-entries.html b/src/main/resources/templates/fragments/feed-entries.html index 0bd0f64..1de4dad 100644 --- a/src/main/resources/templates/fragments/feed-entries.html +++ b/src/main/resources/templates/fragments/feed-entries.html @@ -4,37 +4,43 @@

Add artists to your collection to see their releases here

{#else} -
- {#for entry in entries} - -
- {entry.title} -
-
-
+