46 lines
1.9 KiB
Markdown
46 lines
1.9 KiB
Markdown
# Proposal
|
|
|
|
## Why
|
|
|
|
Permanently deleting a photo from the trash fails when the photo has no album
|
|
(`album_id IS NULL`) — the normal result of deleting an album, whose photos move
|
|
to the trash unbound (`photos/spec.md`, «Удаление альбома»). `PermanentDelete`
|
|
authorizes through the album, so these photos can never be removed, and the UI
|
|
surfaces `album_not_found`. In the local database 4010 of 4011 trashed photos are
|
|
in this state. There is also no way to clear the trash in bulk.
|
|
|
|
## What Changes
|
|
|
|
- Fix `PermanentDelete` authorization so a photo without an album can be
|
|
permanently deleted by a user who may delete it (its uploader), instead of
|
|
failing on a missing album.
|
|
- Add a bulk permanent-delete operation that empties the trash for the caller,
|
|
skipping photos the caller is not allowed to remove, and reporting how many
|
|
were deleted.
|
|
- Add an «Очистить корзину» action on the trash screen with a confirmation
|
|
dialog, refreshing the list and the rail counter afterwards.
|
|
|
|
## Capabilities
|
|
|
|
### New Capabilities
|
|
|
|
<!-- none: this extends existing photo lifecycle and workspace behavior -->
|
|
|
|
### Modified Capabilities
|
|
|
|
- `photos`: «Окончательное удаление» also covers photos with no album
|
|
(deleted album); add an «Очистка корзины» requirement for bulk permanent
|
|
removal.
|
|
- `ui-workspace`: trash screen gains an «Очистить корзину» control with
|
|
confirmation and post-action refresh.
|
|
|
|
## Impact
|
|
|
|
- Backend: `backend/internal/photos/service.go` (`PermanentDelete`), the photos
|
|
repository/store (new bulk purge method), `handlers.go`, and a route in
|
|
`backend/internal/app/app.go`.
|
|
- Frontend: `frontend/src/lib/api.ts`, `frontend/src/lib/stores/trash.svelte.ts`,
|
|
`frontend/src/routes/(app)/trash/+page.svelte`.
|
|
- Tests: e2e/contract coverage for permanently deleting an albumless photo and
|
|
for the bulk empty-trash path.
|