Future releases filter settings for feed and RSS
Build & Deploy / build-and-deploy (push) Successful in 1m11s
Build & Deploy / build-and-deploy (push) Successful in 1m11s
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
target/
|
||||
*.jar
|
||||
*.war
|
||||
mvnw
|
||||
mvnw.cmd
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
|
||||
@@ -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<ReleaseGroupEntity> rows = feedService.feedPage(offset);
|
||||
boolean hideFuture = settingsService.isHideFutureFeed();
|
||||
List<ReleaseGroupEntity> rows = feedService.feedPage(offset, hideFuture);
|
||||
int nextOffset = offset + rows.size();
|
||||
boolean hasMore = rows.size() == feedService.pageSize();
|
||||
return fragments_feed_list.data("rows", rows)
|
||||
|
||||
@@ -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<ReleaseGroupEntity> rows = feedService.feedPage(offset);
|
||||
boolean hideFuture = settingsService.isHideFutureFeed();
|
||||
List<ReleaseGroupEntity> 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<ReleaseGroupEntity> rows = feedService.feedPage(0);
|
||||
boolean hideFuture = settingsService.isHideFutureFeed();
|
||||
List<ReleaseGroupEntity> rows = feedService.feedPage(0, hideFuture);
|
||||
boolean hasMore = rows.size() == feedService.pageSize();
|
||||
return index.data("rows", rows)
|
||||
.data("nextOffset", rows.size())
|
||||
|
||||
@@ -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<ReleaseGroupEntity> entities = feedService.latest(itemCount);
|
||||
boolean hideFuture = settingsService.isHideFutureRss();
|
||||
List<ReleaseGroupEntity> entities = feedService.latest(itemCount, hideFuture);
|
||||
List<RssItem> items = new ArrayList<>(entities.size());
|
||||
for (ReleaseGroupEntity e : entities) {
|
||||
String pubDate = null;
|
||||
|
||||
@@ -37,7 +37,9 @@ public class SettingsResource {
|
||||
|
||||
@POST
|
||||
public TemplateInstance save(@FormParam("defaultPrimaryTypes") Set<String> 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);
|
||||
|
||||
@@ -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<ReleaseGroupEntity> orderedQuery() {
|
||||
private static final String WHERE_ORDER_HQL =
|
||||
"WHERE firstReleaseDate IS NULL OR firstReleaseDate <= ?1 " + ORDER_HQL;
|
||||
|
||||
private PanacheQuery<ReleaseGroupEntity> orderedQuery(boolean hideFuture) {
|
||||
if (hideFuture) {
|
||||
return ReleaseGroupEntity.find(WHERE_ORDER_HQL, LocalDate.now());
|
||||
}
|
||||
return ReleaseGroupEntity.find(ORDER_HQL);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public List<ReleaseGroupEntity> feedPage(int offset) {
|
||||
public List<ReleaseGroupEntity> 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<ReleaseGroupEntity> latest(int count) {
|
||||
return orderedQuery().range(0, Math.max(0, count - 1)).list();
|
||||
public List<ReleaseGroupEntity> latest(int count, boolean hideFuture) {
|
||||
return orderedQuery(hideFuture).range(0, Math.max(0, count - 1)).list();
|
||||
}
|
||||
|
||||
public int pageSize() {
|
||||
|
||||
@@ -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<String> 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<String> parseTypes(String raw) {
|
||||
if (raw == null || raw.isBlank()) {
|
||||
return new LinkedHashSet<>();
|
||||
|
||||
@@ -34,6 +34,23 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider my-1"></div>
|
||||
<div class="text-sm font-semibold mb-1">Future releases</div>
|
||||
<div class="space-y-2">
|
||||
<label class="label cursor-pointer justify-start gap-3">
|
||||
<input type="checkbox" name="hideFutureFeed" value="true"
|
||||
class="checkbox checkbox-sm"
|
||||
{#if hideFutureFeed}checked{/if}/>
|
||||
<span class="text-xs">Hide unreleased in feed</span>
|
||||
</label>
|
||||
<label class="label cursor-pointer justify-start gap-3">
|
||||
<input type="checkbox" name="hideFutureRss" value="true"
|
||||
class="checkbox checkbox-sm"
|
||||
{#if hideFutureRss}checked{/if}/>
|
||||
<span class="text-xs">Hide unreleased in RSS</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-primary btn-sm w-full">Save</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user