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:
droideparanoico
2026-07-02 15:49:36 +02:00
parent 83428152a1
commit c2eca7c6d9
12 changed files with 44 additions and 29 deletions
+2 -2
View File
@@ -45,7 +45,7 @@
<!-- REST Client --> <!-- REST Client -->
<dependency> <dependency>
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId> <artifactId>quarkus-resteasy-client</artifactId>
</dependency> </dependency>
<!-- CDI --> <!-- CDI -->
@@ -75,7 +75,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson</artifactId> <artifactId>quarkus-resteasy-client-jackson</artifactId>
</dependency> </dependency>
<!-- Test --> <!-- Test -->
@@ -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 com.discdrop.db.Record.TrackedArtist;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -17,6 +18,7 @@ import java.util.Optional;
public class ArtistService { public class ArtistService {
@Inject @Inject
@RestClient
MusicBrainzClient mbClient; MusicBrainzClient mbClient;
@Inject @Inject
@@ -7,6 +7,7 @@ import com.discdrop.db.Record.ReleaseGroup;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -18,6 +19,7 @@ public class ReleaseGroupService {
private static final int PAGE_SIZE = 100; private static final int PAGE_SIZE = 100;
@Inject @Inject
@RestClient
MusicBrainzClient mbClient; MusicBrainzClient mbClient;
@Inject @Inject
@@ -36,7 +36,6 @@ public class RSSFeedBuilder {
item.setTitle(rg.artistName() + "" + rg.title()); item.setTitle(rg.artistName() + "" + rg.title());
item.setLink("https://musicbrainz.org/release-group/" + rg.mbid()); item.setLink("https://musicbrainz.org/release-group/" + rg.mbid());
var guid = new SyndLinkImpl();
item.setUri("mbz-rg-" + rg.mbid()); item.setUri("mbz-rg-" + rg.mbid());
var desc = new SyndContentImpl(); var desc = new SyndContentImpl();
@@ -1,20 +1,17 @@
package com.discdrop.web; package com.discdrop.web;
import com.discdrop.db.Record.MonitoringFlags; import com.discdrop.db.Record.MonitoringFlags;
import com.discdrop.db.Record.ReleaseGroup;
import com.discdrop.db.Record.TrackedArtist; import com.discdrop.db.Record.TrackedArtist;
import com.discdrop.service.ArtistService; import com.discdrop.service.ArtistService;
import com.discdrop.service.ArtistService.SearchResult; import com.discdrop.service.ArtistService.SearchResult;
import com.discdrop.service.CacheService;
import com.discdrop.service.FeedService; import com.discdrop.service.FeedService;
import com.discdrop.service.ReleaseGroupService; import com.discdrop.service.ReleaseGroupService;
import io.quarkus.qute.Location;
import io.quarkus.qute.Template; import io.quarkus.qute.Template;
import io.quarkus.qute.TemplateInstance; import io.quarkus.qute.TemplateInstance;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.*; import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import org.jboss.resteasy.reactive.RestForm;
import jakarta.ws.rs.NotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -27,20 +24,20 @@ public class ArtistController {
@Inject @Inject
ReleaseGroupService releaseGroupService; ReleaseGroupService releaseGroupService;
@Inject
CacheService cacheService;
@Inject @Inject
FeedService feedService; FeedService feedService;
@Inject @Inject
Template fragments$search_results; @Location("fragments/search-results")
Template searchResultsTemplate;
@Inject @Inject
Template fragments$artist_list; @Location("fragments/artist-list")
Template artistListTemplate;
@Inject @Inject
Template fragments$feed_entries; @Location("fragments/feed-entries")
Template feedEntriesTemplate;
@GET @GET
@Path("/search") @Path("/search")
@@ -52,7 +49,7 @@ public class ArtistController {
} else { } else {
results = artistService.search(q); results = artistService.search(q);
} }
return fragments$search_results.data("artists", results); return searchResultsTemplate.data("artists", results);
} }
@POST @POST
@@ -60,12 +57,10 @@ public class ArtistController {
@Produces(MediaType.TEXT_HTML) @Produces(MediaType.TEXT_HTML)
public TemplateInstance trackArtist(@PathParam("mbid") String mbid) { public TemplateInstance trackArtist(@PathParam("mbid") String mbid) {
var artist = artistService.addArtist(mbid); var artist = artistService.addArtist(mbid);
var types = getMonitoredTypes(artist); var types = getMonitoredTypes(artist);
releaseGroupService.fetchAndCache(artist.mbid(), artist.name(), types); releaseGroupService.fetchAndCache(artist.mbid(), artist.name(), types);
var allArtists = artistService.findAll(); var allArtists = artistService.findAll();
return fragments$artist_list.data("artists", allArtists); return artistListTemplate.data("artists", allArtists);
} }
@DELETE @DELETE
@@ -74,7 +69,7 @@ public class ArtistController {
public TemplateInstance removeArtist(@PathParam("mbid") String mbid) { public TemplateInstance removeArtist(@PathParam("mbid") String mbid) {
artistService.removeArtist(mbid); artistService.removeArtist(mbid);
var allArtists = artistService.findAll(); var allArtists = artistService.findAll();
return fragments$artist_list.data("artists", allArtists); return artistListTemplate.data("artists", allArtists);
} }
@PATCH @PATCH
@@ -94,7 +89,7 @@ public class ArtistController {
); );
artistService.updateMonitoring(mbid, flags); artistService.updateMonitoring(mbid, flags);
var allArtists = artistService.findAll(); var allArtists = artistService.findAll();
return fragments$artist_list.data("artists", allArtists); return artistListTemplate.data("artists", allArtists);
} }
@GET @GET
@@ -102,7 +97,7 @@ public class ArtistController {
@Produces(MediaType.TEXT_HTML) @Produces(MediaType.TEXT_HTML)
public TemplateInstance artistList() { public TemplateInstance artistList() {
var artists = artistService.findAll(); var artists = artistService.findAll();
return fragments$artist_list.data("artists", artists); return artistListTemplate.data("artists", artists);
} }
@GET @GET
@@ -110,7 +105,7 @@ public class ArtistController {
@Produces(MediaType.TEXT_HTML) @Produces(MediaType.TEXT_HTML)
public TemplateInstance feedTable() { public TemplateInstance feedTable() {
var entries = feedService.getFeedEntries(); var entries = feedService.getFeedEntries();
return fragments$feed_entries.data("entries", entries); return feedEntriesTemplate.data("entries", entries);
} }
private List<String> getMonitoredTypes(TrackedArtist a) { private List<String> getMonitoredTypes(TrackedArtist a) {
@@ -1,6 +1,7 @@
package com.discdrop.web; package com.discdrop.web;
import com.discdrop.db.DatabaseService; import com.discdrop.db.DatabaseService;
import io.quarkus.qute.Location;
import io.quarkus.qute.Template; import io.quarkus.qute.Template;
import io.quarkus.qute.TemplateInstance; import io.quarkus.qute.TemplateInstance;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@@ -15,7 +16,8 @@ public class SettingsController {
DatabaseService db; DatabaseService db;
@Inject @Inject
Template fragments$settings_form; @Location("fragments/settings-form")
Template settingsFormTemplate;
@GET @GET
@Path("/form") @Path("/form")
@@ -23,7 +25,7 @@ public class SettingsController {
public TemplateInstance settingsForm() { public TemplateInstance settingsForm() {
var cacheTtl = db.getSetting("cache_ttl_hours", "8"); var cacheTtl = db.getSetting("cache_ttl_hours", "8");
var defaultTypes = db.getSetting("default_types", "Album"); var defaultTypes = db.getSetting("default_types", "Album");
return fragments$settings_form.data("cacheTtl", cacheTtl) return settingsFormTemplate.data("cacheTtl", cacheTtl)
.data("defaultTypes", defaultTypes); .data("defaultTypes", defaultTypes);
} }
@@ -3,7 +3,6 @@ quarkus.http.port=8080
# MusicBrainz API # MusicBrainz API
quarkus.rest-client."com.discdrop.client.MusicBrainzClient".url=https://musicbrainz.org/ws/2 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 # Qute templating
quarkus.qute.suffixes=html quarkus.qute.suffixes=html
@@ -3,7 +3,7 @@
<p class="text-lg text-base-content/60">No artists tracked yet</p> <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> <p class="text-sm text-base-content/40 mt-2">Search for artists using the search bar above and click "+ Add"</p>
</div> </div>
{:else} {#else}
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="table table-zebra"> <table class="table table-zebra">
<thead> <thead>
@@ -3,7 +3,7 @@
<p class="text-lg text-base-content/60">No releases found</p> <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> <p class="text-sm text-base-content/40 mt-2">Add artists to your collection to see their releases here</p>
</div> </div>
{:else} {#else}
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="table table-zebra"> <table class="table table-zebra">
<thead> <thead>
@@ -1,7 +1,7 @@
<div class="card bg-base-100 shadow-xl mt-1 max-h-64 overflow-y-auto"> <div class="card bg-base-100 shadow-xl mt-1 max-h-64 overflow-y-auto">
{#if artists.isEmpty()} {#if artists.isEmpty()}
<div class="p-3 text-sm text-base-content/60">No artists found</div> <div class="p-3 text-sm text-base-content/60">No artists found</div>
{:else} {#else}
{#for artist in artists} {#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 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"> <div class="flex-1 min-w-0">
@@ -15,7 +15,7 @@
<div class="ml-2 flex-shrink-0"> <div class="ml-2 flex-shrink-0">
{#if artist.alreadyTracked} {#if artist.alreadyTracked}
<span class="badge badge-success badge-sm">✓ Added</span> <span class="badge badge-success badge-sm">✓ Added</span>
{:else} {#else}
<button class="btn btn-primary btn-xs" <button class="btn btn-primary btn-xs"
hx-post="/api/artists/{artist.mbid}/track" hx-post="/api/artists/{artist.mbid}/track"
hx-target="#artist-list" hx-target="#artist-list"
@@ -56,7 +56,7 @@
</div> </div>
<main class="container mx-auto p-4"> <main class="container mx-auto p-4">
{#insert page-content}{/page-content} {#insert page-content}{/insert}
</main> </main>
<dialog id="settingsModal" class="modal"> <dialog id="settingsModal" class="modal">