Three CLI commands for ops use, mirroring the API endpoints in Task 9: - form-failures:retry (id|submission|org filter, --dry-run) - form-failures:resolve (single id, optional note) - form-failures:dismiss (single id, DismissalReasonType + note) Cross-tenant isolation enforced via form_submissions.organisation_id FK chain (RFC V3). retry_count incremented on retry; failure history preserved (new row on repeat failure, not in-place mutation). Refs: RFC-WS-6.md §3 (Q5), §4 (V2, V3) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
59 lines
1.6 KiB
PHP
59 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\FormBuilder\FormSubmissionActionFailure;
|
|
use Illuminate\Console\Command;
|
|
|
|
/**
|
|
* RFC-WS-6 §3 (Q5) + §4 (V2) — single-id resolve action.
|
|
* Bulk resolve via API only (audit-trail concern).
|
|
*/
|
|
final class ResolveFormSubmissionActionFailures extends Command
|
|
{
|
|
protected $signature = 'form-failures:resolve
|
|
{id : FormSubmissionActionFailure ULID}
|
|
{--note= : Optional resolution note}';
|
|
|
|
protected $description = 'Mark a single FormSubmissionActionFailure as resolved';
|
|
|
|
public function handle(): int
|
|
{
|
|
$id = (string) $this->argument('id');
|
|
$note = $this->option('note');
|
|
|
|
$failure = FormSubmissionActionFailure::query()->withoutGlobalScopes()->find($id);
|
|
if ($failure === null) {
|
|
$this->error("Failure {$id} not found.");
|
|
|
|
return self::FAILURE;
|
|
}
|
|
|
|
if ($failure->resolved_at !== null) {
|
|
$this->warn("Failure {$id} already resolved at {$failure->resolved_at}; no-op.");
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
if ($failure->dismissed_at !== null) {
|
|
$this->warn("Failure {$id} already dismissed at {$failure->dismissed_at}; cannot resolve.");
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
if (! $this->confirm("Resolve failure {$id}?", true)) {
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
$failure->resolved_at = now();
|
|
$failure->resolved_note = $note !== null ? (string) $note : null;
|
|
$failure->save();
|
|
|
|
$this->info("Resolved failure {$id}.");
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|