Files
fotospiel-app/routes/web.php

337 lines
14 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\DashboardController;
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\ProfileAccountController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\ProfileDataExportController;
use App\Http\Controllers\Tenant\EventPhotoArchiveController;
use App\Http\Controllers\TenantAdminAuthController;
use App\Http\Controllers\TenantAdminGoogleController;
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('/imprint', [LegalPageController::class, 'show'])
->where('locale', 'en')
->defaults('slug', 'impressum')
->name('imprint');
Route::get('/datenschutz', [LegalPageController::class, 'show'])
->defaults('slug', 'datenschutz')
->name('datenschutz');
Route::get('/privacy', [LegalPageController::class, 'show'])
->where('locale', 'en')
->defaults('slug', 'datenschutz')
->name('privacy');
Route::get('/agb', [LegalPageController::class, 'show'])
->defaults('slug', 'agb')
->name('agb');
Route::get('/terms', [LegalPageController::class, 'show'])
->where('locale', 'en')
->defaults('slug', 'agb')
->name('terms');
Route::get('/buy/{packageId}', [MarketingController::class, 'buyPackages'])
->name('buy.packages')
->defaults('locale', config('app.locale', 'de'));
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'index'])
->name('marketing.profile.index');
});
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('/marketing/login', function (Request $request) use ($determinePreferredLocale) {
$locale = $determinePreferredLocale($request);
$destination = "/{$locale}/login";
$query = $request->getQueryString();
return redirect($query ? "{$destination}?{$query}" : $destination, 302);
})->name('marketing.login');
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', DashboardController::class)
->middleware(['auth'])
->name('dashboard');
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'index'])
->name('profile.index');
Route::post('/profile/data-exports', [ProfileDataExportController::class, 'store'])
->name('profile.data-exports.store');
Route::get('/profile/data-exports/{export}', [ProfileDataExportController::class, 'download'])
->name('profile.data-exports.download');
Route::delete('/profile/account', [ProfileAccountController::class, 'destroy'])
->name('profile.account.destroy');
});
Route::prefix('event-admin')->group(function () {
$renderAdmin = fn () => view('admin');
$authAdmin = TenantAdminAuthController::class;
// Public routes (auth check inside controller)
Route::get('/auth/callback', $renderAdmin)->name('tenant.admin.auth.callback');
Route::get('/login', $renderAdmin)->name('tenant.admin.login');
Route::get('/auth/google', [TenantAdminGoogleController::class, 'redirect'])
->name('tenant.admin.google.redirect');
Route::get('/auth/google/callback', [TenantAdminGoogleController::class, 'callback'])
->name('tenant.admin.google.callback');
// Protected routes (auth check inside controller)
Route::get('/logout', $authAdmin)->name('tenant.admin.logout');
Route::get('/dashboard', $authAdmin)->name('tenant.admin.dashboard');
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::view('/share/{slug}', 'guest')
->where('slug', '[A-Za-z0-9]+')
->name('guest.share');
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');