184 lines
9.4 KiB
PHP
184 lines
9.4 KiB
PHP
<?php
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Route;
|
|
use Inertia\Inertia;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
Route::get('/lang/{locale}/{namespace}', function ($locale, $namespace) {
|
|
Log::info('Lang route hit', ['locale' => $locale, 'namespace' => $namespace]);
|
|
$path = public_path("lang/{$locale}/{$namespace}.json");
|
|
Log::info('Path checked', ['path' => $path, 'exists' => file_exists($path)]);
|
|
if (!file_exists($path)) {
|
|
abort(404);
|
|
}
|
|
$content = json_decode(file_get_contents($path), true);
|
|
Log::info('JSON loaded', ['keys' => array_keys($content ?? [])]);
|
|
return response()->json($content);
|
|
})->where(['locale' => 'de|en', 'namespace' => 'marketing|auth|common']);
|
|
|
|
Route::prefix('{locale?}')->where(['locale' => 'de|en'])->middleware('locale')->group(function () {
|
|
Route::get('/', [\App\Http\Controllers\MarketingController::class, 'index'])->name('marketing');
|
|
Route::get('/packages', [\App\Http\Controllers\MarketingController::class, 'packagesIndex'])->name('packages');
|
|
Route::get('/packages/{id}', function ($id) {
|
|
return redirect("/packages?package_id={$id}");
|
|
})->where('id', '\d+')->name('packages.detail');
|
|
Route::get('/login', [\App\Http\Controllers\Auth\AuthenticatedSessionController::class, 'create'])->name('login');
|
|
Route::post('/login', [\App\Http\Controllers\Auth\AuthenticatedSessionController::class, 'store'])->name('login.store');
|
|
Route::get('/register', [\App\Http\Controllers\Auth\MarketingRegisterController::class, 'create'])->name('register');
|
|
Route::post('/register', [\App\Http\Controllers\Auth\MarketingRegisterController::class, 'store'])->middleware('throttle:6,1')->name('register.store');
|
|
Route::post('/logout', [\App\Http\Controllers\Auth\AuthenticatedSessionController::class, 'destroy'])->name('logout');
|
|
});
|
|
|
|
// Fallback for /login (redirect to default locale)
|
|
Route::get('/login', function () {
|
|
return redirect('/de/login');
|
|
})->name('login.fallback');
|
|
|
|
// Fallback for /register (redirect to default locale)
|
|
Route::get('/register', function (Request $request) {
|
|
return redirect('/de/register' . $request->getQueryString());
|
|
})->name('register.fallback');
|
|
|
|
// Fallback for /logout (redirect to default locale)
|
|
Route::post('/logout', function () {
|
|
return redirect('/de/logout');
|
|
})->name('logout.fallback');
|
|
|
|
// Fallback for /packages (redirect to default locale)
|
|
Route::get('/packages', function () {
|
|
return redirect('/de/packages');
|
|
})->name('packages.fallback');
|
|
|
|
// Fallback for /blog (redirect to default locale)
|
|
Route::get('/blog', function () {
|
|
return redirect('/de/blog');
|
|
})->name('blog.fallback');
|
|
|
|
// Blog Routes (inside locale group for i18n support)
|
|
Route::prefix('{locale?}')->where(['locale' => 'de|en'])->middleware('locale')->group(function () {
|
|
Route::get('/blog', [\App\Http\Controllers\MarketingController::class, 'blogIndex'])->name('blog');
|
|
Route::get('/blog/{post}', [\App\Http\Controllers\MarketingController::class, 'blogShow'])->name('blog.show');
|
|
});
|
|
|
|
// Fallbacks for Legal Pages (redirect to default locale)
|
|
Route::get('/impressum', function () {
|
|
return redirect('/de/impressum');
|
|
})->name('impressum.fallback');
|
|
Route::get('/datenschutz', function () {
|
|
return redirect('/de/datenschutz');
|
|
})->name('datenschutz.fallback');
|
|
Route::get('/kontakt', function () {
|
|
return redirect('/de/kontakt');
|
|
})->name('kontakt.fallback');
|
|
|
|
// Legal Pages in locale group
|
|
Route::prefix('{locale?}')->where(['locale' => 'de|en'])->middleware('locale')->group(function () {
|
|
Route::get('/impressum', function () {
|
|
return view('legal.impressum');
|
|
})->name('impressum');
|
|
Route::get('/datenschutz', function () {
|
|
return view('legal.datenschutz');
|
|
})->name('datenschutz');
|
|
Route::get('/kontakt', [\App\Http\Controllers\MarketingController::class, 'contactView'])->name('kontakt');
|
|
Route::post('/kontakt', [\App\Http\Controllers\MarketingController::class, 'contact'])->name('kontakt.submit');
|
|
});
|
|
|
|
Route::middleware(['auth', 'verified'])->group(function () {
|
|
Route::get('dashboard', function () {
|
|
return Inertia::render('dashboard');
|
|
})->name('dashboard');
|
|
});
|
|
|
|
require __DIR__.'/settings.php';
|
|
// Auth-Routes sind nun in web.php integriert, auth.php nur für andere Auth-Funktionen
|
|
require __DIR__.'/auth.php';
|
|
|
|
// Guest PWA shell for /event and sub-routes
|
|
Route::view('/event/{any?}', 'guest')->where('any', '.*');
|
|
Route::view('/e/{any?}', 'guest')->where('any', '.*');
|
|
Route::view('/pwa/{any?}', 'guest')->where('any', '.*');
|
|
|
|
// Minimal public API for Guest PWA (stateless; no CSRF)
|
|
Route::prefix('api/v1')->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class])->group(function () {
|
|
});
|
|
|
|
// Stripe webhooks (no CSRF, no auth)
|
|
Route::post('/webhooks/stripe', [\App\Http\Controllers\StripeWebhookController::class, 'handle']);
|
|
// PayPal IPN webhook
|
|
Route::post('/webhooks/paypal', [\App\Http\Controllers\PayPalWebhookController::class, 'handle']);
|
|
// PayPal IPN webhook
|
|
Route::post('/webhooks/paypal', [\App\Http\Controllers\PayPalWebhookController::class, 'handle']);
|
|
|
|
|
|
// CSV templates for Super Admin imports
|
|
Route::get('/super-admin/templates/emotions.csv', function () {
|
|
$headers = [
|
|
'Content-Type' => 'text/csv',
|
|
'Content-Disposition' => 'attachment; filename="emotions_template.csv"',
|
|
];
|
|
$callback = function () {
|
|
$out = fopen('php://output', 'w');
|
|
fputcsv($out, ['name_de','name_en','icon','color','description_de','description_en','sort_order','is_active','event_types']);
|
|
fputcsv($out, ['Fröhlich','Happy','😀','#FFD700','Fröhlicher Moment','Happy moment','0','1','wedding|corporate']);
|
|
fclose($out);
|
|
};
|
|
return response()->stream($callback, 200, $headers);
|
|
});
|
|
|
|
// Tenant Admin PWA shell
|
|
Route::view('/admin/{any?}', 'admin')->middleware(['auth', 'verified', 'tenant'])->where('any', '.*');
|
|
Route::get('/admin/qr', [\App\Http\Controllers\Admin\QrController::class, 'png'])->middleware(['auth', 'verified', 'tenant']);
|
|
Route::get('/super-admin/templates/tasks.csv', function () {
|
|
$headers = [
|
|
'Content-Type' => 'text/csv',
|
|
'Content-Disposition' => 'attachment; filename="tasks_template.csv"',
|
|
];
|
|
$callback = function () {
|
|
$out = fopen('php://output', 'w');
|
|
fputcsv($out, ['emotion_name','emotion_name_de','emotion_name_en','event_type_slug','title_de','title_en','description_de','description_en','difficulty','example_text_de','example_text_en','sort_order','is_active']);
|
|
fputcsv($out, ['Happy','','','wedding','Gruppenfoto','Group photo','Sammelt euch für ein Foto.','Get together for a photo.','easy','Zeigt eure besten Lächeln.','Show your best smiles.','0','1']);
|
|
fclose($out);
|
|
};
|
|
return response()->stream($callback, 200, $headers);
|
|
});
|
|
|
|
Route::get('/purchase-wizard/{package_id}', function ($package_id) {
|
|
return redirect("/de/purchase-wizard/{$package_id}");
|
|
})->name('purchase.wizard.fallback');
|
|
|
|
Route::prefix('{locale?}')->where(['locale' => 'de|en'])->middleware('locale')->group(function () {
|
|
Route::get('/purchase-wizard/{package_id}', [\App\Http\Controllers\MarketingController::class, 'purchaseWizard'])->middleware(\App\Http\Middleware\StripeCSP::class)->name('purchase.wizard');
|
|
Route::get('/buy-packages/{package_id}', [\App\Http\Controllers\MarketingController::class, 'buyPackages'])->name('buy.packages');
|
|
});
|
|
Route::middleware('auth')->group(function () {
|
|
Route::get('/profile', [\App\Http\Controllers\ProfileController::class, 'index'])->name('profile');
|
|
Route::get('/profile/account', [\App\Http\Controllers\ProfileController::class, 'account'])->name('profile.account');
|
|
Route::patch('/profile/account', [\App\Http\Controllers\ProfileController::class, 'account'])->name('profile.account.update');
|
|
Route::get('/profile/orders', [\App\Http\Controllers\ProfileController::class, 'orders'])->name('profile.orders');
|
|
});
|
|
|
|
Route::get('/marketing/success/{package_id?}', [\App\Http\Controllers\MarketingController::class, 'success'])->name('marketing.success');
|
|
|
|
Route::prefix('{locale?}')->where(['locale' => 'de|en'])->middleware('locale')->group(function () {
|
|
Route::get('/anlaesse/{type}', [\App\Http\Controllers\MarketingController::class, 'occasionsType'])
|
|
->where([
|
|
'type' => 'hochzeit|geburtstag|firmenevent'
|
|
])
|
|
->name('anlaesse.type');
|
|
});
|
|
|
|
|
|
Route::prefix('purchase')->group(function () {
|
|
Route::post('/auth/login', [\App\Http\Controllers\PurchaseWizardController::class, 'login'])->name('purchase.auth.login');
|
|
Route::post('/auth/register', [\App\Http\Controllers\PurchaseWizardController::class, 'register'])->name('purchase.auth.register');
|
|
});
|
|
|
|
Route::middleware(['auth', 'verified'])->prefix('purchase')->group(function () {
|
|
Route::post('/stripe/intent', [\App\Http\Controllers\PurchaseWizardController::class, 'createStripeIntent'])->name('purchase.stripe.intent');
|
|
Route::post('/stripe/complete', [\App\Http\Controllers\PurchaseWizardController::class, 'completeStripe'])->name('purchase.stripe.complete');
|
|
Route::post('/paypal/order', [\App\Http\Controllers\PurchaseWizardController::class, 'createPaypalOrder'])->name('purchase.paypal.order');
|
|
Route::post('/paypal/capture', [\App\Http\Controllers\PurchaseWizardController::class, 'capturePaypalOrder'])->name('purchase.paypal.capture');
|
|
Route::post('/free', [\App\Http\Controllers\PurchaseWizardController::class, 'assignFreePackage'])->name('purchase.free');
|
|
});
|