|
|
ed1f883ff1
|
feat: implement entry deletion
- database: cascade_cached_bytes_after_subtree_delete — one-pass set-aware
SQL that excludes the entire subtree simultaneously, avoiding sibling-blob
cross-counting bug
- database: delete_entry — collects subtree IDs, runs set-aware cascade,
NULLs archive_run_items.produced_entry_id (FK blocker), deletes children
then root; ON DELETE CASCADE handles artifacts/tags/collections
- server: DELETE /api/archives/:archive_id/entries/:entry_uid route,
wrapped in a transaction for atomicity
- frontend: deleteEntry API call, handleEntryDeleted callback in App.jsx
(optimistic list removal + selection clear), Delete entry button in
ContextRail with confirm guard
- tests: 4 database tests (unknown uid, subtree removal, run_item nulling,
cached_bytes recalculation) + 3 route tests (204+gone, 404, 401)
|
2026-07-04 13:46:19 +02:00 |
|