mirror of
https://github.com/filamentphp/filament.git
synced 2026-09-01 15:09:33 +08:00
8f341895a9
* fix(actions): add batch-cancel early-return and failed() handler to ExportCsv and ImportCsv
Two pure additions on both row-processor jobs. No existing property
is touched; `$maxExceptions = 5`, `retryUntil()`, `backoff()`,
`middleware()`, and `tags()` delegation all preserved.
- `if ($this->batch()?->cancelled()) { return; }` at the top of
`handle()` so a batch cancelled via `Bus::findBatch($id)->cancel()`
stops in-flight chunks on the next worker cycle instead of running
every popped chunk to completion.
- `failed()` handler with scalar-only log context (`export_id` /
`import_id`, `page`, `batch_id`, exception class, exception
message). No secret leakage.
Tests:
- `{Export,Import}CsvBatchCancellationTest`: use
`withFakeBatch(cancelledAt: ...)` + Mockery
`shouldNotReceive('getAttribute')->with('user')` to prove the
early-return fires.
- `{Export,Import}CsvFailedHandlerTest`: call
`failed(new RuntimeException(...))` against `Log::shouldReceive('error')`
to pin the structured log context shape.
* fix(actions): add failed() + explicit $tries/$maxExceptions to three standalone jobs
These three jobs have never had retry properties set. The implicit
design is "inherit the worker default," which varies by platform:
`queue:work` uses 1, `vapor:work` signature says 0 but runtime
overrides to `SQS_TRIES ?? 3`, Horizon supervisor configs vary.
Make the intent explicit per each job's idempotency and runtime
profile.
PrepareCsvExport (Batchable orchestrator, non-idempotent):
`$tries = 1` (retry would re-dispatch children via `batch()->add()`),
`$maxExceptions = 0`, batch-cancel early-return, `failed()` handler.
No `$timeout`: work scales with source-query size, keep worker-
inherited timeout rather than cap at 60s.
ExportCompletion (not Batchable, non-idempotent notifier):
`$tries = 1` (retry would double-notify), `$maxExceptions = 0`,
`failed()` handler. No `$timeout`: single `Notification::send()` or
`Notification::sendToDatabase()` call, sub-second runtime.
CreateXlsxFile (not Batchable, idempotent file converter):
`$tries = 3` (re-reads CSV chunks and overwrites same XLSX, so
transient failures recover), `$backoff = [30, 60, 300]` (avoids
0-second retry loop since `$tries > 1`), `$maxExceptions = 0`,
`failed()` handler. No `$timeout`: XLSX conversion runtime is
O(row count), large exports need worker-inherited timeout (Vapor
Lambda ceiling, Horizon supervisor) rather than 60s cap.
None of these three delegate `retryUntil()`, so `$tries` is the
active attempts bound. Public API unchanged.
* Remove tests (too brittle)
* Remove failed() hooks (too opinionated)
* cs
---------
Co-authored-by: Dan Harrin <git@danharrin.com>