Lets admins merge duplicate SoftwareCompilation entries: a new
POST /software-compilations/{id}/merge endpoint re-parents releases,
covers, junction rows (with dedup/self-loop guards), and predecessor
references onto the target before deleting the sources. Wired into
both the Blazor MudBlazor admin page and the Uno admin page, each
with a search-based target/source picker, plus full localization.
Continues the prior commit (model/migrations/server) by finishing every
remaining consumer of the SoftwareCompilation entity introduced there.
- Regenerate Marechai.ApiClient from the updated OpenAPI schema: new
SoftwareCompilations request builders and DTOs
(SoftwareCompilationDto, SoftwareCompilationSuccessorDto,
SoftwareBySoftwareCompilationDto, SoftwareVersionBySoftwareCompilationDto),
SoftwareReleaseDto's IsCompilation replaced with SoftwareCompilationId/
SoftwareCompilation. Commit the openapi.yaml snapshot used to drive the
regeneration.
- Marechai (Blazor): add SoftwareCompilationsService and a full admin UI
for the new entity (SoftwareCompilations grid + SoftwareCompilationDialog
with bundled-software/machine pickers, predecessor/relationship type,
and tabs for included software, included versions, sub-compilations,
and releases) plus a public detail page at /software-compilation/{id}.
SoftwareReleaseDialog drops the old IsCompilation checkbox and per-release
included-items management in favor of a SoftwareCompilation autocomplete
picker, since compilation membership now lives on the compilation entity
itself rather than on individual releases. Updated every remaining
IsCompilation/old-junction-DTO reference in release dialogs, the public
release/software view pages, and the suggestion dialog. Search.razor now
routes compilation rows to /software-compilation/{id} instead of a release.
- Marechai.App (Uno): mechanical fixes for the removed IsCompilation
property and old junction DTOs, and the same scope cut as the Blazor
app — included-items management removed from the release editor and
read-only release view (that UI now belongs solely on the compilation),
with the now-dead helper methods and XAML sections removed.
- Marechai.MobyGames: CompilationRelationService and ImportService now
create a real SoftwareCompilation row instead of flipping a release flag,
and resolve each contained slug to either a Software or an existing
SoftwareCompilation. This fixes a long-standing bug where a slug
previously converted into a compilation had no replacement pointer
recorded on MobyGamesImportState, so re-encountering it as a nested
member of another compilation could never resolve. Nested compilations
are now linked via SoftwareCompilationBySoftwareCompilation.
StateService.MarkImportedAsync gained a softwareCompilationId parameter,
and OrphanCleanupService's software-merge dedup pass was re-keyed from
the old release-keyed junction to SoftwareBySoftwareCompilation.
Full solution build is clean with no pending EF model changes against the
three migrations from the prior commit.