PXG_2026_API/routes/api.php

77 lines
4.1 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\EventController;
use App\Http\Controllers\Api\V1\RegistrationController;
use App\Http\Controllers\Api\V1\GroupController;
use App\Http\Controllers\Api\V1\PaymentController;
use App\Http\Controllers\Api\V1\PairingController;
use App\Http\Controllers\Api\V1\WebhookController;
use App\Http\Controllers\Api\V1\Admin\AuthController as AdminAuthController;
use App\Http\Controllers\Api\V1\Admin\DashboardController;
use App\Http\Controllers\Api\V1\Admin\RegistrationsController as AdminRegistrationsController;
use App\Http\Controllers\Api\V1\Admin\FlightsController as AdminFlightsController;
use App\Http\Controllers\Api\V1\Admin\PaymentsController as AdminPaymentsController;
use App\Http\Controllers\Api\V1\Admin\PairingAdminController;
use App\Http\Controllers\Api\V1\Admin\EventAdminController;
use App\Http\Controllers\Api\V1\Admin\ImportController;
Route::prefix('v1')->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');
});
});