Files
eCert-MBIP/src/routes/web.php
2026-05-20 10:20:59 +08:00

136 lines
9.2 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\ProgramController;
use App\Http\Controllers\Admin\QrCodeController;
use App\Http\Controllers\Admin\ParticipantController;
use App\Http\Controllers\Admin\CertificateTemplateController;
use App\Http\Controllers\Admin\ProgramQuestionnaireController;
use App\Http\Controllers\Admin\StatisticsController;
use App\Http\Controllers\Admin\QuestionnaireSetController;
use App\Http\Controllers\Admin\QuestionController;
use App\Http\Controllers\Admin\CertificateController as AdminCertificateController;
use App\Http\Controllers\Admin\ProfileController;
use App\Http\Controllers\Public\CheckinController;
use App\Http\Controllers\Public\QuestionnaireController;
use App\Http\Controllers\Public\AttendanceCheckController;
use App\Http\Controllers\Public\CertificateController;
// ──────────────────────────────────────────────
// Root redirect
// ──────────────────────────────────────────────
Route::get('/', fn() => redirect()->route('admin.dashboard'));
// ──────────────────────────────────────────────
// Admin Routes
// ──────────────────────────────────────────────
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
// Profile
Route::get('/profile', [ProfileController::class, 'show'])->name('profile.show');
Route::put('/profile/email', [ProfileController::class, 'updateEmail'])->name('profile.update-email');
Route::put('/profile/password', [ProfileController::class, 'updatePassword'])->name('profile.update-password');
// Programs
Route::resource('programs', ProgramController::class)->parameters(['programs' => 'program:uuid']);
Route::post('/programs/{program:uuid}/publish', [ProgramController::class, 'publish'])->name('programs.publish');
Route::post('/programs/{program:uuid}/close', [ProgramController::class, 'close'])->name('programs.close');
// QR Code
Route::prefix('programs/{program:uuid}/qr')->name('programs.qr.')->group(function () {
Route::get('/', [QrCodeController::class, 'show'])->name('show');
Route::post('/generate', [QrCodeController::class, 'generate'])->name('generate');
Route::get('/download', [QrCodeController::class, 'download'])->name('download');
Route::post('/deactivate',[QrCodeController::class, 'deactivate'])->name('deactivate');
});
// Participants
Route::prefix('programs/{program:uuid}/participants')->name('programs.participants.')->group(function () {
Route::get('/', [ParticipantController::class, 'index'])->name('index');
Route::get('/create', [ParticipantController::class, 'create'])->name('create');
Route::post('/', [ParticipantController::class, 'store'])->name('store');
Route::delete('/{pp}', [ParticipantController::class, 'destroy'])->name('destroy');
Route::get('/import', [ParticipantController::class, 'importForm'])->name('import.form');
Route::post('/import', [ParticipantController::class, 'import'])->name('import');
Route::get('/export', [ParticipantController::class, 'export'])->name('export');
});
// Certificate Template
Route::prefix('programs/{program:uuid}/template')->name('programs.template.')->group(function () {
Route::get('/', [CertificateTemplateController::class, 'show'])->name('show');
Route::post('/', [CertificateTemplateController::class, 'store'])->name('store');
Route::put('/config', [CertificateTemplateController::class, 'updateConfig'])->name('config');
Route::delete('/', [CertificateTemplateController::class, 'destroy'])->name('destroy');
Route::get('/preview', [CertificateTemplateController::class, 'preview'])->name('preview');
Route::post('/test', [CertificateTemplateController::class, 'testGenerate'])->name('test');
});
// Program Questionnaire
Route::prefix('programs/{program:uuid}/questionnaire')->name('programs.questionnaire.')->group(function () {
Route::get('/', [ProgramQuestionnaireController::class, 'show'])->name('show');
Route::get('/preview', [ProgramQuestionnaireController::class, 'preview'])->name('preview');
Route::post('/attach', [ProgramQuestionnaireController::class, 'attach'])->name('attach');
Route::post('/confirm', [ProgramQuestionnaireController::class, 'confirm'])->name('confirm');
Route::delete('/detach', [ProgramQuestionnaireController::class, 'detach'])->name('detach');
});
// Program Statistics
Route::prefix('programs/{program:uuid}/statistics')->name('programs.statistics.')->group(function () {
Route::get('/', [StatisticsController::class, 'show'])->name('show');
Route::get('/export', [StatisticsController::class, 'export'])->name('export');
});
// Certificates (Admin)
Route::prefix('programs/{program:uuid}/certificates')->name('programs.certificates.')->group(function () {
Route::get('/', [AdminCertificateController::class, 'index'])->name('index');
Route::post('/generate-all', [AdminCertificateController::class, 'generateAll'])->name('generate-all');
Route::post('/email-all', [AdminCertificateController::class, 'emailAll'])->name('email-all');
Route::get('/{certificate}/download', [AdminCertificateController::class, 'download'])->name('download');
});
// User Management (Super Admin only)
Route::middleware('super_admin')->group(function () {
Route::resource('users', UserController::class)->except(['show']);
});
// Questionnaire Sets
Route::resource('questionnaires', QuestionnaireSetController::class)->except(['show'])->parameters(['questionnaires' => 'set']);
Route::post('/questionnaires/{set}/publish', [QuestionnaireSetController::class, 'publish'])->name('questionnaires.publish');
Route::post('/questionnaires/{set}/archive', [QuestionnaireSetController::class, 'archive'])->name('questionnaires.archive');
Route::get('/questionnaires/{set}', [QuestionnaireSetController::class, 'show'])->name('questionnaires.show');
// Questions
Route::post('/questionnaires/{set}/questions', [QuestionController::class, 'store'])->name('questions.store');
Route::put('/questions/{question}', [QuestionController::class, 'update'])->name('questions.update');
Route::delete('/questions/{question}', [QuestionController::class, 'destroy'])->name('questions.destroy');
Route::post('/questions/reorder', [QuestionController::class, 'reorder'])->name('questions.reorder');
});
// ──────────────────────────────────────────────
// Public Routes (QR Check-in Flow)
// ──────────────────────────────────────────────
Route::middleware('throttle:checkin')->prefix('p')->name('public.')->group(function () {
Route::get('/{qr_token}', [CheckinController::class, 'show'])->name('checkin.show');
Route::post('/{qr_token}/staff', [CheckinController::class, 'staffCheckin'])->name('checkin.staff');
Route::post('/{qr_token}/external', [CheckinController::class, 'externalRegister'])->name('checkin.external');
Route::get('/{qr_token}/semak', [AttendanceCheckController::class, 'show'])->name('semak.show');
Route::post('/{qr_token}/semak', [AttendanceCheckController::class, 'check'])->name('semak.check');
Route::post('/{qr_token}/semak/email', [AttendanceCheckController::class, 'updateEmail'])->name('semak.update-email');
Route::get('/{qr_token}/questionnaire/{participant_uuid}', [QuestionnaireController::class, 'show'])->name('questionnaire.show');
Route::post('/{qr_token}/questionnaire/{participant_uuid}', [QuestionnaireController::class, 'submit'])->name('questionnaire.submit');
});
// ──────────────────────────────────────────────
// Public Certificate Download
// ──────────────────────────────────────────────
Route::middleware('throttle:certificate')->prefix('certificate')->name('public.certificate.')->group(function () {
Route::get('/{cert_token}', [CertificateController::class, 'show'])->name('show');
Route::post('/{cert_token}/download',[CertificateController::class, 'download'])->name('download');
});
require __DIR__.'/auth.php';