TKK_E32230908/routes/web.php

315 lines
17 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\Response;
use App\Models\Member;
use App\Http\Controllers\Auth\LoginWithEmailController;
use App\Http\Controllers\Auth\RegisterController;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Auth\VerificationController;
use App\Http\Controllers\GoogleController;
use App\Http\Controllers\{
AuthController,
AnggotaController,
BorrowTransactionController,
StatistikController,
BackupController
};
use App\Http\Controllers\Admin\{
DashboardController,
AnggotaController as AdminAnggotaController,
PeminjamanController as AdminPeminjamanController,
KoleksiController as AdminKoleksiController,
StatistikController as AdminStatistikController,
SystemController
};
use App\Http\Controllers\User\{
KoleksiController as UserKoleksiController,
UserMemberController,
UserPeminjamanController
};
Route::middleware(['web', StartSession::class])->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-api', [App\Http\Controllers\Admin\DashboardController::class, 'apiData'])->name('admin.dashboard.api');
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::get('/admin/anggota/{id}/pdf', [AdminAnggotaController::class, 'downloadPdf'])
->name('admin.anggota.pdf');
Route::get('/admin/anggota/{id}/print', [AdminAnggotaController::class, 'print'])
->name('admin.anggota.print');
});
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::post('/barcode-multiple', [AdminKoleksiController::class, 'printMultipleBarcode'])->name('admin.koleksi.barcode_multiple');
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::delete('/koleksi/destroy-multiple', [AdminKoleksiController::class, 'destroyMultiple'])->name('admin.koleksi.destroy_multiple');
Route::get('/{kode_eksemplar}/barcode', [AdminKoleksiController::class, 'printBarcodeSingle'])
->name('admin.koleksi.barcode_single');
});
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::get('/peminjaman/{id}/cetak-nota', [AdminPeminjamanController::class, 'cetakNota'])->name('admin.peminjaman.nota');
Route::post('/peminjaman/{id}/setujui-perpanjangan', [AdminPeminjamanController::class, 'setujuiPerpanjangan'])
->name('admin.peminjaman.setujui-perpanjangan');
Route::post('/peminjaman/{id}/tolak-perpanjangan', [AdminPeminjamanController::class, 'tolakPerpanjangan'])
->name('admin.peminjaman.tolak-perpanjangan');
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('/member/pending', [UserMemberController::class, 'pending'])->name('user.member.pending');
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::match(['get', 'post'], '/peminjaman/{id}/perpanjang-form', [UserPeminjamanController::class, 'showPerpanjangForm'])
->name('user.peminjaman.perpanjang.form');Route::post('/peminjaman/{id}/perpanjang-proses', [UserPeminjamanController::class, 'processPerpanjang'])->name('user.peminjaman.perpanjang.process');
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('/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);
});
Route::prefix('transaksi')->group(function () {
// halaman utama (opsional)
Route::get('/iot', function () {
return view('transaksi.iot');
});
// FLOW
Route::get('/scan-barcode', function () {
return view('transaksi.scan-barcode');
});
Route::get('/detail-buku', function () {
return view('transaksi.detail-buku');
});
Route::get('/scan-rfid', function () {
return view('transaksi.scan-rfid');
});
Route::get('/hasil', function () {
return view('transaksi.hasil-transaksi');
});
Route::get('/peminjaman-berhasil', function () {
return view('transaksi.peminjaman-berhasil');
});
Route::get('/pengembalian-berhasil', function () {
return view('transaksi.pengembalian-berhasil');
});
});
Route::get('/transaksi/detail/{id}', function ($id) {
$trx = \App\Models\BorrowTransaction::with(['anggota','koleksi'])
->findOrFail($id);
return view('transaksi.detail', compact('trx'));
});
Route::get('/transaksi/konfirmasi-kembali', function () {
return view('transaksi.konfirmasi-kembali');
});
// Route untuk mengarahkan ke Google
Route::get('auth/google', [GoogleController::class, 'redirectToGoogle'])->name('login.google');
// Route untuk menerima data balik dari Google
Route::get('auth/google/callback', [GoogleController::class, 'handleGoogleCallback']);
Route::get('/masuk', function () {
return '
<html lang="id">
<head>
<title>Menghubungkan ke Pustaka Nawasena...</title>
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background: #f4f6f9; color: #333; }
.loader { text-align: center; }
</style>
</head>
<body>
<div class="loader">
<h3>Menghubungkan ke Server Bakorwil...</h3>
<p>Mohon tunggu sebentar, sistem sedang sinkronisasi dengan ESP32.</p>
</div>
<script>
// Memaksa browser mengirim header bypass ke Ngrok sebelum masuk ke halaman utama
fetch("/", {
method: "GET",
headers: { "ngrok-skip-browser-warning": "true" }
}).then(() => {
// Begitu sukses tembus, langsung lempar ke halaman login utama
window.location.href = "/login";
}).catch(() => {
window.location.href = "/login";
});
</script>
</body>
</html>
';
});