fix(form-builder): fire FormSubmissionSubmitted AFTER transaction commit (WS-6)
Per RFC O2: pre-commit dispatch let queued listeners (tag sync, shifts, webhooks, mailables) enqueue with state that might never persist on rollback. Move dispatch to after DB::transaction returns. This is semantically critical for the new ApplyBindings two-transaction pattern (RFC Q4): the inner transaction must commit before sibling listeners observe the submission. Refs: RFC-WS-6.md §5 (O2) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -103,7 +103,7 @@ final class FormSubmissionService
|
||||
{
|
||||
$this->assertWritable($submission);
|
||||
|
||||
return DB::transaction(function () use ($submission, $actor): FormSubmission {
|
||||
$result = DB::transaction(function () use ($submission, $actor): FormSubmission {
|
||||
$schema = $submission->schema;
|
||||
|
||||
$submission->status = FormSubmissionStatus::SUBMITTED->value;
|
||||
@@ -125,10 +125,17 @@ final class FormSubmissionService
|
||||
// Compute SIGNATURE hashes on submit (ARCH §9). One query, scalar-safe.
|
||||
$this->finaliseSignatureValues($submission);
|
||||
|
||||
FormSubmissionSubmitted::dispatch($submission);
|
||||
|
||||
return $submission->refresh();
|
||||
return $submission;
|
||||
});
|
||||
|
||||
// RFC-WS-6 §5 (O2) — fire AFTER commit. Pre-commit dispatch let
|
||||
// queued listeners (tag sync, shifts, webhooks, mailables) enqueue
|
||||
// with state that may never persist on rollback. The new
|
||||
// ApplyBindings two-transaction pattern (RFC Q4) requires the
|
||||
// outer commit to land before any listener observes the submission.
|
||||
FormSubmissionSubmitted::dispatch($result->refresh());
|
||||
|
||||
return $result->refresh();
|
||||
}
|
||||
|
||||
public function review(FormSubmission $submission, FormSubmissionReviewStatus $status, ?string $notes, User $reviewer): FormSubmission
|
||||
|
||||
Reference in New Issue
Block a user