neuer checkout-pfad: /de/bestellen/paketID und /en/checkout/PackageID

This commit is contained in:
Codex Agent
2025-12-20 16:17:21 +01:00
parent 18297aa3f1
commit 6500b8df2c
18 changed files with 331 additions and 345 deletions

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Support\CheckoutRoutes;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\RedirectResponse;
@@ -23,6 +24,7 @@ class VerifyEmailController extends Controller
protected function redirectAfterVerification(EmailVerificationRequest $request): RedirectResponse
{
$redirectToCheckout = $request->session()->pull('checkout.verify_redirect');
$preferredLocale = $request->session()->get('preferred_locale');
if (! $redirectToCheckout && $request->user()->pending_purchase) {
$packageId = $request->session()->pull('checkout.pending_package_id');
@@ -35,7 +37,7 @@ class VerifyEmailController extends Controller
}
if ($packageId) {
$redirectToCheckout = route('checkout.show', ['package' => $packageId]);
$redirectToCheckout = CheckoutRoutes::wizardUrl($packageId, $preferredLocale);
}
}

View File

@@ -7,6 +7,7 @@ use App\Models\AbandonedCheckout;
use App\Models\Package;
use App\Models\Tenant;
use App\Models\User;
use App\Support\CheckoutRoutes;
use App\Support\Concerns\PresentsPackages;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -22,7 +23,7 @@ class CheckoutController extends Controller
{
use PresentsPackages;
public function show(Package $package)
public function show(string $locale, string $checkoutSlug, Package $package): \Inertia\Response
{
$googleStatus = session()->pull('checkout_google_status');
$googleError = session()->pull('checkout_google_error');
@@ -52,7 +53,7 @@ class CheckoutController extends Controller
]);
}
public function register(Request $request)
public function register(Request $request): \Illuminate\Http\JsonResponse
{
$validator = Validator::make($request->all(), [
'email' => 'required|email|max:255|unique:users,email',
@@ -143,7 +144,7 @@ class CheckoutController extends Controller
Auth::login($user);
$request->session()->put('checkout.pending_package_id', $package->id);
$redirectUrl = route('checkout.show', ['package' => $package->id]);
$redirectUrl = CheckoutRoutes::wizardUrl($package, $validated['locale'] ?? null);
$request->session()->put('checkout.verify_redirect', $redirectUrl);
$request->session()->put('url.intended', $redirectUrl);

View File

@@ -5,6 +5,8 @@ namespace App\Http\Controllers;
use App\Models\Package;
use App\Models\Tenant;
use App\Models\User;
use App\Support\CheckoutRoutes;
use App\Support\LocaleConfig;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
@@ -42,6 +44,7 @@ class CheckoutGoogleController extends Controller
{
$payload = $request->session()->get(self::SESSION_KEY, []);
$packageId = $payload['package_id'] ?? null;
$locale = $payload['locale'] ?? null;
try {
$googleUser = Socialite::driver('google')->user();
@@ -49,14 +52,14 @@ class CheckoutGoogleController extends Controller
Log::warning('Google checkout login failed', ['message' => $e->getMessage()]);
$this->flashError($request, __('checkout.google_error_fallback'));
return $this->redirectBackToWizard($packageId);
return $this->redirectBackToWizard($packageId, $locale);
}
$email = $googleUser->getEmail();
if (! $email) {
$this->flashError($request, __('checkout.google_missing_email'));
return $this->redirectBackToWizard($packageId);
return $this->redirectBackToWizard($packageId, $locale);
}
$raw = $googleUser->getRaw();
@@ -83,7 +86,7 @@ class CheckoutGoogleController extends Controller
$request->session()->put('checkout_google_status', 'prefill');
return $this->redirectBackToWizard($packageId);
return $this->redirectBackToWizard($packageId, $locale);
}
$user = DB::transaction(function () use ($existing, $googleUser, $email) {
@@ -114,7 +117,7 @@ class CheckoutGoogleController extends Controller
$this->ensurePackageAttached($user, (int) $packageId);
}
return $this->redirectBackToWizard($packageId);
return $this->redirectBackToWizard($packageId, $locale);
}
private function createTenantForUser(User $user, ?string $displayName, string $email): Tenant
@@ -188,19 +191,19 @@ class CheckoutGoogleController extends Controller
]);
}
private function redirectBackToWizard(?int $packageId): RedirectResponse
private function redirectBackToWizard(?int $packageId, ?string $locale = null): RedirectResponse
{
if ($packageId) {
return redirect()->route('purchase.wizard', ['package' => $packageId]);
return redirect()->to(CheckoutRoutes::wizardUrl($packageId, $locale));
}
$firstPackageId = Package::query()->orderBy('price')->value('id');
if ($firstPackageId) {
return redirect()->route('purchase.wizard', ['package' => $firstPackageId]);
return redirect()->to(CheckoutRoutes::wizardUrl($firstPackageId, $locale));
}
return redirect()->route('packages', [
'locale' => app()->getLocale(),
'locale' => LocaleConfig::canonicalize($locale ?? app()->getLocale()),
]);
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Support;
use App\Models\Package;
class CheckoutRoutes
{
public static function slugForLocale(?string $locale = null): string
{
$normalized = LocaleConfig::canonicalize($locale ?? app()->getLocale());
return $normalized === 'en' ? 'checkout' : 'bestellen';
}
public static function wizardUrl(Package|int $package, ?string $locale = null): string
{
$normalized = LocaleConfig::canonicalize($locale ?? app()->getLocale());
$slug = self::slugForLocale($normalized);
$packageId = $package instanceof Package ? $package->getKey() : $package;
return route('checkout.show', [
'locale' => $normalized,
'checkoutSlug' => $slug,
'package' => $packageId,
]);
}
}