name('home'); Route::get('/security', [MarketingController::class, 'security'])->name('marketing.security'); Route::get('/pricing', [MarketingController::class, 'pricing'])->name('marketing.pricing'); Route::get('/terms', [MarketingController::class, 'terms'])->name('marketing.terms'); Route::get('/privacy', [MarketingController::class, 'privacy'])->name('marketing.privacy'); Route::get('/dpa', [MarketingController::class, 'dpa'])->name('marketing.dpa'); // Available to guests and authenticated users alike. Route::get('language/{locale}', LanguageController::class)->name('language.switch'); // Public certificate authenticity check. No auth — anyone with a // certificate number and the holder's last name can confirm it's valid. Route::get('verify', [VerifyController::class, 'show'])->name('verify.show'); Route::post('verify', [VerifyController::class, 'check'])->middleware('throttle:10,1')->name('verify.check'); // Moneybird calls this to report invoice/payment events. No auth — verified // by comparing the webhook's shared token instead (see the controller). Route::post('webhooks/moneybird', MoneybirdWebhookController::class)->name('webhooks.moneybird'); Route::middleware(['auth', 'verified'])->group(function () { Route::livewire('dashboard', 'pages::dashboard')->name('dashboard'); Route::livewire('certificates', 'pages::certificates.index')->name('certificates.index'); Route::livewire('certificates/create', 'pages::certificates.create')->name('certificates.create'); Route::livewire('certificates/{certificate}', 'pages::certificates.show')->name('certificates.show'); Route::livewire('certificates/{certificate}/edit', 'pages::certificates.edit')->name('certificates.edit'); Route::get('certificates/{certificate}/download', CertificateDownloadController::class)->name('certificates.download'); Route::get('certificates/{certificate}/preview', CertificatePreviewController::class)->name('certificates.preview'); Route::livewire('categories', 'pages::categories.index')->name('categories.index'); Route::livewire('shares', 'pages::shares.index')->name('shares.index'); }); // External recipients: authorized by the unguessable share token (and the // optional share password), not by login. Route::prefix('shared/{share:token}')->name('shared.')->scopeBindings()->group(function () { Route::get('/', [SharePageController::class, 'show'])->name('show'); Route::post('unlock', [SharePageController::class, 'unlock'])->middleware('throttle:10,1')->name('unlock'); Route::get('zip', [SharePageController::class, 'zip'])->name('zip'); Route::get('certificates/{certificate}', [SharePageController::class, 'download'])->name('certificate'); }); require __DIR__.'/settings.php';