MIF_E31231003/routes/web.php

235 lines
12 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use App\Models\User;
use App\Models\PasswordReset;
use App\Mail\OtpVerificationMail;
use App\Http\Controllers\ArtikelPublikController;
use App\Http\Controllers\MediaController;
use App\Http\Controllers\Siswa\SpkController;
use App\Http\Controllers\Siswa\ProfileController;
use App\Http\Controllers\Admin\DashboardController as AdminDashboard;
use App\Http\Controllers\Admin\GuruBkController as AdminGuruBk;
use App\Http\Controllers\Admin\SiswaAdminController as AdminSiswa;
use App\Http\Controllers\Admin\StatusController as AdminStatus;
use App\Http\Controllers\Admin\JurusanAdminController as AdminJurusan;
use App\Http\Controllers\Admin\ArtikelAdminController as AdminArtikel;
use App\Http\Controllers\Admin\InfoJurusanAdminController as AdminInfoJurusan;
use App\Http\Controllers\Admin\MonitoringController as AdminMonitoring;
use App\Http\Controllers\Admin\PenyakitController as AdminPenyakit;
use App\Http\Controllers\Bk\DashboardController;
use App\Http\Controllers\Bk\SiswaController as BkSiswaController;
use App\Http\Controllers\Bk\StatistikController;
use App\Http\Controllers\Bk\ArtikelController as BkArtikelController;
use App\Http\Controllers\Bk\InfoJurusanController;
use App\Http\Controllers\Bk\ProfilController as BkProfilController;
use App\Http\Controllers\Bk\PasswordController as BkPasswordController;
use App\Http\Controllers\Auth\OtpRegisterController;
use App\Http\Controllers\Auth\OtpController;
/*
|--------------------------------------------------------------------------
| Route utilitas
|--------------------------------------------------------------------------
*/
Route::get('/reset-admin', function () {
DB::table('users')
->where('email', 'admin@spksaw.local')
->update([
'password_hash' => Hash::make('admin123')
]);
return 'Password admin berhasil direset';
});
Route::get('/test-otp-db', function () {
$otp = PasswordReset::create([
'user_id' => 1,
'otp_code' => '123456',
'expires_at' => now()->addMinutes(10),
'is_used' => false,
]);
return $otp;
});
Route::get('/test-otp-mail', function () {
$user = User::find(1); // ganti sesuai user yang benar-benar ada
if (!$user) {
return 'User tidak ditemukan.';
}
if (empty($user->email)) {
return 'Email user kosong.';
}
$otp = '123456';
Mail::to($user->email)->send(new OtpVerificationMail($user, $otp));
return 'Email OTP berhasil dikirim.';
});
/*
|--------------------------------------------------------------------------
| Public routes
|--------------------------------------------------------------------------
*/
// Landing
Route::get('/', [App\Http\Controllers\LandingController::class, 'index'])->name('landing.home');
Route::get('/landingpage', fn () => redirect()->route('landing.home'))->name('landingpage');
Route::get('/media/artikel/gambar/{upload}', [MediaController::class, 'artikelGambar'])->name('media.artikel.gambar');
Route::get('/media/artikel/file/{upload}', [MediaController::class, 'artikelFile'])->name('media.artikel.file');
// Artikel publik
Route::get('/artikel', [ArtikelPublikController::class, 'index'])->name('artikel.index');
Route::get('/artikel/{id}', [ArtikelPublikController::class, 'show'])->name('artikel.show');
Route::get('/jurusan/{id}', [App\Http\Controllers\JurusanPublikController::class, 'show'])->name('jurusan.show');
// Breeze routes (login/register/logout/forgot/etc)
require __DIR__ . '/auth.php';
/*
|--------------------------------------------------------------------------
| OTP Global (Login Verification)
|--------------------------------------------------------------------------
*/
Route::middleware('guest')->group(function () {
Route::get('/login/otp', [OtpController::class, 'showForm'])->name('otp.form');
Route::post('/login/otp/resend', [OtpController::class, 'resend'])->name('otp.resend');
Route::post('/login/otp/verify', [OtpController::class, 'verify'])->name('otp.verify');
});
/*
|--------------------------------------------------------------------------
| Admin
|--------------------------------------------------------------------------
*/
Route::prefix('admin')->name('admin.')->middleware('auth')->group(function () {
// FR-A-01: Dashboard
Route::get('/dashboard', [AdminDashboard::class, 'index'])->name('dashboard');
// FR-A-02~05: Kelola Akun Guru BK
Route::get('/guru-bk', [AdminGuruBk::class, 'index'])->name('gurubk.index');
Route::get('/guru-bk/create', [AdminGuruBk::class, 'create'])->name('gurubk.create');
Route::post('/guru-bk', [AdminGuruBk::class, 'store'])->name('gurubk.store');
Route::get('/guru-bk/{id}/edit', [AdminGuruBk::class, 'edit'])->name('gurubk.edit');
Route::put('/guru-bk/{id}', [AdminGuruBk::class, 'update'])->name('gurubk.update');
Route::patch('/guru-bk/{id}/status', [AdminGuruBk::class, 'toggleStatus'])->name('gurubk.status');
// FR-A-05~06: Kelola Akun Siswa
Route::get('/siswa', [AdminSiswa::class, 'index'])->name('siswa.index');
Route::get('/siswa/{id}/edit', [AdminSiswa::class, 'edit'])->name('siswa.edit');
Route::put('/siswa/{id}', [AdminSiswa::class, 'update'])->name('siswa.update');
Route::patch('/siswa/{id}/status', [AdminSiswa::class, 'toggleStatus'])->name('siswa.status');
// FR-A-07: Status Siswa & Guru BK
Route::get('/status', [AdminStatus::class, 'index'])->name('status.index');
Route::patch('/status/siswa/{id}', [AdminStatus::class, 'toggleSiswa'])->name('status.siswa');
Route::patch('/status/guru/{id}', [AdminStatus::class, 'toggleGuru'])->name('status.guru');
// FR-A-08: Kelola Jurusan
Route::get('/jurusan', [AdminJurusan::class, 'index'])->name('jurusan.index');
Route::get('/jurusan/create', [AdminJurusan::class, 'create'])->name('jurusan.create');
Route::post('/jurusan', [AdminJurusan::class, 'store'])->name('jurusan.store');
Route::get('/jurusan/{id}/edit', [AdminJurusan::class, 'edit'])->name('jurusan.edit');
Route::put('/jurusan/{id}', [AdminJurusan::class, 'update'])->name('jurusan.update');
Route::patch('/jurusan/{id}/status', [AdminJurusan::class, 'toggleStatus'])->name('jurusan.status');
// Master penyakit untuk aturan jurusan
Route::get('/penyakit', [AdminPenyakit::class, 'index'])->name('penyakit.index');
Route::post('/penyakit', [AdminPenyakit::class, 'store'])->name('penyakit.store');
Route::put('/penyakit/{id}', [AdminPenyakit::class, 'update'])->name('penyakit.update');
Route::patch('/penyakit/{id}/status', [AdminPenyakit::class, 'toggleStatus'])->name('penyakit.status');
// FR-A-09: Kelola Artikel
Route::get('/artikel', [AdminArtikel::class, 'index'])->name('artikel.index');
Route::get('/artikel/{id}/edit', [AdminArtikel::class, 'edit'])->name('artikel.edit');
Route::put('/artikel/{id}', [AdminArtikel::class, 'update'])->name('artikel.update');
Route::delete('/artikel/{id}', [AdminArtikel::class, 'destroy'])->name('artikel.destroy');
// FR-A-10: Kelola Info Jurusan
Route::get('/informasi-jurusan', [AdminInfoJurusan::class, 'index'])->name('infojurusan.index');
Route::get('/informasi-jurusan/{jurusanId}/edit', [AdminInfoJurusan::class, 'edit'])->name('infojurusan.edit');
Route::put('/informasi-jurusan/{jurusanId}', [AdminInfoJurusan::class, 'update'])->name('infojurusan.update');
Route::delete('/informasi-jurusan/{jurusanId}', [AdminInfoJurusan::class, 'destroy'])->name('infojurusan.destroy');
// FR-A-11: Monitoring
Route::get('/monitoring', [AdminMonitoring::class, 'index'])->name('monitoring.index');
});
/*
|--------------------------------------------------------------------------
| Guru BK
|--------------------------------------------------------------------------
*/
Route::prefix('bk')->name('bk.')->middleware('auth')->group(function () {
// Tetap boleh diakses sebelum onboarding selesai
Route::get('/password', [BkPasswordController::class, 'index'])->name('password.index');
Route::put('/password/update', [BkPasswordController::class, 'update'])->name('password.update');
Route::get('/profil', [BkProfilController::class, 'index'])->name('profil');
Route::put('/profil/update', [BkProfilController::class, 'update'])->name('profil.update');
// Semua route lain dibatasi middleware onboarding
Route::middleware('force.password.change')->group(function () {
// FR-BK-01: Dashboard
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
// FR-BK-02: Data Siswa & Hasil Tes
Route::get('/siswa', [BkSiswaController::class, 'index'])->name('siswa.index');
Route::get('/siswa/{id}', [BkSiswaController::class, 'show'])->name('siswa.show');
Route::get('/siswa/{siswaId}/tes/{tesId}/hasil', [BkSiswaController::class, 'hasilTes'])->name('siswa.hasil');
Route::get('/siswa/{siswaId}/tes/{tesId}/pdf', [BkSiswaController::class, 'downloadPdf'])->name('siswa.pdf');
// FR-BK-03: Statistik
Route::get('/statistik', [StatistikController::class, 'index'])->name('statistik');
// FR-BK-05: Kelola Artikel
Route::get('/artikel', [BkArtikelController::class, 'index'])->name('artikel.index');
Route::get('/artikel/create', [BkArtikelController::class, 'create'])->name('artikel.create');
Route::post('/artikel', [BkArtikelController::class, 'store'])->name('artikel.store');
Route::get('/artikel/{id}/edit', [BkArtikelController::class, 'edit'])->name('artikel.edit');
Route::put('/artikel/{id}', [BkArtikelController::class, 'update'])->name('artikel.update');
Route::delete('/artikel/{id}', [BkArtikelController::class, 'destroy'])->name('artikel.destroy');
// FR-BK-06: Kelola Info Jurusan
Route::get('/infojurusan', [InfoJurusanController::class, 'index'])->name('infojurusan.index');
Route::get('/infojurusan/{id}', [InfoJurusanController::class, 'show'])->name('infojurusan.show');
Route::get('/infojurusan/{id}/edit', [InfoJurusanController::class, 'edit'])->name('infojurusan.edit');
Route::put('/infojurusan/{id}', [InfoJurusanController::class, 'update'])->name('infojurusan.update');
});
});
/*
|--------------------------------------------------------------------------
| SPK Tes Siswa
|--------------------------------------------------------------------------
*/
Route::prefix('siswa')->name('siswa.')->middleware('auth')->group(function () {
Route::get('/tes', [SpkController::class, 'index'])->name('tes.index');
Route::post('/tes/simpan', [SpkController::class, 'store'])->name('tes.simpan');
Route::get('/tes/hasil', [SpkController::class, 'hasil'])->name('tes.hasil');
Route::get('/tes/cetak', [SpkController::class, 'cetakPdf'])->name('tes.cetak');
Route::get('/history', [SpkController::class, 'history'])->name('history');
Route::get('/tes/{tes}/hasil', [SpkController::class, 'hasilByTes'])->name('tes.hasil.show');
Route::get('/tes/{tes}/pdf', [SpkController::class, 'cetakPdfByTes'])->name('tes.pdf.download');
// Profile Siswa
Route::get('/profile', [ProfileController::class, 'index'])->name('profile');
Route::put('/profile/update', [ProfileController::class, 'update'])->name('profile.update');
Route::put('/profile/password', [ProfileController::class, 'updatePassword'])->name('profile.password');
});