resourceHasAbilities()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
cc 2
nc 2
nop 1
1
<?php
2
3
namespace BBSLab\NovaPermission\Actions;
4
5
use BBSLab\NovaPermission\Contracts\HasAbilities;
6
use Laravel\Nova\Nova;
7
use Spatie\Permission\PermissionRegistrar;
8
9
class GenerateResourcePermissionsAction
10
{
11
    public function execute()
12
    {
13
        $guard = config('nova.guard') ?? config('auth.defaults.guard');
14
15
        Nova::resourcesIn(app_path('Nova'));
16
17
        /** @var \BBSLab\NovaPermission\Contracts\Permission $permissionModel */
18
        $permissionModel = app(PermissionRegistrar::class)->getPermissionClass();
19
20
        collect(Nova::$resources)->filter(function ($resource) {
21
            return $this->resourceIsNotExcluded($resource) && $this->resourceHasAbilities($resource);
22
        })->each(function ($resource) use ($guard, $permissionModel) {
23
            $group = class_basename($resource);
24
25
            foreach ($resource::$permissionsForAbilities as $ability => $permission) {
26
                $permissionModel->newQuery()->firstOrCreate([
27
                    'name' => $permission,
28
                    'group' => $group,
29
                    'guard_name' => $guard,
30
                ]);
31
            }
32
        });
33
34
        $permissionModel->forgetCachedPermissions();
35
    }
36
37
    protected function resourceIsNotExcluded(string $resource): bool
38
    {
39
        return ! in_array($resource, config('nova-permission.generate_without_resources', []));
40
    }
41
42
    protected function resourceHasAbilities(string $resource): bool
43
    {
44
        $resource = Nova::resourceInstanceForKey($resource::uriKey());
45
46
        if ($resource instanceof HasAbilities) {
47
            return $resource::hasAbilities();
48
        }
49
50
        return false;
51
    }
52
}
53