Papierkorb statt endgültigem Löschen, und Zugriffsregeln für jede Bild-Route

Löschen in der Bibliothek entfernte Zeile und Ergebnisdatei sofort. Ein
Fehlklick, und ein Ergebnis war weg — samt dem, was es gekostet hat.
Jetzt landet es im Papierkorb:

- weg aus Bibliothek, Freigabelinks, ZIPs, Auslieferung, NAS-Spiegel,
  Druckquellen und Druckverlauf; beim Wiederherstellen unverändert zurück
- „Rückgängig" im Hinweis, Papierkorb-Ansicht mit Resttagen,
  Wiederherstellen, endgültig löschen, leeren
- die Wartung räumt nach settings.trash_days (Standard 30, Admin ->
  Speicher) endgültig ab; 0 schaltet den Papierkorb aus
- ein Bild, das noch in der Warteschlange wartet, wird nicht mehr
  erzeugt (und nicht bezahlt)
- endgültig gelöscht wird nur, was kein anderes Bild mehr nutzt —
  Alternativen teilen ihre Quelle mit dem Original, auch Kombinieren-
  Quellen in source_paths (jsonb)

Beim Durchgehen jeder Abfrage auf items fiel auf: Nur die Datei-Route
prüfte, wer ein Bild sehen darf. Umbenennen, Löschen, Wiederholen,
Alternative, Weiterbearbeiten und die Auswahl-ZIP nahmen jede Kennung von
jedem Konto. Jetzt gilt eine Regel (src/lib/itemaccess.ts): sehen, was
einem gehört oder in der geteilten Bibliothek liegt, ändern nur Eigenes;
Admins alles. Für Till ändert sich nichts. Lea kann fremde Bilder in der
geteilten Bibliothek weiter sehen, aber nicht mehr löschen.

Dazu Favicon und Homebildschirm-Symbol, Hilfe und Changelog-Seite.

Geprüft gegen echtes Postgres mit zwei Konten und echten Dateien:
35 Ende-zu-Ende-Prüfungen bestanden, Oberfläche im Browser (Löschen,
Rückgängig, Papierkorb, Wiederherstellen, 390 px ohne Querlauf).
128 Tests, Typprüfung 0 Fehler.
This commit is contained in:
till committed 2026-10-10 06:38:42 +00:00
1 parent ee887cc29c
commit 28a6049548
33 files changed
+456 -40

No files matched your search

+31
View File
@@ -2,6 +2,37 @@
All notable changes to Klarbild are documented here. Newest first.
## 2026-10-10 — Trash, access rules, current dependencies
### Added
- **Trash instead of deleting for good.** Deleting moves an image into the trash
(`items.deleted_at`, migration 017). It disappears from the library, share links, ZIPs,
deliveries, the backup mirror, print sources and the print history, and returns
unchanged on restore. A toast offers "Rückgängig"; the trash view lists days left,
restore, delete for good, empty. Maintenance purges after `settings.trash_days`
(default 30, Admin → Speicher); 0 switches the trash off. API: `DELETE /api/items/:id`
(trash), `?purge=1`, `GET|POST|DELETE /api/trash`.
- Purging deletes only files no other image still uses — alternatives share their source
with the original, including combine sources in `source_paths` (jsonb).
- An image trashed while queued is skipped by the worker instead of being generated.
- Favicon and iPhone home-screen icon.
### Fixed
- **Access checks on every image route.** Only the file route checked visibility before;
rename, delete, retry, alternative, reuse and the selection ZIP accepted any id from any
account. One rule in `src/lib/itemaccess.ts`: read own (or shared library, never a
private session), change own; admins all.
- Telegram print sheets had no footer: the footer was passed as a string instead of a
`FooterSpec`, so `.text` was undefined.
- `npm run typecheck` exists and reports 0 errors (17 before).
### Changed
- Dependencies: nodemailer 10, basic-ftp 6, argon2 0.45, archiver 8 (`ZipArchive`),
ssh2-sftp-client 12, @astrojs/react 7, Astro 7.3.8, sharp 0.35.5. `npm audit`: 0.
pg-boss stays on 10 (12 cannot migrate the v10 schema in place).
- basic-ftp 6 no longer redirects the data connection when an FTP server behind NAT
announces its private address. Run "Verbindung testen" for each FTPS target.
## 2026-09-01 (later) — Unique names for print files
### Fixed