group(function () { Route::get('/welcome', fn() => view('welcome'))->name('welcome'); Route::get('/', fn() => auth()->check() ? redirect()->route('home') : redirect()->route('welcome')); Route::get('/home', [AuthController::class, 'dashboard'])->middleware('auth')->name('home'); Route::get('/profile', [AuthController::class, 'profile'])->middleware('auth')->name('profile'); Route::get('/register', [AuthController::class, 'showRegister'])->name('register'); Route::post('/register', [AuthController::class, 'register'])->name('register.submit'); Route::get('/login', [AuthController::class, 'showLogin'])->name('login'); Route::post('/login', [AuthController::class, 'login'])->name('login.submit'); Route::post('/logout', [AuthController::class, 'logout'])->name('logout'); Route::get('/forgot-password', [AuthController::class, 'showForgotPasswordForm'])->name('forgotPassword'); Route::post('/forgot-password', [AuthController::class, 'sendResetLink'])->name('sendResetLink'); Route::get('/reset-password/{token}', [AuthController::class, 'showResetPasswordForm'])->name('password.reset'); Route::post('/reset-password', [AuthController::class, 'resetPassword'])->name('password.update'); Route::get('/email/verify', function () { return view('auth.verify-email'); })->middleware('auth')->name('verification.notice'); Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) { $request->fulfill(); return redirect('/home'); })->middleware(['auth', 'signed'])->name('verification.verify'); Route::post('/email/verification-notification', function (Request $request) { $request->user()->sendEmailVerificationNotification(); return back()->with('message', 'Link verifikasi baru telah dikirim!'); })->middleware(['auth', 'throttle:6,1'])->name('verification.send'); // Admin Routes Route::prefix('admin')->middleware(['auth'])->group(function () { Route::get('/dashboard', [DashboardController::class, 'index'])->name('admin.dashboard'); Route::get('/profile', [AuthController::class, 'profile'])->name('admin.profile'); Route::post('/profile/update', [AuthController::class, 'updateProfile'])->name('admin.updateProfile'); Route::post('/profile/password', [AuthController::class, 'updatePassword'])->name('admin.updatePassword'); Route::get('/security', [AuthController::class, 'adminsecurity'])->name('admin.security'); Route::post('/admin/check-password', [AuthController::class, 'checkCurrentPassword'])->name('admin.checkPassword'); Route::post('/profile/update-foto', [AuthController::class, 'updateFoto']) ->name('admin.update_foto'); Route::delete('/profile/delete-foto', [AuthController::class, 'deleteFoto']) ->name('admin.delete_foto'); Route::prefix('anggota')->group(function () { Route::get('/', [AdminAnggotaController::class, 'index'])->name('admin.anggota.index'); Route::get('/create', [AdminAnggotaController::class, 'create'])->name('admin.anggota.create'); Route::post('/', [AdminAnggotaController::class, 'store'])->name('admin.anggota.store'); Route::get('/{id}/edit', [AdminAnggotaController::class, 'edit'])->name('admin.anggota.edit'); Route::put('/{id}', [AdminAnggotaController::class, 'update'])->name('admin.anggota.update'); Route::delete('/{id}', [AdminAnggotaController::class, 'destroy'])->name('admin.anggota.destroy'); Route::get('/cetak/{id}', [AdminAnggotaController::class, 'cetak'])->name('admin.anggota.cetak'); Route::get('/anggota', [App\Http\Controllers\Admin\AnggotaController::class, 'index'])->name('admin.anggota'); Route::get('/anggota/{id}', [App\Http\Controllers\Admin\AnggotaController::class, 'show'])->name('admin.anggota.show'); Route::post('/anggota/{id}/approve', [App\Http\Controllers\Admin\AnggotaController::class, 'approve'])->name('admin.anggota.approve'); Route::post('/anggota/{id}/reject', [App\Http\Controllers\Admin\AnggotaController::class, 'reject'])->name('admin.anggota.reject'); Route::get('/cetak/{id}/pdf', [AdminAnggotaController::class, 'downloadPdf']) ->name('member.kartu.pdf'); }); Route::prefix('koleksi')->group(function () { Route::get('/', [AdminKoleksiController::class, 'index'])->name('admin.koleksi.index'); Route::get('/create', [AdminKoleksiController::class, 'create'])->name('admin.koleksi.create'); Route::post('/', [AdminKoleksiController::class, 'store'])->name('admin.koleksi.store'); Route::get('/{kode_eksemplar}/edit', [AdminKoleksiController::class, 'edit'])->name('admin.koleksi.edit'); Route::put('/{kode_eksemplar}', [AdminKoleksiController::class, 'update'])->name('admin.koleksi.update'); Route::delete('/{kode_eksemplar}', [AdminKoleksiController::class, 'destroy'])->name('admin.koleksi.destroy'); Route::get('/{kode_eksemplar}/barcode', [AdminKoleksiController::class, 'printBarcodeSingle']) ->name('admin.koleksi.barcode_single'); Route::get('/barcode/multiple', [AdminKoleksiController::class, 'printBarcodeMultiple']) ->name('admin.koleksi.barcode_multiple'); }); Route::get('/peminjaman', [AdminPeminjamanController::class, 'index'])->name('admin.peminjaman'); Route::post('/peminjaman/{id}/setujui', [AdminPeminjamanController::class, 'setujui'])->name('admin.peminjaman.setujui'); Route::post('/peminjaman/{id}/tolak', [AdminPeminjamanController::class, 'tolak'])->name('admin.peminjaman.tolak'); Route::post('/peminjaman/{id}/ambil', [AdminPeminjamanController::class, 'ambilBuku'])->name('admin.peminjaman.ambil'); Route::put('/peminjaman/{id}/kembalikan', [AdminPeminjamanController::class, 'kembalikan'])->name('admin.peminjaman.kembalikan'); Route::get('/peminjaman/download/{id}', [AdminPeminjamanController::class, 'downloadSuratPengantar'])->name('admin.peminjaman.download'); Route::post('/peminjaman/{id}/setujui', [AdminPeminjamanController::class, 'setujui'])->name('admin.peminjaman.setujui'); Route::post('/peminjaman/{id}/tolak', [AdminPeminjamanController::class, 'tolak'])->name('admin.peminjaman.tolak'); Route::post('/peminjaman/{id}/setujui-pengembalian', [AdminPeminjamanController::class, 'setujuiPengembalian']) ->name('admin.peminjaman.setujuiPengembalian'); Route::post('/peminjaman/{id}/setujui-perpanjangan', [AdminPeminjamanController::class, 'setujuiPerpanjangan']) ->name('admin.peminjaman.setujuiPerpanjangan'); Route::post('/peminjaman/{id}/tolak-perpanjangan', [AdminPeminjamanController::class, 'tolakPerpanjangan']) ->name('admin.peminjaman.tolakPerpanjangan'); Route::get('/statistik', [AdminStatistikController::class, 'index'])->name('admin.statistik'); Route::get('/system', [SystemController::class, 'index'])->name('admin.system'); Route::post('/system/add', [SystemController::class, 'makeAdmin'])->name('admin.system.add'); Route::post('/system/remove', [SystemController::class, 'removeAdmin'])->name('admin.system.remove'); Route::post('/block', [SystemController::class, 'block'])->name('admin.system.block'); Route::post('/unblock', [SystemController::class, 'unblock'])->name('admin.system.unblock'); }); // User Routes Route::prefix('user')->middleware(['auth'])->group(function () { Route::get('/dashboard', [AuthController::class, 'userDashboard'])->name('user.dashboard'); Route::get('/profile', [AuthController::class, 'profile'])->name('user.profile'); Route::post('/profile/update-foto', [AuthController::class, 'updateFoto']) ->name('user.update_foto'); Route::delete('/profile/delete-foto', [AuthController::class, 'deleteFoto']) ->name('user.delete_foto'); Route::get('/koleksi', [UserKoleksiController::class, 'index'])->name('user.koleksi'); Route::get('/koleksi/search', [UserKoleksiController::class, 'index'])->name('user.koleksi.search'); Route::get('/api/pengarang', [UserKoleksiController::class, 'getPengarang'])->name('api.pengarang'); Route::get('/ganti-bahasa/{kode}', [UserKoleksiController::class, 'gantiBahasa'])->name('ganti.bahasa'); Route::get('/koleksi/{koleksi}', [UserKoleksiController::class, 'show'])->name('user.koleksi.show'); Route::get('register', [UserMemberController::class, 'create'])->name('user.member.create'); Route::post('register', [UserMemberController::class, 'store'])->name('user.member.store'); Route::get('list', [UserMemberController::class, 'index'])->name('user.member.index'); Route::get('peminjaman', [UserPeminjamanController::class, 'index'])->name('user.peminjaman.index'); Route::get('peminjaman/create', [UserPeminjamanController::class, 'create'])->name('user.peminjaman.create'); Route::post('peminjaman', [UserPeminjamanController::class, 'store'])->name('user.peminjaman.store'); Route::post('peminjaman/{id}/perpanjang', [UserPeminjamanController::class, 'ajukanPerpanjangan'])->name('user.peminjaman.perpanjang'); Route::post('/peminjaman/{id}/perpanjang', [UserPeminjamanController::class, 'ajukanPerpanjangan']) ->name('user.peminjaman.perpanjang'); Route::get('peminjaman/download/{id}', [UserPeminjamanController::class, 'downloadSuratPengantar'])->name('user.peminjaman.download'); Route::post('peminjaman/{id}/kembalikan', [UserPeminjamanController::class, 'kembalikan'])->name('user.peminjaman.kembalikan'); Route::get('peminjaman/{id}/penilaian', [UserPeminjamanController::class, 'penilaian'])->name('user.rating.form'); Route::post('peminjaman/{id}/penilaian', [UserPeminjamanController::class, 'simpanPenilaian'])->name('user.rating.store'); Route::get('/layanan', fn() => view('user.layanan.index'))->name('user.layanan'); Route::prefix('layanan')->group(function () { Route::get('/referensi', fn() => view('user.layanan.referensi'))->name('user.layanan.referensi'); Route::get('/peminjaman', fn() => view('user.layanan.peminjaman'))->name('user.layanan.peminjaman'); Route::get('/digital', fn() => view('user.layanan.digital'))->name('user.layanan.digital'); Route::get('/informasi', fn() => view('user.layanan.informasi'))->name('user.layanan.informasi'); Route::get('/kontak-lokasi', fn() => view('user.kontak-lokasi'))->name('user.kontak-lokasi'); Route::get('/fasilitas', fn() => view('user.fasilitas'))->name('user.fasilitas'); }); }); // API & Public Routes Route::get('/members', fn() => Member::all()); Route::get('/search', function (\Illuminate\Http\Request $request) { return redirect()->route('user.koleksi', ['search' => $request->query('search')]); })->name('public.search'); Route::get('/download/surat/{filename}', function ($filename) { $path = storage_path('app/public/surat_pengantar/' . $filename); if (!file_exists($path)) abort(404, 'File tidak ditemukan'); return Response::download($path, $filename, ['Content-Type' => 'application/pdf']); })->name('download.surat'); }); Route::prefix('user')->middleware(['auth'])->group(function () { Route::get('/profile', [AuthController::class, 'profile'])->name('user.profile'); Route::post('/profile/update', [AuthController::class, 'updateProfile'])->name('user.updateProfile'); Route::post('/profile/password', [AuthController::class, 'updatePassword'])->name('user.updatePassword'); Route::get('/security', [AuthController::class, 'security'])->name('user.security'); Route::post('/user/check-password', [AuthController::class, 'checkCurrentPassword'])->name('user.checkPassword'); }); // Login via Email Aktif Route::get('/login/email', [LoginWithEmailController::class, 'showForm'])->name('login.email'); Route::post('/login/email', [LoginWithEmailController::class, 'sendLink'])->name('login.email.send'); Route::get('/login/email/{token}', [LoginWithEmailController::class, 'login'])->name('login.email.token'); Route::get('login/google', [GoogleController::class, 'redirectToGoogle'])->name('login.google'); Route::get('login/google/callback', [GoogleController::class, 'handleGoogleCallback']); Route::get('/verify-email', [AuthController::class, 'showVerifyEmailForm'])->name('verify.email.form'); Route::post('/verify-email', [AuthController::class, 'verifyEmail'])->name('verify.email.submit'); Route::post('/resend-otp', [AuthController::class, 'resendOtp'])->name('resend.otp'); Route::get('/user-foto/{filename}', function ($filename) { $path = storage_path('app/public/foto/' . $filename); if (!File::exists($path)) { abort(404); } return response()->file($path); });