diff --git a/.gitignore b/.gitignore index 8c8cf7d..b3a9530 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ target/ *.jar *.war +mvnw +mvnw.cmd # IDE .idea/ diff --git a/src/main/java/io/discdrop/resource/ArtistResource.java b/src/main/java/io/discdrop/resource/ArtistResource.java index ab94d6f..83eecb5 100644 --- a/src/main/java/io/discdrop/resource/ArtistResource.java +++ b/src/main/java/io/discdrop/resource/ArtistResource.java @@ -6,6 +6,7 @@ import io.discdrop.persistence.FollowedArtist; import io.discdrop.persistence.ReleaseGroupEntity; import io.discdrop.service.ArtistService; import io.discdrop.service.FeedService; +import io.discdrop.service.SettingsService; import io.discdrop.service.SyncService; import io.quarkus.qute.Location; import io.quarkus.qute.Template; @@ -34,6 +35,9 @@ public class ArtistResource { @Inject FeedService feedService; + @Inject + SettingsService settingsService; + @Inject @Location("fragments/feed-list.html") Template fragments_feed_list; @@ -113,7 +117,8 @@ public class ArtistResource { if (offset < 0) { offset = 0; } - List rows = feedService.feedPage(offset); + boolean hideFuture = settingsService.isHideFutureFeed(); + List rows = feedService.feedPage(offset, hideFuture); int nextOffset = offset + rows.size(); boolean hasMore = rows.size() == feedService.pageSize(); return fragments_feed_list.data("rows", rows) diff --git a/src/main/java/io/discdrop/resource/PageResource.java b/src/main/java/io/discdrop/resource/PageResource.java index 11d0081..c564f5c 100644 --- a/src/main/java/io/discdrop/resource/PageResource.java +++ b/src/main/java/io/discdrop/resource/PageResource.java @@ -3,6 +3,7 @@ package io.discdrop.resource; import io.discdrop.persistence.FollowedArtist; import io.discdrop.persistence.ReleaseGroupEntity; import io.discdrop.service.FeedService; +import io.discdrop.service.SettingsService; import io.discdrop.service.SyncService; import io.quarkus.qute.Location; import io.quarkus.qute.Template; @@ -24,6 +25,9 @@ public class PageResource { @Inject SyncService syncService; + @Inject + SettingsService settingsService; + @Inject Template index; @@ -38,7 +42,8 @@ public class PageResource { if (offset < 0) { offset = 0; } - List rows = feedService.feedPage(offset); + boolean hideFuture = settingsService.isHideFutureFeed(); + List rows = feedService.feedPage(offset, hideFuture); int nextOffset = offset + rows.size(); boolean hasMore = rows.size() == feedService.pageSize(); return fragments_feed_list.data("rows", rows) @@ -52,7 +57,8 @@ public class PageResource { @GET @Transactional public TemplateInstance index() { - List rows = feedService.feedPage(0); + boolean hideFuture = settingsService.isHideFutureFeed(); + List rows = feedService.feedPage(0, hideFuture); boolean hasMore = rows.size() == feedService.pageSize(); return index.data("rows", rows) .data("nextOffset", rows.size()) diff --git a/src/main/java/io/discdrop/resource/RssResource.java b/src/main/java/io/discdrop/resource/RssResource.java index 8781fd5..816f71a 100644 --- a/src/main/java/io/discdrop/resource/RssResource.java +++ b/src/main/java/io/discdrop/resource/RssResource.java @@ -2,6 +2,7 @@ package io.discdrop.resource; import io.discdrop.persistence.ReleaseGroupEntity; import io.discdrop.service.FeedService; +import io.discdrop.service.SettingsService; import io.quarkus.qute.Location; import io.quarkus.qute.Template; import io.quarkus.qute.TemplateInstance; @@ -27,6 +28,9 @@ public class RssResource { @Inject FeedService feedService; + @Inject + SettingsService settingsService; + @Inject @Location("rss.xml") Template rss; @@ -40,7 +44,8 @@ public class RssResource { @GET @Produces(MediaType.APPLICATION_XML) public TemplateInstance feed() { - List entities = feedService.latest(itemCount); + boolean hideFuture = settingsService.isHideFutureRss(); + List entities = feedService.latest(itemCount, hideFuture); List items = new ArrayList<>(entities.size()); for (ReleaseGroupEntity e : entities) { String pubDate = null; diff --git a/src/main/java/io/discdrop/resource/SettingsResource.java b/src/main/java/io/discdrop/resource/SettingsResource.java index 6c3f0e3..7b2cc07 100644 --- a/src/main/java/io/discdrop/resource/SettingsResource.java +++ b/src/main/java/io/discdrop/resource/SettingsResource.java @@ -37,7 +37,9 @@ public class SettingsResource { @POST public TemplateInstance save(@FormParam("defaultPrimaryTypes") Set defaultPrimaryTypes, - @FormParam("syncScheduleHours") int syncScheduleHours) { + @FormParam("syncScheduleHours") int syncScheduleHours, + @FormParam("hideFutureFeed") boolean hideFutureFeed, + @FormParam("hideFutureRss") boolean hideFutureRss) { if (defaultPrimaryTypes == null) { defaultPrimaryTypes = Set.of(); } @@ -47,6 +49,8 @@ public class SettingsResource { if (previous != syncScheduleHours) { syncService.reschedule(); } + settingsService.setHideFutureFeed(hideFutureFeed); + settingsService.setHideFutureRss(hideFutureRss); return buildPanel("saved"); } @@ -54,6 +58,8 @@ public class SettingsResource { return fragments_settings_panel .data("defaultPrimaryTypes", settingsService.getDefaultPrimaryTypes()) .data("syncScheduleHours", settingsService.getSyncScheduleHours()) + .data("hideFutureFeed", settingsService.isHideFutureFeed()) + .data("hideFutureRss", settingsService.isHideFutureRss()) .data("allPrimaryTypes", SettingsService.ALL_PRIMARY_TYPES) .data("scheduleOptions", SCHEDULE_OPTIONS) .data("flash", flash); diff --git a/src/main/java/io/discdrop/service/FeedService.java b/src/main/java/io/discdrop/service/FeedService.java index 4573205..233d672 100644 --- a/src/main/java/io/discdrop/service/FeedService.java +++ b/src/main/java/io/discdrop/service/FeedService.java @@ -6,6 +6,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.transaction.Transactional; import org.eclipse.microprofile.config.inject.ConfigProperty; +import java.time.LocalDate; import java.util.List; @ApplicationScoped @@ -17,21 +18,27 @@ public class FeedService { private static final String ORDER_HQL = "ORDER BY firstReleaseDate DESC NULLS LAST, discoveredAt DESC"; - private PanacheQuery orderedQuery() { + private static final String WHERE_ORDER_HQL = + "WHERE firstReleaseDate IS NULL OR firstReleaseDate <= ?1 " + ORDER_HQL; + + private PanacheQuery orderedQuery(boolean hideFuture) { + if (hideFuture) { + return ReleaseGroupEntity.find(WHERE_ORDER_HQL, LocalDate.now()); + } return ReleaseGroupEntity.find(ORDER_HQL); } @Transactional - public List feedPage(int offset) { + public List feedPage(int offset, boolean hideFuture) { if (offset < 0) { offset = 0; } - return orderedQuery().range(offset, offset + pageSize - 1).list(); + return orderedQuery(hideFuture).range(offset, offset + pageSize - 1).list(); } @Transactional - public List latest(int count) { - return orderedQuery().range(0, Math.max(0, count - 1)).list(); + public List latest(int count, boolean hideFuture) { + return orderedQuery(hideFuture).range(0, Math.max(0, count - 1)).list(); } public int pageSize() { diff --git a/src/main/java/io/discdrop/service/SettingsService.java b/src/main/java/io/discdrop/service/SettingsService.java index a12ac77..b7c3348 100644 --- a/src/main/java/io/discdrop/service/SettingsService.java +++ b/src/main/java/io/discdrop/service/SettingsService.java @@ -15,6 +15,8 @@ public class SettingsService { public static final String KEY_DEFAULT_PRIMARY_TYPES = "defaultPrimaryTypes"; public static final String KEY_SYNC_SCHEDULE_HOURS = "syncScheduleHours"; + public static final String KEY_HIDE_FUTURE_FEED = "hideFutureFeed"; + public static final String KEY_HIDE_FUTURE_RSS = "hideFutureRss"; public static final List ALL_PRIMARY_TYPES = List.of("album", "single", "ep", "broadcast", "other"); @@ -42,6 +44,24 @@ public class SettingsService { AppSetting.set(KEY_SYNC_SCHEDULE_HOURS, String.valueOf(hours)); } + public boolean isHideFutureFeed() { + return Boolean.parseBoolean(AppSetting.get(KEY_HIDE_FUTURE_FEED, "false")); + } + + @Transactional + public void setHideFutureFeed(boolean hide) { + AppSetting.set(KEY_HIDE_FUTURE_FEED, String.valueOf(hide)); + } + + public boolean isHideFutureRss() { + return Boolean.parseBoolean(AppSetting.get(KEY_HIDE_FUTURE_RSS, "false")); + } + + @Transactional + public void setHideFutureRss(boolean hide) { + AppSetting.set(KEY_HIDE_FUTURE_RSS, String.valueOf(hide)); + } + private Set parseTypes(String raw) { if (raw == null || raw.isBlank()) { return new LinkedHashSet<>(); diff --git a/src/main/resources/templates/fragments/settings-panel.html b/src/main/resources/templates/fragments/settings-panel.html index b64b69e..f9d3428 100644 --- a/src/main/resources/templates/fragments/settings-panel.html +++ b/src/main/resources/templates/fragments/settings-panel.html @@ -34,6 +34,23 @@ +
+
Future releases
+
+ + +
+