NIM_E31222518/routes/web.php

248 lines
15 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\BarangController;
use App\Http\Controllers\PesananController;
use App\Http\Controllers\TransaksiController;
use App\Http\Controllers\UserProfileController;
use App\Http\Controllers\KeranjangController;
use Illuminate\Http\Request;
use App\Http\Controllers\UserController;
use Illuminate\Auth\Events\Verified;
use App\Http\Controllers\LocationController;
// Redirect root ke dashboard
Route::get('/', function () {
if (auth()->check()) {
return redirect()->route('dashboard');
}
return view('welcome');
})->name('home');
// Auth Routes
Route::middleware('guest')->group(function () {
// Login Routes
Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
Route::post('/login', [LoginController::class, 'login']);
// Register Routes
Route::get('/register', [RegisterController::class, 'create'])->name('register');
Route::post('/register', [RegisterController::class, 'store'])->name('register.store');
// Password Reset Routes
Route::get('/password/reset', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
Route::post('/password/email', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
Route::get('/password/reset/{token}/{email}', [ForgotPasswordController::class, 'showResetForm'])->name('password.reset');
Route::post('/password/reset', [ForgotPasswordController::class, 'reset'])->name('password.update');
});
// Dashboard Route (Public)
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
// Protected Routes
Route::middleware(['auth'])->group(function () {
// User Profile Routes
Route::get('/profile', [UserProfileController::class, 'show'])->name('profile.show');
Route::put('/profile', [UserProfileController::class, 'update'])->name('profile.update');
// Barang Routes
Route::resource('barang', BarangController::class);
Route::get('/barang', [BarangController::class, 'index'])->name('barang.index');
Route::get('/barang/{barang}', [BarangController::class, 'show'])->name('barang.show');
Route::post('/barang/checkout', [BarangController::class, 'checkout'])->name('barang.checkout');
// Pesanan Routes
Route::resource('pesanan', PesananController::class)->except(['destroy', 'show']);
Route::get('/pesanan/{pesanan}', [PesananController::class, 'show'])->name('pesanan.show');
Route::post('/pesanan/from-cart', [PesananController::class, 'storeFromCart'])->name('pesanan.store-from-cart');
// Transaksi Routes
Route::get('/transaksi/create/{pesanan}', [TransaksiController::class, 'create'])->name('transaksi.create');
Route::resource('transaksi', TransaksiController::class)->except(['create']);
// Keranjang Routes
Route::get('/keranjang', [KeranjangController::class, 'index'])->name('keranjang.index');
Route::post('/keranjang/tambah', [KeranjangController::class, 'tambah'])->name('keranjang.tambah');
Route::get('/keranjang/checkout', [KeranjangController::class, 'checkout'])->name('keranjang.checkout');
Route::post('/keranjang/checkout-selected', [KeranjangController::class, 'checkoutSelected'])->name('keranjang.checkout-selected');
Route::delete('/keranjang/hapus-selected', [KeranjangController::class, 'hapusSelected'])->name('keranjang.hapus-selected');
Route::put('/keranjang/{keranjang}', [KeranjangController::class, 'update'])->name('keranjang.update');
Route::delete('/keranjang/{keranjang}', [KeranjangController::class, 'hapus'])->name('keranjang.hapus');
Route::post('/keranjang/{keranjang}/delete', [KeranjangController::class, 'hapus'])->name('keranjang.hapus.post');
Route::post('/keranjang/hapus-manual', [KeranjangController::class, 'hapusManual'])->name('keranjang.hapus.manual');
Route::post('/keranjang/hapus-direct', [KeranjangController::class, 'hapusDirect'])->name('keranjang.hapus.direct');
Route::post('/keranjang/update-direct', [KeranjangController::class, 'updateDirect'])->name('keranjang.update.direct');
Route::post('/keranjang/update-fallback', [KeranjangController::class, 'updateFallback'])->name('keranjang.update.fallback');
Route::post('/keranjang/hapus-fallback', function(Request $request) {
// Fallback sederhana yang dilengkapi debug
\Log::debug('===== FALLBACK HAPUS =====');
\Log::debug('User ID: ' . Auth::id());
\Log::debug('Data: ' . json_encode($request->all()));
if (!$request->has('id')) {
return redirect()->route('keranjang.index')->with('error', 'ID tidak valid');
}
try {
$deleted = \DB::table('keranjang')
->where('id', $request->id)
->delete();
\Log::debug('Result: ' . ($deleted ? 'BERHASIL' : 'GAGAL'));
return redirect()->route('keranjang.index')
->with('success', 'Item berhasil dihapus');
} catch (\Exception $e) {
\Log::error('Error: ' . $e->getMessage());
return redirect()->route('keranjang.index')
->with('error', 'Gagal menghapus item');
}
})->name('keranjang.hapus.fallback');
Route::delete('/keranjang', [KeranjangController::class, 'kosongkan'])->name('keranjang.kosongkan');
// Route fallback untuk keranjang dengan GET method (untuk mencegah error browser)
Route::get('/keranjang/{id}', function($id) {
// Log access dan redirect ke keranjang.index
\Log::debug('Akses GET ke keranjang/{id}', ['id' => $id]);
return redirect()->route('keranjang.index')
->with('error', 'Gunakan tombol di halaman untuk mengubah jumlah barang');
})->name('keranjang.fallback');
// Debug user
Route::get('/debug-user', function() {
if (!Auth::check()) {
return response()->json(['error' => 'Tidak ada user yang login'], 401);
}
return response()->json([
'user_id' => Auth::id(),
'user_name' => Auth::user()->name,
'user_email' => Auth::user()->email,
'is_authenticated' => Auth::check(),
'session_id' => session()->getId(),
'time' => now()->toDateTimeString()
]);
});
// Additional Routes
Route::post('/pesanan/{pesanan}/status', [PesananController::class, 'updateStatus'])->name('pesanan.status');
Route::post('/transaksi/{transaksi}/upload-bukti', [TransaksiController::class, 'uploadBukti'])->name('transaksi.upload-bukti');
Route::post('/transaksi/{transaksi}/confirm', [TransaksiController::class, 'confirmPayment'])->name('transaksi.confirm');
// Logout Route
Route::post('/logout', [LoginController::class, 'logout'])->name('logout');
// User Update Address
Route::post('/user/update-address', [UserController::class, 'updateAddress'])->name('user.update-address');
});
// API Routes (tanpa CSRF)
Route::middleware(['auth'])->group(function () {
Route::delete('/api/pesanan/{pesanan}', [PesananController::class, 'destroy'])->name('pesanan.destroy');
});
// Admin Routes
Route::middleware(['auth', \App\Http\Middleware\CheckRole::class . ':admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [\App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard');
// Admin Users
Route::get('/users', [\App\Http\Controllers\Admin\UserController::class, 'index'])->name('users.index');
Route::get('/users/create', [\App\Http\Controllers\Admin\UserController::class, 'create'])->name('users.create');
Route::post('/users', [\App\Http\Controllers\Admin\UserController::class, 'store'])->name('users.store');
Route::get('/users/{user}', [\App\Http\Controllers\Admin\UserController::class, 'show'])->name('users.show');
Route::get('/users/{user}/edit', [\App\Http\Controllers\Admin\UserController::class, 'edit'])->name('users.edit');
Route::put('/users/{user}', [\App\Http\Controllers\Admin\UserController::class, 'update'])->name('users.update');
Route::delete('/users/{user}', [\App\Http\Controllers\Admin\UserController::class, 'destroy'])->name('users.destroy');
// Admin Barang
Route::get('/barang', [\App\Http\Controllers\Admin\BarangController::class, 'index'])->name('barang.index');
Route::get('/barang/create', [\App\Http\Controllers\Admin\BarangController::class, 'create'])->name('barang.create');
Route::post('/barang', [\App\Http\Controllers\Admin\BarangController::class, 'store'])->name('barang.store');
Route::get('/barang/{barang}', [\App\Http\Controllers\Admin\BarangController::class, 'show'])->name('barang.show');
Route::get('/barang/{barang}/edit', [\App\Http\Controllers\Admin\BarangController::class, 'edit'])->name('barang.edit');
Route::put('/barang/{barang}', [\App\Http\Controllers\Admin\BarangController::class, 'update'])->name('barang.update');
Route::delete('/barang/{barang}', [\App\Http\Controllers\Admin\BarangController::class, 'destroy'])->name('barang.destroy');
// Admin Pesanan
Route::get('/pesanan', [\App\Http\Controllers\Admin\PesananController::class, 'index'])->name('pesanan.index');
Route::get('/pesanan/{pesanan}', [\App\Http\Controllers\Admin\PesananController::class, 'show'])->name('pesanan.show');
Route::post('/pesanan/{pesanan}/status', [\App\Http\Controllers\Admin\PesananController::class, 'updateStatus'])->name('pesanan.status');
// Admin Transaksi
Route::get('/transaksi', [\App\Http\Controllers\Admin\TransaksiController::class, 'index'])->name('transaksi.index');
Route::get('/transaksi/{transaksi}', [\App\Http\Controllers\Admin\TransaksiController::class, 'show'])->name('transaksi.show');
Route::put('/transaksi/{transaksi}/status', [\App\Http\Controllers\Admin\TransaksiController::class, 'updateStatus'])->name('transaksi.status');
// Admin Laporan
Route::get('/laporan', [\App\Http\Controllers\Admin\LaporanController::class, 'index'])->name('laporan.index');
Route::get('/laporan/generate', [\App\Http\Controllers\Admin\LaporanController::class, 'generate'])->name('laporan.generate');
Route::get('/laporan/penjualan', [\App\Http\Controllers\Admin\LaporanController::class, 'penjualan'])->name('laporan.penjualan');
Route::get('/laporan/stok', [\App\Http\Controllers\Admin\LaporanController::class, 'stok'])->name('laporan.stok');
Route::get('/laporan/transaksi', [\App\Http\Controllers\Admin\LaporanController::class, 'transaksi'])->name('laporan.transaksi');
Route::post('/laporan/download', [\App\Http\Controllers\Admin\LaporanController::class, 'download'])->name('laporan.download');
// Admin Banner
Route::resource('/banners', \App\Http\Controllers\Admin\BannerController::class);
Route::post('/banners/{banner}/toggle', [\App\Http\Controllers\Admin\BannerController::class, 'toggleStatus'])->name('banners.toggle');
Route::post('/banners/{banner}/move-up', [\App\Http\Controllers\Admin\BannerController::class, 'moveUp'])->name('banners.move-up');
Route::post('/banners/{banner}/move-down', [\App\Http\Controllers\Admin\BannerController::class, 'moveDown'])->name('banners.move-down');
// Admin Flash Sale
Route::resource('/flash-sales', \App\Http\Controllers\Admin\FlashSaleController::class);
Route::post('/flash-sales/{flashSale}/toggle', [\App\Http\Controllers\Admin\FlashSaleController::class, 'toggleStatus'])->name('flash-sales.toggle');
Route::get('/flash-sales/{flashSale}/items', [\App\Http\Controllers\Admin\FlashSaleController::class, 'showItems'])->name('flash-sales.items');
Route::post('/flash-sales/{flashSale}/items', [\App\Http\Controllers\Admin\FlashSaleController::class, 'storeItem'])->name('flash-sales.items.store');
Route::put('/flash-sales/items/{flashSaleItem}', [\App\Http\Controllers\Admin\FlashSaleController::class, 'updateItem'])->name('flash-sales.items.update');
Route::delete('/flash-sales/items/{flashSaleItem}', [\App\Http\Controllers\Admin\FlashSaleController::class, 'destroyItem'])->name('flash-sales.items.destroy');
Route::get('/flash-sales/items/{flashSaleItem}/data', [\App\Http\Controllers\Admin\FlashSaleController::class, 'getItemData'])->name('flash-sales.items.data');
// Pesanan routes
Route::get('pesanan/cetak-resi/{pesanan}', [\App\Http\Controllers\Admin\PesananController::class, 'cetakResi'])->name('pesanan.cetak-resi');
});
Route::delete('/pesanan/{pesanan}', [PesananController::class, 'destroy'])->name('pesanan.destroy');
// Route untuk Midtrans
Route::post('/transaksi/create/{pesanan}', [TransaksiController::class, 'create'])->name('transaksi.create');
Route::post('/transaksi/get-snap-token/{pesanan}', [TransaksiController::class, 'getSnapToken'])->name('transaksi.get-snap-token');
Route::post('/transaksi/callback', [TransaksiController::class, 'callback'])->name('transaksi.callback');
Route::get('/transaksi/finish', [TransaksiController::class, 'finish'])->name('transaksi.finish');
Route::get('/transaksi/unfinish', [TransaksiController::class, 'unfinish'])->name('transaksi.unfinish');
Route::get('/transaksi/error', [TransaksiController::class, 'error'])->name('transaksi.error');
Route::post('/transaksi/update-status', [TransaksiController::class, 'updateStatus'])->name('transaksi.update-status');
// Email Verification Routes
Route::get('/email/verify', [App\Http\Controllers\Auth\VerificationController::class, 'show'])
->middleware('auth')
->name('verification.notice');
Route::get('/email/verify/{token}', [App\Http\Controllers\Auth\VerificationController::class, 'verify'])
->name('verification.verify');
Route::post('/email/verification-notification', [App\Http\Controllers\Auth\VerificationController::class, 'resend'])
->middleware(['auth', 'throttle:6,1'])
->name('verification.send');
// Location Routes
Route::get('/provinces', [LocationController::class, 'getProvinces'])->name('provinces');
Route::get('/cities', [LocationController::class, 'getCities'])->name('cities');
Route::post('/calculate-cost', [LocationController::class, 'calculateCost'])->name('calculate-cost');
// Layanan Pelanggan Routes
Route::get('/bantuan', function () {
return view('layanan.bantuan');
})->name('bantuan');
Route::get('/cara-pembelian', function () {
return view('layanan.cara-pembelian');
})->name('cara-pembelian');
Route::get('/pengiriman', function () {
return view('layanan.pengiriman');
})->name('pengiriman');
Route::get('/barang', [BarangController::class, 'index'])->name('barang.index');