diff --git a/app/Http/Middleware/CheckAdmin.php b/app/Http/Middleware/CheckAdmin.php new file mode 100644 index 0000000..d3c6ab8 --- /dev/null +++ b/app/Http/Middleware/CheckAdmin.php @@ -0,0 +1,19 @@ +check() && auth()->user()->role === 'admin') { + return $next($request); + } + + abort(403, 'No tienes permiso para entrar aquí.'); + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index c183276..01ddb97 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -12,6 +12,9 @@ return Application::configure(basePath: dirname(__DIR__)) ) ->withMiddleware(function (Middleware $middleware): void { // + $middleware->alias([ + 'admin' => \App\Http\Middleware\CheckAdmin::class, + ]); }) ->withExceptions(function (Exceptions $exceptions): void { // diff --git a/resources/views/productos/index.blade.php b/resources/views/productos/index.blade.php index 04e37b6..11efe83 100644 --- a/resources/views/productos/index.blade.php +++ b/resources/views/productos/index.blade.php @@ -1,5 +1,5 @@ - + @@ -7,25 +7,28 @@
- + -
- + +
-
-
- - - - + + +
- @if(request('search') || request('type') || request('stock_status')) + @if (request('search') || request('type') || request('stock_status')) @@ -65,7 +73,8 @@ -
+ + Nuevo Producto
@@ -73,7 +82,8 @@
- + @@ -84,61 +94,108 @@ @forelse($products as $product) - - - - - - + + + + - + + + @php + $isAdmin = auth()->user()?->role === 'admin'; + $classes = $isAdmin + ? 'text-blue-800 border-blue-800 hover:bg-blue-800 hover:text-white' + : 'border-black-400 text-black-400 opacity-50 cursor-not-allowed dark:border-gray-400 dark:text-gray-400'; + @endphp + + + + + + @if (auth()->user()?->role === 'admin') + + @csrf + @method('DELETE') + + + @else + + @endif + + @empty - - - + + + @endforelse
Producto Tipo
-
{{ $product->name }}
-
{{ $product->sku ?? 'Sin SKU' }}
-
- @if($product->type === 'bike') Bicicleta - @elseif($product->type === 'clothing') Indumentaria - @elseif($product->type === 'spare') Repuesto - @elseif($product->type === 'children') Infantil - @elseif($product->type === 'rollers') Rollers - @elseif($product->type === 'skate') Skate - @else Accesorio / Otro @endif - - ${{ number_format($product->price, 2) }} - - @if($product->stock_quantity < $product->min_stock_alert) - {{ $product->stock_quantity }} - @elseif($product->stock_quantity <= $product->min_stock_alert+5) - {{ $product->stock_quantity }} - @else - {{ $product->stock_quantity }} - @endif - - - - - - - -
- @csrf - @method('DELETE') -
+ @if ($product->type === 'bike') + Bicicleta + @elseif($product->type === 'clothing') + Indumentaria + @elseif($product->type === 'spare') + Repuesto + @elseif($product->type === 'children') + Infantil + @elseif($product->type === 'rollers') + Rollers + @elseif($product->type === 'skate') + Skate + @else + Accesorio / Otro + @endif + + ${{ number_format($product->price, 2) }} + + @if ($product->stock_quantity < $product->min_stock_alert) + {{ $product->stock_quantity }} + @elseif($product->stock_quantity <= $product->min_stock_alert + 5) + {{ $product->stock_quantity }} + @else + {{ $product->stock_quantity }} + @endif + + + - - -
- No se encontraron productos. -
+ No se encontraron productos. +
@@ -148,4 +205,4 @@
{{ $products->links() }}
- \ No newline at end of file + diff --git a/routes/web.php b/routes/web.php index 2fcbc18..44a06e5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -16,41 +16,51 @@ use App\Models\Product; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; -Route::get('/',HomeController::class); - -// Route::get('/catalogo', [CatalogoController::class,'catalogo'])->name('catalogo'); +// --- RUTAS PÚBLICAS (Cualquiera accede) --- +Route::get('/', HomeController::class); Route::resource('catalogo', CatalogoController::class)->only(['index', 'show'])->parameters(['catalogo' => 'product']); Route::get('login', function(){ return view('login'); })->name('login'); Route::post('login', LoginController::class)->middleware('throttle:5,1')->name('login.attempt'); - Route::view('register', 'register')->name('register'); Route::post('register', RegisterController::class)->name('register.store'); Route::post('logout', function(){ Auth::guard('web')->logout(); - Session::invalidate(); Session::regenerateToken(); - return redirect('/'); })->name('logout'); + +// --- RUTAS PROTEGIDAS (Requieren Login) --- Route::middleware(['auth'])->group(function () { Route::view('dashboard', 'dashboard')->name('dashboard'); Route::resource('clients', ClientController::class); - Route::resource('productos', ProductosController::class)->parameters([ - 'productos' => 'product' - ]); Route::resource('sales', SaleController::class)->only(['index', 'create', 'store', 'show']); - // Rutas de Taller + Route::get('/agenda', [AgendaController::class, 'index'])->name('agenda'); + Route::get('/appointments/{appointment}', [AppointmentController::class, 'show'])->name('appointments.show'); + + // Taller Route::controller(TallerController::class)->prefix('taller')->name('taller.')->group(function () { Route::get('/', 'index')->name('index'); Route::get('/create', 'create')->name('create'); Route::post('/', 'store')->name('store'); Route::patch('/{appointment}/status', 'updateStatus')->name('updateStatus'); }); - Route::get('/agenda', [AgendaController::class, 'index'])->name('agenda'); - Route::get('/appointments/{appointment}', [AppointmentController::class, 'show']) - ->name('appointments.show'); + + // Productos: Rutas de lectura para cualquier usuario logueado + Route::resource('productos', ProductosController::class) + ->only(['index', 'show']) + ->parameters(['productos' => 'product']); + + // --- RUTAS DE ADMINISTRADOR (Solo Admin) --- + Route::middleware(['admin'])->group(function () { + // Solo el admin puede crear, editar o borrar productos + Route::resource('productos', ProductosController::class) + ->only(['create', 'store', 'edit', 'update', 'destroy']) + ->parameters(['productos' => 'product']); + + // Si tienes más cosas de admin (ej: reportes), van aquí + }); });