Fix build and runtime issues
- Fix Quarkus BOM groupId (io.quarkus:quarkus-bom) and version (3.37.1)
- Fix artifact names: quarkus-resteasy, quarkus-resteasy-qute, quarkus-resteasy-client
- Add UserAgentFilter for MusicBrainz API compliance
- Fix @RestClient qualifier on MB client injection points
- Fix Qute template section names: {#insert}{/insert}, {#else} not {:else}
- Fix template injection with @Location annotation
- Remove unused imports
- Fix RSS feed builder to use Synd API
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
package com.discdrop.client;
|
||||
|
||||
import jakarta.ws.rs.client.ClientRequestContext;
|
||||
import jakarta.ws.rs.client.ClientRequestFilter;
|
||||
import jakarta.ws.rs.ext.Provider;
|
||||
import java.io.IOException;
|
||||
|
||||
@Provider
|
||||
public class UserAgentFilter implements ClientRequestFilter {
|
||||
|
||||
@Override
|
||||
public void filter(ClientRequestContext requestContext) throws IOException {
|
||||
requestContext.getHeaders().putSingle("User-Agent",
|
||||
"DiscDrop/1.0 (david.alvarez.81@gmail.com)");
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import com.discdrop.db.Record.MonitoringFlags;
|
||||
import com.discdrop.db.Record.TrackedArtist;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -17,6 +18,7 @@ import java.util.Optional;
|
||||
public class ArtistService {
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
MusicBrainzClient mbClient;
|
||||
|
||||
@Inject
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.discdrop.db.Record.ReleaseGroup;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -18,6 +19,7 @@ public class ReleaseGroupService {
|
||||
private static final int PAGE_SIZE = 100;
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
MusicBrainzClient mbClient;
|
||||
|
||||
@Inject
|
||||
|
||||
@@ -36,7 +36,6 @@ public class RSSFeedBuilder {
|
||||
item.setTitle(rg.artistName() + " — " + rg.title());
|
||||
item.setLink("https://musicbrainz.org/release-group/" + rg.mbid());
|
||||
|
||||
var guid = new SyndLinkImpl();
|
||||
item.setUri("mbz-rg-" + rg.mbid());
|
||||
|
||||
var desc = new SyndContentImpl();
|
||||
|
||||
@@ -1,20 +1,17 @@
|
||||
package com.discdrop.web;
|
||||
|
||||
import com.discdrop.db.Record.MonitoringFlags;
|
||||
import com.discdrop.db.Record.ReleaseGroup;
|
||||
import com.discdrop.db.Record.TrackedArtist;
|
||||
import com.discdrop.service.ArtistService;
|
||||
import com.discdrop.service.ArtistService.SearchResult;
|
||||
import com.discdrop.service.CacheService;
|
||||
import com.discdrop.service.FeedService;
|
||||
import com.discdrop.service.ReleaseGroupService;
|
||||
import io.quarkus.qute.Location;
|
||||
import io.quarkus.qute.Template;
|
||||
import io.quarkus.qute.TemplateInstance;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import org.jboss.resteasy.reactive.RestForm;
|
||||
import jakarta.ws.rs.NotFoundException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -27,20 +24,20 @@ public class ArtistController {
|
||||
@Inject
|
||||
ReleaseGroupService releaseGroupService;
|
||||
|
||||
@Inject
|
||||
CacheService cacheService;
|
||||
|
||||
@Inject
|
||||
FeedService feedService;
|
||||
|
||||
@Inject
|
||||
Template fragments$search_results;
|
||||
@Location("fragments/search-results")
|
||||
Template searchResultsTemplate;
|
||||
|
||||
@Inject
|
||||
Template fragments$artist_list;
|
||||
@Location("fragments/artist-list")
|
||||
Template artistListTemplate;
|
||||
|
||||
@Inject
|
||||
Template fragments$feed_entries;
|
||||
@Location("fragments/feed-entries")
|
||||
Template feedEntriesTemplate;
|
||||
|
||||
@GET
|
||||
@Path("/search")
|
||||
@@ -52,7 +49,7 @@ public class ArtistController {
|
||||
} else {
|
||||
results = artistService.search(q);
|
||||
}
|
||||
return fragments$search_results.data("artists", results);
|
||||
return searchResultsTemplate.data("artists", results);
|
||||
}
|
||||
|
||||
@POST
|
||||
@@ -60,12 +57,10 @@ public class ArtistController {
|
||||
@Produces(MediaType.TEXT_HTML)
|
||||
public TemplateInstance trackArtist(@PathParam("mbid") String mbid) {
|
||||
var artist = artistService.addArtist(mbid);
|
||||
|
||||
var types = getMonitoredTypes(artist);
|
||||
releaseGroupService.fetchAndCache(artist.mbid(), artist.name(), types);
|
||||
|
||||
var allArtists = artistService.findAll();
|
||||
return fragments$artist_list.data("artists", allArtists);
|
||||
return artistListTemplate.data("artists", allArtists);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@@ -74,7 +69,7 @@ public class ArtistController {
|
||||
public TemplateInstance removeArtist(@PathParam("mbid") String mbid) {
|
||||
artistService.removeArtist(mbid);
|
||||
var allArtists = artistService.findAll();
|
||||
return fragments$artist_list.data("artists", allArtists);
|
||||
return artistListTemplate.data("artists", allArtists);
|
||||
}
|
||||
|
||||
@PATCH
|
||||
@@ -94,7 +89,7 @@ public class ArtistController {
|
||||
);
|
||||
artistService.updateMonitoring(mbid, flags);
|
||||
var allArtists = artistService.findAll();
|
||||
return fragments$artist_list.data("artists", allArtists);
|
||||
return artistListTemplate.data("artists", allArtists);
|
||||
}
|
||||
|
||||
@GET
|
||||
@@ -102,7 +97,7 @@ public class ArtistController {
|
||||
@Produces(MediaType.TEXT_HTML)
|
||||
public TemplateInstance artistList() {
|
||||
var artists = artistService.findAll();
|
||||
return fragments$artist_list.data("artists", artists);
|
||||
return artistListTemplate.data("artists", artists);
|
||||
}
|
||||
|
||||
@GET
|
||||
@@ -110,7 +105,7 @@ public class ArtistController {
|
||||
@Produces(MediaType.TEXT_HTML)
|
||||
public TemplateInstance feedTable() {
|
||||
var entries = feedService.getFeedEntries();
|
||||
return fragments$feed_entries.data("entries", entries);
|
||||
return feedEntriesTemplate.data("entries", entries);
|
||||
}
|
||||
|
||||
private List<String> getMonitoredTypes(TrackedArtist a) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.discdrop.web;
|
||||
|
||||
import com.discdrop.db.DatabaseService;
|
||||
import io.quarkus.qute.Location;
|
||||
import io.quarkus.qute.Template;
|
||||
import io.quarkus.qute.TemplateInstance;
|
||||
import jakarta.inject.Inject;
|
||||
@@ -15,7 +16,8 @@ public class SettingsController {
|
||||
DatabaseService db;
|
||||
|
||||
@Inject
|
||||
Template fragments$settings_form;
|
||||
@Location("fragments/settings-form")
|
||||
Template settingsFormTemplate;
|
||||
|
||||
@GET
|
||||
@Path("/form")
|
||||
@@ -23,7 +25,7 @@ public class SettingsController {
|
||||
public TemplateInstance settingsForm() {
|
||||
var cacheTtl = db.getSetting("cache_ttl_hours", "8");
|
||||
var defaultTypes = db.getSetting("default_types", "Album");
|
||||
return fragments$settings_form.data("cacheTtl", cacheTtl)
|
||||
return settingsFormTemplate.data("cacheTtl", cacheTtl)
|
||||
.data("defaultTypes", defaultTypes);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ quarkus.http.port=8080
|
||||
|
||||
# MusicBrainz API
|
||||
quarkus.rest-client."com.discdrop.client.MusicBrainzClient".url=https://musicbrainz.org/ws/2
|
||||
quarkus.rest-client."com.discdrop.client.MusicBrainzClient".default-headers=User-Agent: DiscDrop/1.0 (david.alvarez.81@gmail.com)
|
||||
|
||||
# Qute templating
|
||||
quarkus.qute.suffixes=html
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<p class="text-lg text-base-content/60">No artists tracked yet</p>
|
||||
<p class="text-sm text-base-content/40 mt-2">Search for artists using the search bar above and click "+ Add"</p>
|
||||
</div>
|
||||
{:else}
|
||||
{#else}
|
||||
<div class="overflow-x-auto">
|
||||
<table class="table table-zebra">
|
||||
<thead>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<p class="text-lg text-base-content/60">No releases found</p>
|
||||
<p class="text-sm text-base-content/40 mt-2">Add artists to your collection to see their releases here</p>
|
||||
</div>
|
||||
{:else}
|
||||
{#else}
|
||||
<div class="overflow-x-auto">
|
||||
<table class="table table-zebra">
|
||||
<thead>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<div class="card bg-base-100 shadow-xl mt-1 max-h-64 overflow-y-auto">
|
||||
{#if artists.isEmpty()}
|
||||
<div class="p-3 text-sm text-base-content/60">No artists found</div>
|
||||
{:else}
|
||||
{#else}
|
||||
{#for artist in artists}
|
||||
<div class="flex items-center justify-between p-3 hover:bg-base-200 border-b border-base-200 last:border-b-0">
|
||||
<div class="flex-1 min-w-0">
|
||||
@@ -15,7 +15,7 @@
|
||||
<div class="ml-2 flex-shrink-0">
|
||||
{#if artist.alreadyTracked}
|
||||
<span class="badge badge-success badge-sm">✓ Added</span>
|
||||
{:else}
|
||||
{#else}
|
||||
<button class="btn btn-primary btn-xs"
|
||||
hx-post="/api/artists/{artist.mbid}/track"
|
||||
hx-target="#artist-list"
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
</div>
|
||||
|
||||
<main class="container mx-auto p-4">
|
||||
{#insert page-content}{/page-content}
|
||||
{#insert page-content}{/insert}
|
||||
</main>
|
||||
|
||||
<dialog id="settingsModal" class="modal">
|
||||
|
||||
Reference in New Issue
Block a user