presseportale/app/Services/Image/ImageRightsTextRenderer.php
Kevin Adametz e9bdff3ad3 images: Datenmodell, Textarchiv, Herkunftsprüfung und gemeinsamer Uploader für Formular v2 (Bildkennzeichnung Block A)
- 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>
2026-09-22 09:22:05 +00:00

58 lines
1.8 KiB
PHP

<?php
namespace App\Services\Image;
use App\Models\LegalDocument;
use App\Models\LegalText;
use Illuminate\Support\Carbon;
/**
* Löst die Platzhalter des Bestätigungstextes auf (Bildkennzeichnung A.3,
* Decision-Update S11): AGB-Fassung, Datum und Link kommen aus
* `legal_documents`, die Portalnamen aus der Konfiguration. Der gerenderte
* Wortlaut wird mit der Bestätigung gespeichert.
*/
class ImageRightsTextRenderer
{
/**
* Der heute abzugebende Text: gebunden an die aktuell gültige AGB-Fassung.
*/
public function current(string $locale = 'de'): ?LegalText
{
return LegalText::currentFor(
LegalText::TYPE_IMAGE_RIGHTS_CONFIRMATION,
LegalDocument::currentAgbVersion(),
$locale,
);
}
/**
* @return array{agb_version: string, agb_date: string, agb_url: string, portals: string}
*/
public function variables(?string $agbUrl = null): array
{
$agb = LegalDocument::current(LegalDocument::TYPE_AGB);
$version = $agb !== null ? $agb->version : LegalDocument::currentAgbVersion();
$date = $agb !== null
? $agb->effectiveFromFormatted()
: Carbon::parse((string) config('legal.agb_effective_from'))->locale('de')->isoFormat('D. MMMM YYYY');
return [
'agb_version' => $version,
'agb_date' => $date,
'agb_url' => $agbUrl ?? rtrim((string) config('app.url'), '/').'/de/agb',
'portals' => 'presseecho.de und businessportal24.com',
];
}
public function renderLong(LegalText $text, ?string $agbUrl = null): string
{
return $text->render($this->variables($agbUrl));
}
public function renderShort(LegalText $text, ?string $agbUrl = null): string
{
return $text->render($this->variables($agbUrl), short: true);
}
}