is_test) { return; } $webhooks = FormSchemaWebhook::query() ->where('form_schema_id', $submission->form_schema_id) ->where('trigger_event', $triggerEvent) ->where('is_active', true) ->get(); foreach ($webhooks as $webhook) { /** @var FormWebhookDelivery $delivery */ $delivery = FormWebhookDelivery::create([ 'form_schema_webhook_id' => $webhook->id, 'form_submission_id' => $submission->id, 'trigger_event' => $triggerEvent, 'status' => FormWebhookDeliveryStatus::PENDING->value, 'attempts' => 0, 'payload_snapshot' => $this->buildPayload($submission, $triggerEvent), ]); DeliverFormWebhookJob::dispatch($delivery->id)->onConnection('webhooks')->onQueue('webhooks'); } } /** * @return array */ private function buildPayload(FormSubmission $submission, string $triggerEvent): array { $submission->loadMissing(['schema', 'schema.organisation', 'values.field']); $values = []; foreach ($submission->values as $value) { if ($value->field?->slug) { $values[$value->field->slug] = $value->value; } } return [ 'event' => 'form_submission.'.$triggerEvent, 'triggered_at' => now()->toIso8601String(), 'organisation' => [ 'id' => $submission->schema?->organisation?->id, 'name' => $submission->schema?->organisation?->name, 'slug' => $submission->schema?->organisation?->slug, ], 'schema' => [ 'id' => $submission->schema?->id, 'purpose' => $submission->schema?->purpose instanceof \BackedEnum ? $submission->schema->purpose->value : $submission->schema?->purpose, 'slug' => $submission->schema?->slug, 'version' => $submission->schema?->version, ], 'submission' => [ 'id' => $submission->id, 'subject_type' => $submission->subject_type, 'subject_id' => $submission->subject_id, 'submitted_at' => optional($submission->submitted_at)->toIso8601String(), 'submitted_by_user_id' => $submission->submitted_by_user_id, 'values' => $values, ], ]; } }