group(function () { Route::get('/events/{event}', [EventController::class, 'show']); Route::post('/events/{event}/registrations', [RegistrationController::class, 'store']); Route::post('/events/{event}/groups', [GroupController::class, 'store']); Route::get('/groups/{code}', [GroupController::class, 'show']); Route::post('/groups/{code}/join', [GroupController::class, 'join']); Route::post('/registrations/{registration}/pay', [PaymentController::class, 'pay']); Route::post('/pairing/lookup', [PairingController::class, 'lookup']); Route::post('/pairing/otp/request', [PairingController::class, 'requestOtp']); Route::post('/pairing/otp/verify', [PairingController::class, 'verifyOtp']); Route::get('/pairing/me', [PairingController::class, 'me']); Route::post('/webhooks/xendit', [WebhookController::class, 'xendit']); // Admin (Sanctum) Route::post('/admin/login', [AdminAuthController::class, 'login']); Route::middleware('auth:sanctum')->group(function () { Route::post('/admin/logout', [AdminAuthController::class, 'logout']); Route::get('/admin/events/{event}/dashboard', [DashboardController::class, 'show']); Route::get('/admin/events/{event}/registrations', [AdminRegistrationsController::class, 'index']); Route::patch('/admin/registrations/{registration}', [AdminRegistrationsController::class, 'update']); Route::get('/admin/events/{event}/flights', [AdminFlightsController::class, 'index']); Route::get('/admin/events/{event}/payments', [AdminPaymentsController::class, 'index']); // Flight member ops Route::get('/admin/flights/{flight}', [AdminFlightsController::class, 'show']); Route::post('/admin/flights/{flight}/assign', [AdminFlightsController::class, 'assign']); Route::post('/admin/flight-members/{flightMember}/move', [AdminFlightsController::class, 'moveMember']); Route::delete('/admin/flight-members/{flightMember}', [AdminFlightsController::class, 'removeMember']); Route::post('/admin/flights/{flight}/lock', [AdminFlightsController::class, 'lock']); Route::post('/admin/flights/{flight}/unlock', [AdminFlightsController::class, 'unlock']); // Exports (CSV - Excel friendly) Route::get('/admin/events/{event}/exports/start-sheet.csv', [DashboardController::class, 'exportStartSheet']); Route::get('/admin/events/{event}/exports/pairing-list.csv', [DashboardController::class, 'exportPairingList']); Route::post('/admin/events/{event}/pairing/run', [PairingAdminController::class, 'run']); // Finalize/Publish (owner only) Route::post('/admin/events/{event}/pairing/finalize', [EventAdminController::class, 'finalize'])->middleware('role:owner'); Route::post('/admin/events/{event}/pairing/unfinalize', [EventAdminController::class, 'unfinalize'])->middleware('role:owner'); Route::post('/admin/events/{event}/pairing/publish', [EventAdminController::class, 'publish'])->middleware('role:owner'); // Bulk import (committee+owner) Route::post('/admin/events/{event}/registrations/import', [ImportController::class, 'importRegistrations'])->middleware('role:owner,committee'); }); });