- A-01/A-02/A-04: archive_pending_jobs je Vorgang (ArchivePendingQueue), Depublikationsstand am Auftrag festgehalten, Nachholer ohne Schlüssel FAILURE; archive_pending_at nur noch Sammelmarker - O07: Direktweg und Nachholer beanspruchen den Auftrag unter Zeilensperre - O08: fehlende Snapshot-Datei → Verweis auf den image_removed-Eintrag oder offener Auftrag, nie ein still unvollständiger Nachweis - A-03/A-06: Sweep verschiebt in die Quarantäne, Pause beim Restore, archive:reregister; Restore-Abgleich löscht Anwendungskopien erneut - O04/O05: Restore ordnet über den Payload-Pfad zu; unsignierte Exporte nur mit --accept-unsigned, reregister bricht bei ungültigem/fehlendem Export ab - A-05, A-07 bis A-15: Altbestand als möglicherweise veröffentlicht, Hold- Historie, Zweck per POST, Nachweise gelöschter Bilder nur mit compliance:manage, Anhänge auf ihrer Disk, Schlüssel-ID und ARCHIVE_PREVIOUS_KEYS, HMAC per HKDF, archive:verify-export - 5.1 d: Depublikation im Meldeverfahren trägt legal_request_id PressReleaseService.php enthält zusätzlich K-01 (Prüfung im Publish-Lock), N19 (archive() gibt Kopien frei) und N09 (markImagesPublished nur für auslieferbare Bilder), weil die Datei ungeteilt committet ist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 lines
1.4 KiB
PHP
38 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\ArchivePendingJob;
|
|
use App\Models\PressReleaseRedactionSnapshot;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
/**
|
|
* Löscht verschlüsselte Vorher-Snapshots des Meldeverfahrens nach Ablauf
|
|
* ihrer Löschfrist (purge_after, gesetzt aus legal.snapshot_retention_days).
|
|
* Danach ist eine Schwärzung endgültig — genau so gewollt: Alt-Werte dürfen
|
|
* nicht unbegrenzt weiterleben. Läuft täglich via Scheduler.
|
|
*
|
|
* Ausgenommen sind Meldungen mit offenem Archivauftrag oder Marker
|
|
* (Umsetzungsaudit 29.09.2026, A-13): der Nachholer braucht den
|
|
* Vorher-Stand noch; der Snapshot fällt im ersten Lauf danach.
|
|
*/
|
|
class PurgeRedactionSnapshots extends Command
|
|
{
|
|
protected $signature = 'snapshots:purge';
|
|
|
|
protected $description = 'Löscht abgelaufene Schwärzungs-Snapshots (Löschfrist überschritten).';
|
|
|
|
public function handle(): int
|
|
{
|
|
$deleted = PressReleaseRedactionSnapshot::query()
|
|
->dueForPurge()
|
|
->whereNotIn('press_release_id', ArchivePendingJob::query()->select('press_release_id'))
|
|
->whereNotIn('press_release_id', DB::table('press_releases')->whereNotNull('archive_pending_at')->select('id'))
|
|
->delete();
|
|
|
|
$this->info("Schwärzungs-Snapshots bereinigt: {$deleted} Einträge gelöscht.");
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|