From 9741c82667dd0672bcc371d192cc19e0887586d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=2E=20Nagy=20Gerg=C5=91?= Date: Sat, 6 Jan 2024 10:49:15 +0100 Subject: [PATCH] wip --- routes/web.php | 19 +++++----- src/Fields/Relation.php | 2 ++ src/Http/Controllers/RelationController.php | 4 --- src/Resources/Resource.php | 6 ++++ src/Traits/MapsAbilities.php | 40 +++++++++++++++++++++ 5 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 src/Traits/MapsAbilities.php diff --git a/routes/web.php b/routes/web.php index f61bcd03..17dd7d97 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,20 +2,17 @@ use Cone\Root\Http\Controllers\DashboardController; use Cone\Root\Http\Controllers\ResourceController; -use Cone\Root\Http\Middleware\Authorize; use Illuminate\Support\Facades\Route; // Dashboard Route::get('/', DashboardController::class)->name('dashboard'); // Resource -Route::middleware([Authorize::class.':_resource'])->group(static function (): void { - Route::get('/{resource}', [ResourceController::class, 'index'])->name('resource.index'); - Route::get('/{resource}/create', [ResourceController::class, 'create'])->name('resource.create'); - Route::post('/{resource}', [ResourceController::class, 'store'])->name('resource.store'); - Route::get('/{resource}/{resourceModel}', [ResourceController::class, 'show'])->name('resource.show'); - Route::get('/{resource}/{resourceModel}/edit', [ResourceController::class, 'edit'])->name('resource.edit'); - Route::patch('/{resource}/{resourceModel}', [ResourceController::class, 'update'])->name('resource.update'); - Route::delete('/{resource}/{resourceModel}', [ResourceController::class, 'destroy'])->name('resource.delete'); - Route::post('/{resource}/{resourceModel}/restore', [ResourceController::class, 'restore'])->name('resource.restore'); -}); +Route::get('/{resource}', [ResourceController::class, 'index'])->name('resource.index'); +Route::get('/{resource}/create', [ResourceController::class, 'create'])->name('resource.create'); +Route::post('/{resource}', [ResourceController::class, 'store'])->name('resource.store'); +Route::get('/{resource}/{resourceModel}', [ResourceController::class, 'show'])->name('resource.show'); +Route::get('/{resource}/{resourceModel}/edit', [ResourceController::class, 'edit'])->name('resource.edit'); +Route::patch('/{resource}/{resourceModel}', [ResourceController::class, 'update'])->name('resource.update'); +Route::delete('/{resource}/{resourceModel}', [ResourceController::class, 'destroy'])->name('resource.delete'); +Route::post('/{resource}/{resourceModel}/restore', [ResourceController::class, 'restore'])->name('resource.restore'); diff --git a/src/Fields/Relation.php b/src/Fields/Relation.php index 0d1bf8ab..b41a2ea8 100644 --- a/src/Fields/Relation.php +++ b/src/Fields/Relation.php @@ -12,6 +12,7 @@ use Cone\Root\Interfaces\Form; use Cone\Root\Root; use Cone\Root\Traits\AsForm; +use Cone\Root\Traits\MapsAbilities; use Cone\Root\Traits\RegistersRoutes; use Cone\Root\Traits\ResolvesActions; use Cone\Root\Traits\ResolvesFields; @@ -29,6 +30,7 @@ abstract class Relation extends Field implements Form { use AsForm; + use MapsAbilities; use RegistersRoutes { RegistersRoutes::registerRoutes as __registerRoutes; } diff --git a/src/Http/Controllers/RelationController.php b/src/Http/Controllers/RelationController.php index 8351d5ae..d6de839f 100644 --- a/src/Http/Controllers/RelationController.php +++ b/src/Http/Controllers/RelationController.php @@ -20,10 +20,6 @@ public function index(Request $request, Model $model): Response { $field = $request->route('field'); - // if ($field->getPolicy()) { - // $this->authorize('viewAny', $field->getModel()); - // } - $data = $field->toIndex($request, $model); return ResponseFactory::view( diff --git a/src/Resources/Resource.php b/src/Resources/Resource.php index 3c436dc7..c3363239 100644 --- a/src/Resources/Resource.php +++ b/src/Resources/Resource.php @@ -15,6 +15,7 @@ use Cone\Root\Root; use Cone\Root\Traits\AsForm; use Cone\Root\Traits\Authorizable; +use Cone\Root\Traits\MapsAbilities; use Cone\Root\Traits\RegistersRoutes; use Cone\Root\Traits\ResolvesActions; use Cone\Root\Traits\ResolvesFilters; @@ -38,6 +39,7 @@ abstract class Resource implements Arrayable, Form { use AsForm; use Authorizable; + use MapsAbilities; use RegistersRoutes { RegistersRoutes::registerRoutes as __registerRoutes; RegistersRoutes::routeMatched as __routeMatched; @@ -415,6 +417,10 @@ public function routeMatched(RouteMatched $event): void { $event->route->defaults('resource', $this->getKey()); + $event->route->getController()->middleware( + $this->getRouteMiddleware() + ); + $this->__routeMatched($event); } diff --git a/src/Traits/MapsAbilities.php b/src/Traits/MapsAbilities.php new file mode 100644 index 00000000..272e1e6b --- /dev/null +++ b/src/Traits/MapsAbilities.php @@ -0,0 +1,40 @@ + function (Request $request): bool { + return is_null($this->getPolicy()) || Gate::allows('viewAny', $this->getModel()); + }, + 'create' => function (Request $request): bool { + return is_null($this->getPolicy()) || Gate::allows('create', $this->getModel()); + }, + 'view' => function (Request $request, Model $model): bool { + return is_null($this->getPolicy()) || Gate::allows('view', $model); + }, + 'update' => function (Request $request, Model $model): bool { + return is_null($this->getPolicy()) || Gate::allows('update', $model); + }, + 'delete' => function (Request $request, Model $model): bool { + return is_null($this->getPolicy()) || Gate::allows('delete', $model); + }, + 'forceDelete' => function (Request $request, Model $model): bool { + return is_null($this->getPolicy()) || Gate::allows('delete', $model); + }, + 'restore' => function (Request $request, Model $model): bool { + return is_null($this->getPolicy()) || Gate::allows('delete', $model); + }, + ]; + } +}