Completed
Pull Request — master (#23)
by ARCANEDEV
08:27
created

Permission::attachRole()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 7
cts 7
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 2
crap 2
1
<?php namespace Arcanedev\LaravelAuth\Models;
2
3
use Arcanedev\LaravelAuth\Events\Permissions\AttachedRoleToPermission;
4
use Arcanedev\LaravelAuth\Events\Permissions\AttachingRoleToPermission;
5
use Arcanedev\LaravelAuth\Events\Permissions\DetachedAllRolesFromPermission;
6
use Arcanedev\LaravelAuth\Events\Permissions\DetachedRoleFromPermission;
7
use Arcanedev\LaravelAuth\Events\Permissions\DetachingAllRolesFromPermission;
8
use Arcanedev\LaravelAuth\Events\Permissions\DetachingRoleFromPermission;
9
use Arcanedev\LaravelAuth\Events\Permissions\SyncedRolesWithPermission;
10
use Arcanedev\LaravelAuth\Events\Permissions\SyncingRolesWithPermission;
11
use Arcanedev\LaravelAuth\Models\Traits\AuthRoleTrait;
12
use Arcanesoft\Contracts\Auth\Models\Permission as PermissionContract;
13
use Arcanesoft\Contracts\Auth\Models\Role as RoleContract;
14
use Illuminate\Support\Str;
15
16
/**
17
 * Class     Permission
18
 *
19
 * @package  Arcanedev\LaravelAuth\Models
20
 * @author   ARCANEDEV <[email protected]>
21
 *
22
 * @property  int                                            id
23
 * @property  int                                            group_id
24
 * @property  string                                         name
25
 * @property  string                                         slug
26
 * @property  string                                         description
27
 * @property  \Carbon\Carbon                                 created_at
28
 * @property  \Carbon\Carbon                                 updated_at
29
 *
30
 * @property  \Illuminate\Database\Eloquent\Collection             roles
31
 * @property  \Arcanedev\LaravelAuth\Models\PermissionsGroup       group
32
 * @property  \Arcanedev\LaravelAuth\Models\Pivots\PermissionRole  pivot
33
 */
34
class Permission extends AbstractModel implements PermissionContract
35
{
36
    /* -----------------------------------------------------------------
37
     |  Traits
38
     | -----------------------------------------------------------------
39
     */
40
    use AuthRoleTrait;
41
42
    /* -----------------------------------------------------------------
43
     |  Properties
44
     | -----------------------------------------------------------------
45
     */
46
    /**
47
     * The attributes that are mass assignable.
48
     *
49
     * @var array
50
     */
51
    protected $fillable = ['group_id', 'name', 'slug', 'description'];
52
53
    /* -----------------------------------------------------------------
54
     |  Constructor
55
     | -----------------------------------------------------------------
56
     */
57
    /**
58
     * Create a new Eloquent model instance.
59
     *
60
     * @param  array  $attributes
61
     */
62 225
    public function __construct(array $attributes = [])
63
    {
64 225
        $this->setTable(config('laravel-auth.permissions.table', 'permissions'));
65
66 225
        parent::__construct($attributes);
67 225
    }
68
69
    /* -----------------------------------------------------------------
70
     |  Relationships
71
     | -----------------------------------------------------------------
72
     */
73
    /**
74
     * Permission belongs to one group.
75
     *
76
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
77
     */
78 3
    public function group()
79
    {
80 3
        return $this->belongsTo(
81 3
            config('laravel-auth.permissions-groups.model', PermissionsGroup::class),
82 3
            'group_id'
83
        );
84
    }
85
86
    /**
87
     * Permission belongs to many roles.
88
     *
89
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
90
     */
91 27
    public function roles()
92
    {
93
        return $this
94 27
            ->belongsToMany(
95 27
                config('laravel-auth.roles.model', Role::class),
96 27
                $this->getPrefix().'permission_role'
97
            )
98 27
            ->withTimestamps();
99
    }
100
101
    /* -----------------------------------------------------------------
102
     |  Setters & Getters
103
     | -----------------------------------------------------------------
104
     */
105
    /**
106
     * Set the slug attribute.
107
     *
108
     * @param  string  $slug
109
     */
110 90
    public function setSlugAttribute($slug)
111
    {
112 90
        $this->attributes['slug'] = $this->slugify($slug);
113 90
    }
114
115
    /* -----------------------------------------------------------------
116
     |  Main Methods
117
     | -----------------------------------------------------------------
118
     */
119
    /**
120
     * Attach a role to a user.
121
     *
122
     * @param  \Arcanesoft\Contracts\Auth\Models\Role|int  $role
123
     * @param  bool                                        $reload
124
     */
125 18
    public function attachRole($role, $reload = true)
126
    {
127 18
        if ($this->hasRole($role)) return;
128
129 18
        event(new AttachingRoleToPermission($this, $role));
130 18
        $this->roles()->attach($role);
131 18
        event(new AttachedRoleToPermission($this, $role));
0 ignored issues
show
Bug introduced by
It seems like $role defined by parameter $role on line 125 can also be of type integer; however, Arcanedev\LaravelAuth\Ev...rmission::__construct() does only seem to accept object<Arcanesoft\Contracts\Auth\Models\Role>, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
132
133 18
        $this->loadRoles($reload);
134 18
    }
135
136
    /**
137
     * Sync the roles by its slugs.
138
     *
139
     * @param  array|\Illuminate\Support\Collection  $slugs
140
     * @param  bool                                  $reload
141
     *
142
     * @return array
143
     */
144 3
    public function syncRoles($slugs, $reload = true)
145
    {
146
        /** @var \Illuminate\Database\Eloquent\Collection $roles */
147 3
        $roles = app(RoleContract::class)->whereIn('slug', $slugs)->get();
148
149 3
        event(new SyncingRolesWithPermission($this, $roles));
150 3
        $synced = $this->roles()->sync($roles->pluck('id'));
151 3
        event(new SyncedRolesWithPermission($this, $roles, $synced));
152
153 3
        $this->loadRoles($reload);
154
155 3
        return $synced;
156
    }
157
158
    /**
159
     * Detach a role from a user.
160
     *
161
     * @param  \Arcanesoft\Contracts\Auth\Models\Role|int  $role
162
     * @param  bool                                        $reload
163
     *
164
     * @return int
165
     */
166 3
    public function detachRole($role, $reload = true)
167
    {
168 3
        event(new DetachingRoleFromPermission($this, $role));
169 3
        $results = $this->roles()->detach($role);
170 3
        event(new DetachedRoleFromPermission($this, $role, $results));
171
172 3
        $this->loadRoles($reload);
173
174 3
        return $results;
175
    }
176
177
    /**
178
     * Detach all roles from a user.
179
     *
180
     * @param  bool  $reload
181
     *
182
     * @return int
183
     */
184 3
    public function detachAllRoles($reload = true)
185
    {
186 3
        event(new DetachingAllRolesFromPermission($this));
187 3
        $results = $this->roles()->detach();
188 3
        event(new DetachedAllRolesFromPermission($this, $results));
189
190 3
        $this->loadRoles($reload);
191
192 3
        return $results;
193
    }
194
195
    /* -----------------------------------------------------------------
196
     |  Check Methods
197
     | -----------------------------------------------------------------
198
     */
199
    /**
200
     * Check if the permission has the same slug.
201
     *
202
     * @param  string  $slug
203
     *
204
     * @return bool
205
     */
206 18
    public function hasSlug($slug)
207
    {
208 18
        return $this->slug === $this->slugify($slug);
209
    }
210
211
    /* -----------------------------------------------------------------
212
     |  Other Functions
213
     | -----------------------------------------------------------------
214
     */
215
    /**
216
     * Slugify the value.
217
     *
218
     * @param  string  $value
219
     *
220
     * @return string
221
     */
222 90
    protected function slugify($value)
223
    {
224 90
        return Str::slug($value, config('laravel-auth.permissions.slug-separator', '.'));
225
    }
226
}
227