Completed
Pull Request — master (#1484)
by
unknown
01:19
created

Permission   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 139
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 5

Importance

Changes 0
Metric Value
dl 0
loc 139
rs 10
c 0
b 0
f 0
wmc 13
lcom 2
cbo 5

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A create() 0 12 2
A roles() 0 9 1
A findOrCreate() 0 11 2
A users() 0 10 1
A findByName() 0 10 2
A findById() 0 11 2
A getPermission() 0 6 1
A getPermissions() 0 6 1
1
<?php
2
3
namespace Spatie\Permission\Models;
4
5
use Spatie\Permission\Guard;
6
use Illuminate\Support\Collection;
7
use Spatie\Permission\Traits\HasRoles;
8
use Illuminate\Database\Eloquent\Model;
9
use Spatie\Permission\PermissionRegistrar;
10
use Spatie\Permission\Traits\RefreshesPermissionCache;
11
use Illuminate\Database\Eloquent\Relations\MorphToMany;
12
use Spatie\Permission\Exceptions\PermissionDoesNotExist;
13
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
14
use Spatie\Permission\Exceptions\PermissionAlreadyExists;
15
use Spatie\Permission\Contracts\Permission as PermissionContract;
16
17
class Permission extends Model implements PermissionContract
18
{
19
    use HasRoles;
20
    use RefreshesPermissionCache;
21
22
    protected $guarded = ['id'];
23
24
    public function __construct(array $attributes = [])
25
    {
26
        $attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard');
27
28
        parent::__construct($attributes);
29
30
        $this->setTable(config('permission.table_names.permissions'));
31
    }
32
33
    public static function create(array $attributes = [])
34
    {
35
        $attributes['guard_name'] = $attributes['guard_name'] ?? Guard::getDefaultName(static::class);
36
37
        $permission = static::getPermission(['name' => $attributes['name'], 'guard_name' => $attributes['guard_name']]);
38
39
        if ($permission) {
40
            throw PermissionAlreadyExists::create($attributes['name'], $attributes['guard_name']);
41
        }
42
43
        return static::query()->create($attributes);
44
    }
45
46
    /**
47
     * A permission can be applied to roles.
48
     */
49
    public function roles(): BelongsToMany
50
    {
51
        return $this->belongsToMany(
52
            config('permission.models.role'),
53
            config('permission.table_names.role_has_permissions'),
54
            'permission_id',
55
            'role_id'
56
        );
57
    }
58
59
    /**
60
     * A permission belongs to some users of the model associated with its guard.
61
     */
62
    public function users(): MorphToMany
63
    {
64
        return $this->morphedByMany(
65
            getModelForGuard($this->attributes['guard_name']),
66
            'model',
67
            config('permission.table_names.model_has_permissions'),
68
            'permission_id',
69
            config('permission.column_names.model_morph_key')
70
        );
71
    }
72
73
    /**
74
     * Find a permission by its name (and optionally guardName).
75
     *
76
     * @param string $name
77
     * @param string|null $guardName
78
     *
79
     * @throws \Spatie\Permission\Exceptions\PermissionDoesNotExist
80
     *
81
     * @return \Spatie\Permission\Contracts\Permission
82
     */
83
    public static function findByName(string $name, $guardName = null): PermissionContract
84
    {
85
        $guardName = $guardName ?? Guard::getDefaultName(static::class);
86
        $permission = static::getPermission(['name' => $name, 'guard_name' => $guardName]);
87
        if (! $permission) {
88
            throw PermissionDoesNotExist::create($name, $guardName);
89
        }
90
91
        return $permission;
92
    }
93
94
    /**
95
     * Find a permission by its id (and optionally guardName).
96
     *
97
     * @param int $id
98
     * @param string|null $guardName
99
     *
100
     * @throws \Spatie\Permission\Exceptions\PermissionDoesNotExist
101
     *
102
     * @return \Spatie\Permission\Contracts\Permission
103
     */
104
    public static function findById(int $id, $guardName = null): PermissionContract
105
    {
106
        $guardName = $guardName ?? Guard::getDefaultName(static::class);
107
        $permission = static::getPermission(['id' => $id, 'guard_name' => $guardName]);
108
109
        if (! $permission) {
110
            throw PermissionDoesNotExist::withId($id, $guardName);
111
        }
112
113
        return $permission;
114
    }
115
116
    /**
117
     * Find or create permission by its name (and optionally guardName).
118
     *
119
     * @param string $name
120
     * @param string|null $guardName
121
     *
122
     * @return \Spatie\Permission\Contracts\Permission
123
     */
124
    public static function findOrCreate(string $name, $guardName = null): PermissionContract
125
    {
126
        $guardName = $guardName ?? Guard::getDefaultName(static::class);
127
        $permission = static::getPermission(['name' => $name, 'guard_name' => $guardName]);
128
129
        if (! $permission) {
130
            return static::query()->create(['name' => $name, 'guard_name' => $guardName]);
131
        }
132
133
        return $permission;
134
    }
135
136
    /**
137
     * Get a cached permission.
138
     */
139
    protected static function getPermission(array $params): ?PermissionContract
140
    {
141
        return app(PermissionRegistrar::class)
142
            ->setPermissionClass(static::class)
143
            ->getPermission($params);
144
    }
145
146
    /**
147
     * Get the current cached permissions.
148
     */
149
    protected static function getPermissions(array $params = []): Collection
150
    {
151
        return app(PermissionRegistrar::class)
152
            ->setPermissionClass(static::class)
153
            ->getPermissions($params);
154
    }
155
}
156