- 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>
61 lines
2.2 KiB
PHP
61 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\ArchivePendingJob;
|
|
use App\Services\Archive\ArchivePendingQueue;
|
|
use App\Services\Archive\EvidenceArchive;
|
|
use App\Services\Archive\PendingArchiveRetry;
|
|
use Illuminate\Console\Command;
|
|
|
|
/**
|
|
* Beweisarchiv (N11, Umsetzungsaudit 29.09.2026 A-01/A-02): offene
|
|
* Archivaufträge (archive_pending_jobs) je Ereignistyp nachholen. Läuft
|
|
* täglich. Ohne gültigen ARCHIVE_KEY bricht der Lauf ab, ohne einen
|
|
* Auftrag anzufassen. Bleibt etwas offen, endet er mit Fehlerstatus, und
|
|
* der Systemstatus zeigt die Zahl.
|
|
*/
|
|
class ArchiveRetryPending extends Command
|
|
{
|
|
protected $signature = 'archive:retry-pending {--dry-run : Nur zählen}';
|
|
|
|
protected $description = 'Holt ausstehende Beweisarchiv-Einträge (archive_pending_jobs) nach';
|
|
|
|
public function handle(PendingArchiveRetry $retry, ArchivePendingQueue $queue, EvidenceArchive $archive): int
|
|
{
|
|
if ($this->option('dry-run')) {
|
|
$status = $queue->status();
|
|
$this->info("Offen (Trockenlauf): {$status['jobs']} Archivaufträge, {$status['legacy_markers']} Altmarker ohne Auftrag.");
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
if (! $archive->isConfigured()) {
|
|
$this->error('ARCHIVE_KEY fehlt oder ist ungültig — nichts nachgeholt, alle Aufträge bleiben offen.');
|
|
|
|
return self::FAILURE;
|
|
}
|
|
|
|
$queue->adoptLegacyMarkers();
|
|
$pending = ArchivePendingJob::query()->count();
|
|
$totals = ['recorded' => 0, 'skipped' => 0, 'failed' => 0];
|
|
|
|
ArchivePendingJob::query()->lazyById(100)->each(function (ArchivePendingJob $job) use ($retry, &$totals): void {
|
|
foreach ($retry->retry($job) as $key => $count) {
|
|
$totals[$key] += $count;
|
|
}
|
|
});
|
|
|
|
$remaining = ArchivePendingJob::query()->count();
|
|
$this->info(sprintf(
|
|
'Nachgeholt: %d Archiveinträge aus %d Aufträgen; übersprungen: %d; fehlgeschlagen: %d; weiterhin offen: %d.',
|
|
$totals['recorded'],
|
|
$pending,
|
|
$totals['skipped'],
|
|
$totals['failed'],
|
|
$remaining,
|
|
));
|
|
|
|
return $totals['failed'] > 0 || $totals['skipped'] > 0 || $remaining > 0 ? self::FAILURE : self::SUCCESS;
|
|
}
|
|
}
|