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:
2026-07-02 15:49:36 +02:00
parent f0be591faf
commit a2a3be0529
12 changed files with 44 additions and 29 deletions
@@ -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">