Skip to content

Commit

Permalink
authorization wip
Browse files Browse the repository at this point in the history
  • Loading branch information
iamgergo committed Jan 22, 2024
1 parent 36d968e commit 8e145e1
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 62 deletions.
4 changes: 2 additions & 2 deletions resources/views/resources/form.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@
<button type="submit" class="btn btn--primary" form="{{ $key }}">{{ __('Save') }}</button>
<a href="{{ $action }}" class="btn btn--light">{{ __('Cancel') }}</a>
</div>
@can('delete', $model)
@if($abilities['delete'])
<div class="app-actions__column">
<form method="POST" action="{{ $action }}" onsubmit="return window.confirm('{{ __('Are you sure?') }}');">
@csrf
@method('DELETE')
<button type="submit" class="btn btn--delete">{{ __('Delete') }}</button>
</form>
</div>
@endcan
@endif
</div>
@endsection
4 changes: 2 additions & 2 deletions resources/views/resources/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@

{{-- Actions --}}
@section('actions')
@can('create', $model)
@if($abilities['create'])
<a href="{{ $url }}/create" class="btn btn--primary btn--icon">
<x-root::icon name="plus" class="btn__icon" />
{{ __('Add :resource', ['resource' => $modelName]) }}
</a>
@endcan
@endif
@endsection

{{-- Content --}}
Expand Down
4 changes: 2 additions & 2 deletions resources/views/resources/show.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@

{{-- Actions --}}
@section('actions')
@can('update', $model)
@if($abilities['update'])
<a href="{{ $action }}/edit" class="btn btn--primary btn--icon">
<x-root::icon name="edit" class="btn__icon" />
{{ __('Edit') }}
</a>
@endcan
@endif
@endsection

{{-- Content --}}
Expand Down
12 changes: 6 additions & 6 deletions resources/views/table/body.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,25 +48,25 @@ class="form-check__control"
@endforeach
<td>
<div class="data-table__actions">
@can('view', $row['model'])
@if($row['abilities']['view'])
<a href="{{ $row['url'] }}" class="btn btn--light btn--sm btn--icon" aria-label="{{ __('View') }}" data-turbo-frame="_top">
<x-root::icon name="eye" class="btn__icon" />
</a>
@endcan
@can('update', $row['model'])
@endif
@if($row['abilities']['update'])
<a href="{{ $row['url'] }}/edit" class="btn btn--light btn--sm btn--icon" aria-label="{{ __('Edit') }}" data-turbo-frame="_top">
<x-root::icon name="edit" class="btn__icon" />
</a>
@endcan
@can('delete', $row['model'])
@endif
@if($row['abilities']['delete'])
<form action="{{ $row['url'] }}" method="POST" onsubmit="return window.confirm('{{ __('Are you sure?') }}');">
@csrf
@method('DELETE')
<button type="submit" class="btn btn--delete btn--sm btn--icon" aria-label="{{ __('Delete') }}">
<x-root::icon name="trash" class="btn__icon" />
</button>
</form>
@endcan
@endif
</div>
</td>
</tr>
Expand Down
2 changes: 0 additions & 2 deletions src/Fields/Relation.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
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;
Expand All @@ -33,7 +32,6 @@
abstract class Relation extends Field implements Form
{
use AsForm;
use MapsAbilities;
use RegistersRoutes {
RegistersRoutes::registerRoutes as __registerRoutes;
}
Expand Down
82 changes: 50 additions & 32 deletions src/Resources/Resource.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
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;
Expand All @@ -39,7 +38,6 @@ abstract class Resource implements Arrayable, Form
{
use AsForm;
use Authorizable;
use MapsAbilities;
use RegistersRoutes {
RegistersRoutes::registerRoutes as __registerRoutes;
RegistersRoutes::routeMatched as __routeMatched;
Expand Down Expand Up @@ -172,32 +170,37 @@ public function getPolicy(): mixed
}

/**
* Map the resource abilities.
* Resolve the ability.
*/
public function mapAbilities(): array
public function resolveAbility(string $ability, Request $request, Model $model, ...$arguments): bool
{
$policy = $this->getPolicy();

return is_null($policy) || $request->user()->can($ability, $model, ...$arguments);
}

/**
* Map the resource level abilities.
*/
public function mapResourceAbilities(Request $request): array
{
return [
'viewAny' => $this->resolveAbility('viewAny', $request, $this->getModelInstance()),
'create' => $this->resolveAbility('create', $request, $this->getModelInstance()),
];
}

/**
* Map the model level abilities.
*/
public function mapModelAbilities(Request $request, Model $model): array
{
return [
'viewAny' => 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);
},
'view' => $this->resolveAbility('view', $request, $model),
'update' => $this->resolveAbility('update', $request, $model),
'restore' => $this->resolveAbility('restore', $request, $model),
'delete' => $this->resolveAbility('delete', $request, $model),
'forceDelete' => $this->resolveAbility('forceDelete', $request, $model),
];
}

