load(['blocks' => fn ($q) => $q->orderBy('sort_order')]); $pageState = $this->resolvePageState($publicPage); $blocksToRender = $this->filterBlocksForPageState($publicPage, $pageState); $subscriberCount = $publicPage->subscribers()->count(); $title = $publicPage->headlineForMeta(); return view('public.page', [ 'page' => $publicPage, 'pageState' => $pageState, 'blocksToRender' => $blocksToRender, 'subscriberCount' => $subscriberCount, 'title' => $title, ]); } public function subscribe(SubscribePublicPageRequest $request, PreregistrationPage $publicPage): JsonResponse { abort_if(now()->lt($publicPage->start_date) || now()->gt($publicPage->end_date), 403); $validated = $request->validated(); $exists = $publicPage->subscribers() ->where('email', $validated['email']) ->exists(); if ($exists) { return response()->json([ 'success' => false, 'message' => __('You are already registered for this event.'), ], 422); } $subscriber = $publicPage->subscribers()->create($validated); $publicPage->loadMissing('weeztixConfig'); $weeztix = $publicPage->weeztixConfig; if ($this->weeztixCanIssueCodes($weeztix)) { $this->tryAttachWeeztixCouponCode($subscriber, $weeztix); } if ($publicPage->mailwizzConfig !== null) { SyncSubscriberToMailwizz::dispatch($subscriber->fresh()); } return response()->json([ 'success' => true, 'message' => $publicPage->thank_you_message ?? __('Thank you for registering!'), ]); } private function weeztixCanIssueCodes(?WeeztixConfig $config): bool { if ($config === null || ! $config->is_connected) { return false; } $company = $config->company_guid; $coupon = $config->coupon_guid; return is_string($company) && $company !== '' && is_string($coupon) && $coupon !== ''; } private function tryAttachWeeztixCouponCode(Subscriber $subscriber, WeeztixConfig $config): void { $freshConfig = $config->fresh(); if ($freshConfig === null) { return; } $service = new WeeztixService($freshConfig); $maxAttempts = 5; for ($attempt = 0; $attempt < $maxAttempts; $attempt++) { try { $code = WeeztixService::generateUniqueCode( is_string($freshConfig->code_prefix) && $freshConfig->code_prefix !== '' ? $freshConfig->code_prefix : 'PREREG' ); $service->createCouponCode($code); $subscriber->update(['coupon_code' => $code]); return; } catch (WeeztixCouponCodeConflictException) { continue; } catch (Throwable $e) { Log::error('Weeztix coupon creation failed', [ 'subscriber_id' => $subscriber->id, 'message' => $e->getMessage(), ]); return; } } Log::warning('Weeztix coupon: exhausted duplicate retries', [ 'subscriber_id' => $subscriber->id, ]); } private function resolvePageState(PreregistrationPage $page): string { if ($page->isBeforeStart()) { return 'countdown'; } if ($page->isExpired()) { return 'expired'; } return 'active'; } /** * @return Collection */ private function filterBlocksForPageState(PreregistrationPage $page, string $pageState): Collection { return $page->visibleBlocks() ->orderBy('sort_order') ->get() ->filter(function (PageBlock $block) use ($pageState): bool { return match ($pageState) { 'countdown' => in_array($block->type, ['hero', 'countdown', 'image'], true), 'expired' => in_array($block->type, ['hero', 'image', 'cta_banner'], true), default => true, }; }) ->values(); } }