feat: replace /archive with release-cardinal searchable browser (Phase 9 §8.H)

Retire the three-card overview for a search + medium + genre browser over all
releases. Adds q/genre filter params to the api/release paged read path,
mirroring the existing api/track/page TrackFilter pattern.
This commit is contained in:
daniel-c-harvey
2026-06-13 20:47:50 -04:00
parent 18f4b596f2
commit 737c423d9c
13 changed files with 607 additions and 59 deletions
@@ -22,10 +22,12 @@ public class ReleaseProxyController : ControllerBase
_logger = logger;
}
/// <summary>Proxies the paged release list, forwarding the optional medium filter and sort params.</summary>
/// <summary>Proxies the paged release list, forwarding the optional medium, search (q), genre, and sort params.</summary>
[HttpGet]
public async Task<ActionResult> GetReleases(
[FromQuery] string? medium = null,
[FromQuery] string? q = null,
[FromQuery] string? genre = null,
[FromQuery] int page = 1,
[FromQuery] int pageSize = 20,
[FromQuery] string? sortColumn = null,
@@ -35,6 +37,10 @@ public class ReleaseProxyController : ControllerBase
var query = $"api/release?page={page}&pageSize={pageSize}&sortDescending={sortDescending}";
if (!string.IsNullOrWhiteSpace(medium))
query += $"&medium={Uri.EscapeDataString(medium)}";
if (!string.IsNullOrWhiteSpace(q))
query += $"&q={Uri.EscapeDataString(q)}";
if (!string.IsNullOrWhiteSpace(genre))
query += $"&genre={Uri.EscapeDataString(genre)}";
if (!string.IsNullOrWhiteSpace(sortColumn))
query += $"&sortColumn={Uri.EscapeDataString(sortColumn)}";