- 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>
58 lines
1.8 KiB
PHP
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);
|
|
}
|
|
}
|