- press_release_images: Kundenangabe/Portalkennzeichnung getrennt, Herkunftsbefund, Beweisoriginal, Snapshot-Pfade, published_ever_at, rules_version, Fokus/Letterbox; Bestand unangetastet - legal_texts (insert-only) mit img-confirm-v1 (alter Wortlaut), v2 (AGB 0.6), v3 (AGB 0.7, noch ohne Datum); image-rights:backfill-confirmations - image_rights_confirmations polymorph, insert-only, IP als versionierter HMAC; Löschung nur für nie veröffentlichte Uploads - ImageProvenanceInspector (Imagick/exif): IPTC, XMP, EXIF; algorithmicallyEnhanced nur Vermerk; unlesbare Datei = error - PressReleaseImageUploader: Original vor Derivaten, Hash-Bindung, Titelbild-Regel unter Sperre, Dateien bei Fehlern zurückgerollt; Admin-Upload ohne Bestätigung - ImageService: kein Rückfall auf die Quelldatei, og-Variante, Fokuspunkt und no_crop Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
28 lines
905 B
PHP
28 lines
905 B
PHP
<?php
|
|
|
|
namespace App\Observers;
|
|
|
|
use App\Models\ImageRightsConfirmation;
|
|
use LogicException;
|
|
|
|
/**
|
|
* Hält das Bestätigungsprotokoll insert-only (Bildkennzeichnung A.2). Eine
|
|
* Löschung ist nur über purgeForUnpublished() erlaubt — die Sofortlöschung
|
|
* nie veröffentlichter Uploads (Decision-Update E4).
|
|
*/
|
|
class ImageRightsConfirmationObserver
|
|
{
|
|
public function updating(ImageRightsConfirmation $confirmation): void
|
|
{
|
|
throw new LogicException('image_rights_confirmations ist insert-only; eine neue Bestätigung ist eine neue Zeile.');
|
|
}
|
|
|
|
public function deleting(ImageRightsConfirmation $confirmation): void
|
|
{
|
|
if ($confirmation->purgingUnpublished) {
|
|
return;
|
|
}
|
|
|
|
throw new LogicException('image_rights_confirmations wird nicht gelöscht; nur nie veröffentlichte Uploads dürfen über purgeForUnpublished() verschwinden.');
|
|
}
|
|
}
|