284 lines
11 KiB
PHP
284 lines
11 KiB
PHP
<?php
|
|
|
|
use App\Http\Controllers\Auth\AuthenticatedSessionController;
|
|
use App\Http\Controllers\Auth\RegisteredUserController;
|
|
use App\Http\Controllers\CheckoutController;
|
|
use App\Http\Controllers\CheckoutGoogleController;
|
|
use App\Http\Controllers\LegalPageController;
|
|
use App\Http\Controllers\LocaleController;
|
|
use App\Http\Controllers\MarketingController;
|
|
use App\Http\Controllers\PaddleCheckoutController;
|
|
use App\Http\Controllers\PaddleWebhookController;
|
|
use App\Http\Controllers\Tenant\EventPhotoArchiveController;
|
|
use App\Models\Package;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Route;
|
|
use Inertia\Inertia;
|
|
|
|
require __DIR__.'/auth.php';
|
|
require __DIR__.'/settings.php';
|
|
|
|
$configuredLocales = array_filter(array_map(
|
|
static fn ($value) => trim((string) $value),
|
|
explode(',', (string) env('APP_SUPPORTED_LOCALES', ''))
|
|
));
|
|
|
|
if (empty($configuredLocales)) {
|
|
$configuredLocales = array_filter([
|
|
config('app.locale'),
|
|
config('app.fallback_locale'),
|
|
]);
|
|
}
|
|
|
|
$supportedLocales = array_values(array_unique($configuredLocales ?: ['de', 'en']));
|
|
$localePattern = implode('|', $supportedLocales);
|
|
|
|
$rewritePath = static function (string $path, string $locale): string {
|
|
$normalized = '/'.ltrim($path, '/');
|
|
if ($normalized === '//') {
|
|
$normalized = '/';
|
|
}
|
|
|
|
$map = [
|
|
'/kontakt' => ['en' => '/contact'],
|
|
'/contact' => ['de' => '/kontakt'],
|
|
'/so-funktionierts' => ['en' => '/how-it-works'],
|
|
'/how-it-works' => ['de' => '/so-funktionierts'],
|
|
'/anlaesse' => ['en' => '/occasions'],
|
|
'/anlaesse/hochzeit' => ['en' => '/occasions/wedding'],
|
|
'/anlaesse/geburtstag' => ['en' => '/occasions/birthday'],
|
|
'/anlaesse/firmenevent' => ['en' => '/occasions/corporate-event'],
|
|
'/anlaesse/konfirmation' => ['en' => '/occasions/confirmation'],
|
|
'/occasions/wedding' => ['de' => '/anlaesse/hochzeit'],
|
|
'/occasions/birthday' => ['de' => '/anlaesse/geburtstag'],
|
|
'/occasions/corporate-event' => ['de' => '/anlaesse/firmenevent'],
|
|
'/occasions/confirmation' => ['de' => '/anlaesse/konfirmation'],
|
|
];
|
|
|
|
$rewrites = $map[$normalized] ?? [];
|
|
|
|
return $rewrites[$locale] ?? $normalized;
|
|
};
|
|
|
|
$determinePreferredLocale = static function (Request $request) use ($supportedLocales): string {
|
|
$sessionLocale = $request->session()->get('preferred_locale');
|
|
if ($sessionLocale && in_array($sessionLocale, $supportedLocales, true)) {
|
|
return $sessionLocale;
|
|
}
|
|
|
|
$headerLocale = $request->getPreferredLanguage($supportedLocales);
|
|
if ($headerLocale && in_array($headerLocale, $supportedLocales, true)) {
|
|
return $headerLocale;
|
|
}
|
|
|
|
return $supportedLocales[0] ?? 'de';
|
|
};
|
|
|
|
Route::prefix('{locale}')
|
|
->where(['locale' => $localePattern])
|
|
->middleware([
|
|
\App\Http\Middleware\SetLocaleFromRequest::class,
|
|
])
|
|
->group(function () {
|
|
Route::get('/', [MarketingController::class, 'index'])->name('marketing.home');
|
|
|
|
Route::middleware('guest')->group(function () {
|
|
Route::get('/login', [AuthenticatedSessionController::class, 'create']);
|
|
Route::post('/login', [AuthenticatedSessionController::class, 'store']);
|
|
Route::get('/register', [RegisteredUserController::class, 'create']);
|
|
Route::post('/register', [RegisteredUserController::class, 'store']);
|
|
});
|
|
|
|
Route::get('/contact', [MarketingController::class, 'contactView'])
|
|
->name('marketing.contact');
|
|
Route::post('/contact', [MarketingController::class, 'contact'])
|
|
->name('marketing.contact.submit');
|
|
|
|
Route::get('/kontakt', [MarketingController::class, 'contactView'])
|
|
->name('kontakt');
|
|
Route::post('/kontakt', [MarketingController::class, 'contact'])
|
|
->name('kontakt.submit');
|
|
|
|
Route::get('/blog', [MarketingController::class, 'blogIndex'])->name('blog');
|
|
Route::get('/blog/{slug}', [MarketingController::class, 'blogShow'])->name('blog.show');
|
|
|
|
Route::get('/packages', [MarketingController::class, 'packagesIndex'])->name('packages');
|
|
|
|
Route::get('/anlaesse/{type}', [MarketingController::class, 'occasionsType'])->name('anlaesse.type');
|
|
Route::get('/occasions/{type}', [MarketingController::class, 'occasionsType'])
|
|
->name('occasions.type');
|
|
|
|
Route::get('/so-funktionierts', [MarketingController::class, 'howItWorks'])
|
|
->where('locale', 'de');
|
|
Route::get('/how-it-works', [MarketingController::class, 'howItWorks'])
|
|
->where('locale', 'en')
|
|
->name('marketing.how-it-works');
|
|
|
|
Route::get('/demo', [MarketingController::class, 'demo'])->name('demo');
|
|
Route::get('/success/{packageId?}', [MarketingController::class, 'success'])->name('marketing.success');
|
|
|
|
Route::get('/impressum', [LegalPageController::class, 'show'])
|
|
->defaults('slug', 'impressum')
|
|
->name('impressum');
|
|
Route::get('/datenschutz', [LegalPageController::class, 'show'])
|
|
->defaults('slug', 'datenschutz')
|
|
->name('datenschutz');
|
|
Route::get('/agb', [LegalPageController::class, 'show'])
|
|
->defaults('slug', 'agb')
|
|
->name('agb');
|
|
|
|
Route::get('/buy/{packageId}', [MarketingController::class, 'buyPackages'])
|
|
->name('buy.packages')
|
|
->defaults('locale', config('app.locale', 'de'));
|
|
|
|
Route::fallback(function () {
|
|
return Inertia::render('marketing/NotFound', [
|
|
'requestedPath' => request()->path(),
|
|
])->toResponse(request())->setStatusCode(404);
|
|
});
|
|
});
|
|
|
|
Route::get('/', function (Request $request) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
|
|
return redirect("/{$locale}", 302);
|
|
})->name('home');
|
|
|
|
Route::get('/contact', function (Request $request) use ($determinePreferredLocale, $rewritePath) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = $rewritePath('/contact', $locale);
|
|
|
|
return redirect("/{$locale}".($path === '/' ? '' : $path), 301);
|
|
});
|
|
|
|
Route::get('/kontakt', function (Request $request) use ($determinePreferredLocale, $rewritePath) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = $rewritePath('/kontakt', $locale);
|
|
|
|
return redirect("/{$locale}".($path === '/' ? '' : $path), 301);
|
|
});
|
|
|
|
Route::get('/so-funktionierts', function (Request $request) use ($determinePreferredLocale, $rewritePath) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = $rewritePath('/so-funktionierts', $locale);
|
|
|
|
return redirect("/{$locale}{$path}", 301);
|
|
});
|
|
|
|
Route::get('/how-it-works', function (Request $request) use ($determinePreferredLocale, $rewritePath) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = $rewritePath('/how-it-works', $locale);
|
|
|
|
return redirect("/{$locale}{$path}", 301);
|
|
});
|
|
|
|
Route::get('/blog', function (Request $request) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
|
|
return redirect("/{$locale}/blog", 301);
|
|
});
|
|
|
|
Route::get('/blog/{slug}', function (Request $request, string $slug) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
|
|
return redirect("/{$locale}/blog/{$slug}", 301);
|
|
});
|
|
|
|
Route::get('/packages', function (Request $request) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
|
|
return redirect("/{$locale}/packages", 301);
|
|
});
|
|
|
|
Route::get('/anlaesse/{type}', function (Request $request, string $type) use ($determinePreferredLocale, $rewritePath) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = $rewritePath("/anlaesse/{$type}", $locale);
|
|
|
|
return redirect("/{$locale}{$path}", 301);
|
|
});
|
|
|
|
Route::get('/occasions/{type}', function (Request $request, string $type) use ($determinePreferredLocale, $rewritePath) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = $rewritePath("/occasions/{$type}", $locale);
|
|
|
|
return redirect("/{$locale}{$path}", 301);
|
|
});
|
|
|
|
Route::get('/demo', function (Request $request) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
|
|
return redirect("/{$locale}/demo", 301);
|
|
});
|
|
|
|
Route::get('/success/{packageId?}', function (Request $request, ?int $packageId = null) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
$path = "/{$locale}/success";
|
|
|
|
if ($packageId !== null) {
|
|
$path .= "/{$packageId}";
|
|
}
|
|
|
|
return redirect($path, 301);
|
|
});
|
|
|
|
Route::get('/buy/{packageId}', function (Request $request, int $packageId) use ($determinePreferredLocale) {
|
|
$locale = $determinePreferredLocale($request);
|
|
|
|
return redirect("/{$locale}/buy/{$packageId}", 301);
|
|
});
|
|
|
|
Route::get('/dashboard', function () {
|
|
return Inertia::render('dashboard');
|
|
})->middleware(['auth', 'verified'])->name('dashboard');
|
|
Route::prefix('event-admin')->group(function () {
|
|
$renderAdmin = fn () => view('admin');
|
|
|
|
Route::get('/auth/callback', $renderAdmin)->name('tenant.admin.auth.callback');
|
|
Route::get('/login', $renderAdmin)->name('tenant.admin.login');
|
|
Route::get('/logout', $renderAdmin)->name('tenant.admin.logout');
|
|
Route::get('/{view?}', $renderAdmin)
|
|
->where('view', '.*')
|
|
->name('tenant.admin.app');
|
|
});
|
|
Route::view('/event', 'guest')->name('guest.pwa.landing');
|
|
Route::view('/g/{token}', 'guest')->where('token', '.*')->name('guest.gallery');
|
|
Route::view('/e/{token}/{path?}', 'guest')
|
|
->where('token', '.*')
|
|
->where('path', '.*')
|
|
->name('guest.event');
|
|
Route::middleware('auth')->group(function () {
|
|
Route::get('/tenant/events/{event}/photos/archive', EventPhotoArchiveController::class)
|
|
->name('tenant.events.photos.archive');
|
|
});
|
|
|
|
if (config('checkout.enabled')) {
|
|
Route::get('/purchase-wizard/{package}', [CheckoutController::class, 'show'])->name('purchase.wizard');
|
|
Route::get('/checkout/{package}', [CheckoutController::class, 'show'])->name('checkout.show');
|
|
} else {
|
|
Route::get('/purchase-wizard/{package}', function (Package $package) {
|
|
return redirect()->route('packages', [
|
|
'locale' => app()->getLocale(),
|
|
'highlight' => $package->slug,
|
|
]);
|
|
})->name('purchase.wizard');
|
|
|
|
Route::get('/checkout/{package}', function (Package $package) {
|
|
return redirect()->route('packages', [
|
|
'locale' => app()->getLocale(),
|
|
'highlight' => $package->slug,
|
|
]);
|
|
})->name('checkout.show');
|
|
}
|
|
Route::post('/checkout/login', [CheckoutController::class, 'login'])->name('checkout.login');
|
|
Route::post('/checkout/register', [CheckoutController::class, 'register'])->name('checkout.register');
|
|
Route::get('/checkout/auth/google', [CheckoutGoogleController::class, 'redirect'])->name('checkout.google.redirect');
|
|
Route::get('/checkout/auth/google/callback', [CheckoutGoogleController::class, 'callback'])->name('checkout.google.callback');
|
|
Route::post('/checkout/track-abandoned', [CheckoutController::class, 'trackAbandonedCheckout'])->name('checkout.track-abandoned');
|
|
Route::post('/set-locale', [LocaleController::class, 'set'])->name('set-locale');
|
|
|
|
Route::middleware('auth')->group(function () {
|
|
Route::post('/paddle/create-checkout', [PaddleCheckoutController::class, 'create'])->name('paddle.checkout.create');
|
|
});
|
|
|
|
Route::post('/paddle/webhook', [PaddleWebhookController::class, 'handle'])->name('paddle.webhook');
|