Backend REST API for multi-collections (#151) and rerun-collections (#152) over the existing MediatR handlers. API-only — SPA editor screens are a follow-up (thin api-client modules added so they're unblocked).
MultiCollectionController + RerunCollectionController: list (paged, clamped) / get / create / update / delete, following the CollectionController/SmartCollectionController pattern (ApiResults, 404 pre-checks, #nullable enable DTOs, [EndpointGroupName], full [ProducesResponseType]).
Response DTOs flatten the Application VMs; CollectionType/PlaybackOrder exposed as string-enums via the global converter (matches BlockItemResponseModel precedent).
Rerun request DTO takes CollectionType + a single SelectedId; ToCommand() builds a minimal id-only VM — confirmed the handlers read only .Id/.MediaItemId, so no extra lookups (documented inline in RerunCollectionRequestMapping.cs).
Controller + contract tests added; OpenAPI + TS types regenerated (4 new paths, 10 new schemas, zero removed; docs/endpoint-index.md auto-regenerated). Thin web/src/api/multiCollections.ts + rerunCollections.ts.
Verified pre-merge-of-main: ErsatzTV.Tests 863 green, web typecheck+lint+build+vitest 330 green. origin/main (#187 assembly-scan) merged in cleanly — the two new controllers are auto-covered by the security scan.
Refs #151, #152 (kept open until the SPA editors land).
Backend REST API for multi-collections (#151) and rerun-collections (#152) over the existing MediatR handlers. **API-only** — SPA editor screens are a follow-up (thin api-client modules added so they're unblocked).
- `MultiCollectionController` + `RerunCollectionController`: list (paged, clamped) / get / create / update / delete, following the CollectionController/SmartCollectionController pattern (ApiResults, 404 pre-checks, `#nullable enable` DTOs, [EndpointGroupName], full [ProducesResponseType]).
- Response DTOs flatten the Application VMs; `CollectionType`/`PlaybackOrder` exposed as string-enums via the global converter (matches `BlockItemResponseModel` precedent).
- **Rerun request DTO** takes `CollectionType` + a single `SelectedId`; `ToCommand()` builds a minimal id-only VM — confirmed the handlers read only `.Id`/`.MediaItemId`, so no extra lookups (documented inline in `RerunCollectionRequestMapping.cs`).
- Controller + contract tests added; OpenAPI + TS types regenerated (4 new paths, 10 new schemas, zero removed; `docs/endpoint-index.md` auto-regenerated). Thin `web/src/api/multiCollections.ts` + `rerunCollections.ts`.
- `docs/blazor-route-parity.md` updated (API done; SPA editor pending).
Verified pre-merge-of-main: `ErsatzTV.Tests` 863 green, web typecheck+lint+build+vitest 330 green. origin/main (#187 assembly-scan) merged in cleanly — the two new controllers are auto-covered by the security scan.
Refs #151, #152 (kept open until the SPA editors land).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Adds MultiCollectionController + RerunCollectionController (list/get/create/update/
delete) over the existing MediatR handlers, with response/request DTOs, controller +
contract tests, regenerated OpenAPI + TS types, and thin SPA api-client modules. SPA
editor screens are a follow-up. Rerun request DTO resolves the chosen entity id into
the minimal VM the handler reads (documented inline).
Refs #151, #152
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The rerun request mapping's catch-all routed Playlist/RerunFirstRun/RerunRerun/
SearchQuery/Fake* to MediaItemId, so POST/PUT with those persisted a wrong-kind id
and returned 201 instead of 422. Guard both verbs with IsSupportedSelectionType.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Backend REST API for multi-collections (#151) and rerun-collections (#152) over the existing MediatR handlers. API-only — SPA editor screens are a follow-up (thin api-client modules added so they're unblocked).
MultiCollectionController+RerunCollectionController: list (paged, clamped) / get / create / update / delete, following the CollectionController/SmartCollectionController pattern (ApiResults, 404 pre-checks,#nullable enableDTOs, [EndpointGroupName], full [ProducesResponseType]).CollectionType/PlaybackOrderexposed as string-enums via the global converter (matchesBlockItemResponseModelprecedent).CollectionType+ a singleSelectedId;ToCommand()builds a minimal id-only VM — confirmed the handlers read only.Id/.MediaItemId, so no extra lookups (documented inline inRerunCollectionRequestMapping.cs).docs/endpoint-index.mdauto-regenerated). Thinweb/src/api/multiCollections.ts+rerunCollections.ts.docs/blazor-route-parity.mdupdated (API done; SPA editor pending).Verified pre-merge-of-main:
ErsatzTV.Tests863 green, web typecheck+lint+build+vitest 330 green. origin/main (#187 assembly-scan) merged in cleanly — the two new controllers are auto-covered by the security scan.Refs #151, #152 (kept open until the SPA editors land).
🤖 Generated with Claude Code