Fix MB API deserialization: primary-type and secondary-types are strings not objects

This commit is contained in:
david.alvarez
2026-07-02 16:29:48 +02:00
parent e7f9b6838e
commit 2deb335953
3 changed files with 12 additions and 26 deletions
@@ -1,30 +1,25 @@
package com.discdrop.client.dto; package com.discdrop.client.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List; import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public record ReleaseGroupBrowseResponse( public record ReleaseGroupBrowseResponse(
List<ReleaseGroup> releaseGroups, @JsonProperty("release-groups") List<ReleaseGroup> releaseGroups,
int releaseGroupCount @JsonProperty("release-group-count") int releaseGroupCount
) { ) {
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public record ReleaseGroup( public record ReleaseGroup(
String id, String id,
String title, String title,
String firstReleaseDate, @JsonProperty("first-release-date") String firstReleaseDate,
PrimaryType primaryType, @JsonProperty("primary-type") String primaryType,
List<SecondaryType> secondaryTypes, @JsonProperty("secondary-types") List<String> secondaryTypes,
List<ArtistCredit> artistCredit @JsonProperty("artist-credit") List<ArtistCredit> artistCredit
) { ) {
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public record PrimaryType(String id, String name) {} public record ArtistCredit(@JsonProperty("artist") Artist artist) {
@JsonIgnoreProperties(ignoreUnknown = true)
public record SecondaryType(String id, String name) {}
@JsonIgnoreProperties(ignoreUnknown = true)
public record ArtistCredit(Artist artist) {
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public record Artist(String id, String name) {} public record Artist(String id, String name) {}
} }
@@ -43,15 +43,14 @@ public class ReleaseGroupService {
total = Math.min(page.releaseGroupCount(), MAX_RELEASE_GROUPS); total = Math.min(page.releaseGroupCount(), MAX_RELEASE_GROUPS);
for (var rg : page.releaseGroups()) { for (var rg : page.releaseGroups()) {
String primaryType = rg.primaryType() != null ? rg.primaryType().name() : "Other"; String primaryType = rg.primaryType() != null ? rg.primaryType() : "Other";
if (!monitoredTypes.contains(primaryType)) continue; if (!monitoredTypes.contains(primaryType)) continue;
String secondaryTypes = "[]"; String secondaryTypes = "[]";
if (rg.secondaryTypes() != null && !rg.secondaryTypes().isEmpty()) { if (rg.secondaryTypes() != null && !rg.secondaryTypes().isEmpty()) {
try { try {
secondaryTypes = json.writeValueAsString( secondaryTypes = json.writeValueAsString(rg.secondaryTypes());
rg.secondaryTypes().stream().map(s -> s.name()).toList());
} catch (Exception e) { } catch (Exception e) {
secondaryTypes = "[]"; secondaryTypes = "[]";
} }
@@ -9,7 +9,6 @@ import com.discdrop.service.ReleaseGroupService;
import io.quarkus.qute.Location; 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 io.vertx.core.Vertx;
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;
@@ -29,9 +28,6 @@ public class ArtistController {
@Inject @Inject
FeedService feedService; FeedService feedService;
@Inject
Vertx vertx;
@Inject @Inject
@Location("fragments/search-results") @Location("fragments/search-results")
Template searchResultsTemplate; Template searchResultsTemplate;
@@ -63,15 +59,11 @@ public class ArtistController {
public Response trackArtist(@PathParam("mbid") String mbid) { public Response trackArtist(@PathParam("mbid") String mbid) {
var artist = artistService.addArtist(mbid); var artist = artistService.addArtist(mbid);
var types = getMonitoredTypes(artist); var types = getMonitoredTypes(artist);
vertx.executeBlocking(promise -> {
releaseGroupService.fetchAndCache(artist.mbid(), artist.name(), types); releaseGroupService.fetchAndCache(artist.mbid(), artist.name(), types);
promise.complete();
});
var allArtists = artistService.findAll(); var allArtists = artistService.findAll();
var listHtml = artistListTemplate.data("artists", allArtists).render(); var listHtml = artistListTemplate.data("artists", allArtists).render();
var emptySearch = searchResultsTemplate.data("artists", List.of()).render(); var emptySearch = searchResultsTemplate.data("artists", List.of()).render();
var combined = emptySearch + listHtml; return Response.ok(emptySearch + listHtml).build();
return Response.ok(combined).build();
} }
@DELETE @DELETE