feat(release): front int PK with app-minted GUID EntryKey on the public addressing surface (P11 W5, 11.H)

This commit is contained in:
daniel-c-harvey
2026-06-16 17:11:55 -04:00
parent fe28573b68
commit f07d29cdcf
37 changed files with 627 additions and 160 deletions
@@ -35,7 +35,7 @@ public class ReleaseDetailViewModel
IsLoading = false;
}
public async Task Load(long releaseId)
public async Task Load(string entryKey)
{
IsLoading = true;
NotFound = false;
@@ -44,7 +44,7 @@ public class ReleaseDetailViewModel
try
{
var releaseResult = await _releaseData.GetById(releaseId);
var releaseResult = await _releaseData.GetByEntryKey(entryKey);
if (releaseResult is not { Success: true, Value: { } release })
{
NotFound = true;
@@ -54,9 +54,11 @@ public class ReleaseDetailViewModel
Release = release;
// Resolve the playable track via the releaseId-filtered track page — an exact join, not a
// title string (which collides across same-titled releases and breaks on rename). Session/Mix
// releases carry a single track; take the first. A release with no streamable track simply
// leaves Track null (the detail page hides the play affordance).
// title string (which collides across same-titled releases and breaks on rename). The public
// page addresses the release by EntryKey; the track→release join stays on the internal int
// FK (Phase 11 §3e leaves internal joins on the int PK), so use the resolved release.Id here.
// Session/Mix releases carry a single track; take the first. A release with no streamable
// track simply leaves Track null (the detail page hides the play affordance).
var trackResult = await _trackData.GetPage(
pageNumber: 1, pageSize: 1, releaseId: release.Id);
if (trackResult is { Success: true, Value: { Items: { } items } })