Implemented and merged in PR #55. The PUT /api/person endpoint creates persons, the "New Cosplayer" button on /cosplayers opens PersonForm in create mode for admin/curator.
@REDCODE done — GET /api/person/{id} now uses [FromQuery] PagedParametersDto albumPaging instead of individual albumPage/albumPageSize params. URL: GET /api/person/{id}?page=0&pageSize=150
@REDCODE all 3 changes implemented:
- Person hard delete with cascade —
DELETE /api/person/{id}and bulk delete now hard-remove persons from DB. Before deleting, all albums linked to that…
Addressed review comments:
- BulkUpdate — implemented: fetches people by IDs, applies the common updates (Name, ProfileAssetId, crop fields), saves.
- BulkDelete — implemented:…
Final status — PR #55
✅ Implemented
/cosplayerspage — card grid with profile images, album counts, click-through/cosplayer/{Id:guid}page — album cover mosaic banner, profile…
Progress update from PR #55:
- AlbumCard — extracted into
MilkStream.Client/Components/Shared/AlbumCard.razor, used in both Albums and CosplayerDetail pages - Audit other pages for…
Implemented in PR #55:
PUT /api/person— now creates a person with name and ProfileAssetIdPersonService.CreatePersonAsync()— client method- "New Cosplayer" button on
/cosplayers…
#58 (cropper mismatch) is now fixed — display uses pixel-exact transform positioning. Ready to close when PR #55 merges.
Fixed in latest commit to PR #55. The display now uses pixel-exact transform: translate(calc(-cx * 1%), calc(-cy * 1%)) with left: 50%; top: 50% on an <img> element instead of the complex…
Opened #58 to track the remaining cropper-to-display mismatch issue. The coordinate mapping between the cropper viewport (background-size: contain) and the avatar display (background-position…
Opened #58 to track the remaining cropper-to-display mismatch issue. The current implementation gets close but the exact coordinate mapping between the cropper viewport (contain) and the avatar…
Redesigned the profile picture cropper:
- Full image displayed in a viewport with a dimmed overlay
- A transparent circular "hole" shows where the profile pic will crop
- A square border around…
Additional fix included in PR: when the refresh token is invalid or expired, the user is now force-logged out and redirected to /login with the message "Session expired. Please log in again."…
First-pass plan saved in .opencode/plan-56-api-test-coverage.md. Covers every missing controller via REST Client script extensions:
- Auth: refresh token flow
- Album, Tag: create →…
Implementation complete in PR #55. All items implemented:
- ✅ Person model: ProfileAssetId FK + migration
- ✅ DTOs: PersonDetailedDto (with List), PersonPreviewDto, CreateDto,…