fix: isolate public subscribe from integration job failures
Queue Weeztix/Mailwizz after the HTTP response and catch dispatch errors. Jobs log Mailwizz/Weeztix API failures without rethrowing so sync driver and terminating callbacks do not surface 500s after a successful create. Add JS fallback for non-JSON error responses, deployment note, and a regression test for failing Mailwizz under QUEUE_CONNECTION=sync. Made-with: Cursor
This commit is contained in:
@@ -52,27 +52,42 @@ final class IssueWeeztixCouponForSubscriber implements ShouldBeUnique, ShouldQue
|
||||
|
||||
public function handle(): void
|
||||
{
|
||||
$subscriber = Subscriber::query()
|
||||
->with(['preregistrationPage.weeztixConfig', 'preregistrationPage.mailwizzConfig'])
|
||||
->find($this->subscriber->id);
|
||||
try {
|
||||
$subscriber = Subscriber::query()
|
||||
->with(['preregistrationPage.weeztixConfig', 'preregistrationPage.mailwizzConfig'])
|
||||
->find($this->subscriber->id);
|
||||
|
||||
if ($subscriber === null) {
|
||||
return;
|
||||
if ($subscriber === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$page = $subscriber->preregistrationPage;
|
||||
if ($page === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$config = $page->weeztixConfig;
|
||||
$couponMissing = ! is_string($subscriber->coupon_code) || $subscriber->coupon_code === '';
|
||||
|
||||
if ($couponMissing && $this->weeztixCanIssueCodes($config)) {
|
||||
$this->tryAttachWeeztixCouponCode($subscriber, $config);
|
||||
}
|
||||
|
||||
$this->dispatchMailwizzIfNeeded($subscriber);
|
||||
} catch (Throwable $e) {
|
||||
Log::error('IssueWeeztixCouponForSubscriber: handle failed', [
|
||||
'subscriber_id' => $this->subscriber->id,
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
|
||||
$subscriber = Subscriber::query()
|
||||
->with(['preregistrationPage.mailwizzConfig'])
|
||||
->find($this->subscriber->id);
|
||||
|
||||
if ($subscriber !== null) {
|
||||
$this->dispatchMailwizzIfNeeded($subscriber);
|
||||
}
|
||||
}
|
||||
|
||||
$page = $subscriber->preregistrationPage;
|
||||
if ($page === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$config = $page->weeztixConfig;
|
||||
$couponMissing = ! is_string($subscriber->coupon_code) || $subscriber->coupon_code === '';
|
||||
|
||||
if ($couponMissing && $this->weeztixCanIssueCodes($config)) {
|
||||
$this->tryAttachWeeztixCouponCode($subscriber, $config);
|
||||
}
|
||||
|
||||
$this->dispatchMailwizzIfNeeded($subscriber);
|
||||
}
|
||||
|
||||
public function failed(?Throwable $exception): void
|
||||
@@ -97,7 +112,14 @@ final class IssueWeeztixCouponForSubscriber implements ShouldBeUnique, ShouldQue
|
||||
$page?->loadMissing('mailwizzConfig');
|
||||
|
||||
if ($page?->mailwizzConfig !== null) {
|
||||
SyncSubscriberToMailwizz::dispatch($subscriber->fresh());
|
||||
try {
|
||||
SyncSubscriberToMailwizz::dispatch($subscriber->fresh());
|
||||
} catch (Throwable $e) {
|
||||
Log::error('IssueWeeztixCouponForSubscriber: could not queue Mailwizz sync', [
|
||||
'subscriber_id' => $subscriber->id,
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,18 @@ class SyncSubscriberToMailwizz implements ShouldBeUnique, ShouldQueueAfterCommit
|
||||
}
|
||||
|
||||
public function handle(): void
|
||||
{
|
||||
try {
|
||||
$this->runSync();
|
||||
} catch (Throwable $e) {
|
||||
Log::error('SyncSubscriberToMailwizz: integration failed; subscriber remains local (use admin resync if needed)', [
|
||||
'subscriber_id' => $this->subscriber->id,
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function runSync(): void
|
||||
{
|
||||
$subscriber = Subscriber::query()
|
||||
->with(['preregistrationPage.mailwizzConfig'])
|
||||
|
||||
@@ -9,6 +9,8 @@ use App\Jobs\SyncSubscriberToMailwizz;
|
||||
use App\Models\PreregistrationPage;
|
||||
use App\Models\Subscriber;
|
||||
use App\Models\WeeztixConfig;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Orchestrates public registration: local persist first, then queue external integrations
|
||||
@@ -26,10 +28,18 @@ final class RegisterSubscriberOnPage
|
||||
$page->loadMissing('weeztixConfig', 'mailwizzConfig');
|
||||
$weeztix = $page->weeztixConfig;
|
||||
|
||||
if ($this->weeztixCanIssueCodes($weeztix)) {
|
||||
IssueWeeztixCouponForSubscriber::dispatch($subscriber);
|
||||
} elseif ($page->mailwizzConfig !== null) {
|
||||
SyncSubscriberToMailwizz::dispatch($subscriber->fresh());
|
||||
try {
|
||||
if ($this->weeztixCanIssueCodes($weeztix)) {
|
||||
IssueWeeztixCouponForSubscriber::dispatch($subscriber)->afterResponse();
|
||||
} elseif ($page->mailwizzConfig !== null) {
|
||||
SyncSubscriberToMailwizz::dispatch($subscriber->fresh())->afterResponse();
|
||||
}
|
||||
} catch (Throwable $e) {
|
||||
Log::error('RegisterSubscriberOnPage: could not queue integration jobs', [
|
||||
'subscriber_id' => $subscriber->id,
|
||||
'preregistration_page_id' => $page->id,
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
|
||||
return $subscriber;
|
||||
|
||||
Reference in New Issue
Block a user