Expand Down Expand Up @@ -386,6 +389,7 @@ public function paginate(Request $request): LengthAwarePaginator
'id' => $model->getKey(),
'url' => $this->modelUrl($model),
'model' => $model,
'abilities' => $this->mapModelAbilities($request, $model),
'fields' => $this->resolveFields($request)
->subResource(false)
->authorized($request, $model)
Expand Down Expand Up @@ -447,9 +451,13 @@ public function routeMatched(RouteMatched $event): void
{
$event->route->defaults('resource', $this->getKey());

$event->route->getController()->middleware(
$this->getRouteMiddleware()
);
$controller = $event->route->getController();

$controller->middleware($this->getRouteMiddleware());

if ($this->getPolicy()) {
$controller->authorizeResource($this->getModel(), 'resourceModel');
}

$this->__routeMatched($event);
}
Expand Down Expand Up @@ -479,9 +487,9 @@ public function toIndex(Request $request): array
'template' => 'root::resources.index',
'title' => $this->getName(),
'actions' => $this->resolveActions($request)
->authorized($request, $this->getModelInstance())
->authorized($request, $model = $this->getModelInstance())
->visible('index')
->mapToForms($request, $this->getModelInstance()),
->mapToForms($request, $model),
'data' => $this->paginate($request),
'widgets' => $this->resolveWidgets($request)
->authorized($request)
Expand All @@ -493,12 +501,13 @@ public function toIndex(Request $request): array
'filters' => $this->resolveFilters($request)
->authorized($request)
->renderable()
->map(function (RenderableFilter $filter) use ($request): array {
return $filter->toField()->toInput($request, $this->getModelInstance());
->map(function (RenderableFilter $filter) use ($request, $model): array {
return $filter->toField()->toInput($request, $model);
})
->all(),
'activeFilters' => $this->resolveFilters($request)->active($request)->count(),
'url' => $this->getUri(),
'abilities' => $this->mapResourceAbilities($request),
]);
}

Expand All @@ -518,6 +527,7 @@ public function toCreate(Request $request): array
->authorized($request, $model)
->visible('create')
->mapToInputs($request, $model),
'abilities' => $this->mapResourceAbilities($request),
]);
}

Expand Down Expand Up @@ -552,6 +562,10 @@ public function toShow(Request $request, Model $model): array
'url' => trim(sprintf('%s?%s', $relation->modelUrl($model), $request->getQueryString()), '?'),
]);
}),
'abilities' => array_merge(
$this->mapResourceAbilities($request),
$this->mapModelAbilities($request, $model)
),
]);
}

Expand All @@ -571,6 +585,10 @@ public function toEdit(Request $request, Model $model): array
->authorized($request, $model)
->visible('update')
->mapToInputs($request, $model),
'abilities' => array_merge(
$this->mapResourceAbilities($request),
$this->mapModelAbilities($request, $model)
),
]);
}
}
16 changes: 0 additions & 16 deletions src/Traits/MapsAbilities.php

This file was deleted.

0 comments on commit 8e145e1

Please sign in to comment.