middleware('auth:frontend')->except('verify'); $this->middleware('signed')->only('verify'); $this->middleware('throttle:6,1')->only('verify', 'resend'); } /** * Show the email verification notice. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Contracts\View\View */ public function show(Request $request): RedirectResponse|View { return $request->user('frontend')->hasVerifiedEmail() ? redirect($this->redirectPath()) : view('theme::auth.verify'); } /** * Mark the authenticated user's email address as verified. * * ! Overloaded trait * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException If request is invalid. */ public function verify(Request $request): JsonResponse|RedirectResponse { /** @var \App\Models\Customer */ $user = Customer::findOrFail($request->route('id')); if (!hash_equals((string) $request->route('id'), (string) $user->getKey())) { throw new AuthorizationException(); } if (!hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) { throw new AuthorizationException(); } if ($user->hasVerifiedEmail()) { return $request->wantsJson() ? new JsonResponse([], 204) : redirect($this->redirectPath()); } DB::transaction(function () use ($user) { if ($user->markEmailAsVerified()) { $this->setCrmCustomerAsVerified($user); event(new Verified($user)); } }); if ($response = $this->verified($request)) { return $response; } return $request->wantsJson() ? new JsonResponse([], 204) : redirect($this->redirectPath())->with('verified', true); } /** * The user has been verified. * * @param \Illuminate\Http\Request $request * @return mixed * @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass */ protected function verified(Request $request) { // phpcs:enable return redirect($this->redirectPath())->with('success', trans( 'front.messages.account_activated_can_play' )); } /** * Get the post register / login redirect path. * * @return string */ public function redirectPath(): string { return response()->redirectToRoute('fo.participate')->getTargetUrl(); } /** * Set Crm Customer active * * @param \App\Models\Customer $customer * @return void * @throws \Illuminate\Http\Exceptions\HttpResponseException In case of failure. */ private function setCrmCustomerAsVerified(Customer $customer): void { try { $customer->clearApiDataCache(); $crmCustomer = $customer->api_data; $crmCustomer->activate(); $customer->clearApiDataCache(); } catch (ValidationException) { redirect($this->redirectPath())->with('error', trans( 'front.messages.unexpected_error_try_later' ))->throwResponse(); } catch (CrmException | ApiErrorException $e) { if ($e->getApiError()->equals(ApiError::customerAlreadyActive)) { // * Ignore this and continue, as it may be activated via another CRM service. return; } else { report($e); redirect($this->redirectPath())->with('error', trans( 'front.messages.unexpected_error_try_later' ))->throwResponse(); } } } }