mostafamaklad /
laravel-permission-mongodb
| 1 | <?php |
||||
| 2 | |||||
| 3 | namespace Maklad\Permission\Traits; |
||||
| 4 | |||||
| 5 | use Illuminate\Support\Collection; |
||||
| 6 | use Jenssegers\Mongodb\Eloquent\Builder; |
||||
| 7 | use Jenssegers\Mongodb\Eloquent\Model; |
||||
| 8 | use Maklad\Permission\Contracts\RoleInterface as Role; |
||||
| 9 | use Maklad\Permission\Helpers; |
||||
| 10 | use Maklad\Permission\PermissionRegistrar; |
||||
| 11 | use ReflectionException; |
||||
| 12 | |||||
| 13 | /** |
||||
| 14 | * Trait HasRoles |
||||
| 15 | * @package Maklad\Permission\Traits |
||||
| 16 | */ |
||||
| 17 | trait HasRoles |
||||
| 18 | { |
||||
| 19 | use HasPermissions; |
||||
| 20 | |||||
| 21 | private $roleClass; |
||||
| 22 | 123 | ||||
| 23 | 5 | public static function bootHasRoles() |
|||
| 24 | 2 | { |
|||
| 25 | static::deleting(function (Model $model) { |
||||
| 26 | if (isset($model->forceDeleting) && !$model->forceDeleting) { |
||||
|
0 ignored issues
–
show
|
|||||
| 27 | 3 | return; |
|||
| 28 | 123 | } |
|||
| 29 | 123 | ||||
| 30 | $model->roles()->sync([]); |
||||
| 31 | }); |
||||
| 32 | } |
||||
| 33 | |||||
| 34 | 69 | public function getRoleClass() |
|||
| 35 | { |
||||
| 36 | 69 | if ($this->roleClass === null) { |
|||
| 37 | $this->roleClass = app(PermissionRegistrar::class)->getRoleClass(); |
||||
| 38 | } |
||||
| 39 | return $this->roleClass; |
||||
| 40 | } |
||||
| 41 | |||||
| 42 | /** |
||||
| 43 | * A model may have multiple roles. |
||||
| 44 | */ |
||||
| 45 | public function roles() |
||||
| 46 | { |
||||
| 47 | 4 | return $this->belongsToMany(config('permission.models.role')); |
|||
|
0 ignored issues
–
show
It seems like
belongsToMany() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 48 | } |
||||
| 49 | 4 | ||||
| 50 | /** |
||||
| 51 | 4 | * Scope the model query to certain roles only. |
|||
| 52 | * |
||||
| 53 | * @param Builder $query |
||||
| 54 | * @param string|array|Role|Collection $roles |
||||
| 55 | * |
||||
| 56 | * @return Builder |
||||
| 57 | */ |
||||
| 58 | public function scopeRole(Builder $query, $roles): Builder |
||||
| 59 | { |
||||
| 60 | $roles = $this->convertToRoleModels($roles); |
||||
| 61 | 55 | ||||
| 62 | return $query->whereIn('role_ids', $roles->pluck('_id')); |
||||
| 63 | 55 | } |
|||
| 64 | 55 | ||||
| 65 | 55 | /** |
|||
| 66 | 55 | * Assign the given role to the model. |
|||
| 67 | 55 | * |
|||
| 68 | 53 | * @param array|string|Role ...$roles |
|||
| 69 | 53 | * |
|||
| 70 | 53 | * @return array|Role|string |
|||
| 71 | 51 | */ |
|||
| 72 | public function assignRole(...$roles) |
||||
| 73 | 51 | { |
|||
| 74 | $roles = \collect($roles) |
||||
| 75 | 51 | ->flatten() |
|||
| 76 | ->map(function ($role) { |
||||
| 77 | 51 | return $this->getStoredRole($role); |
|||
| 78 | }) |
||||
| 79 | ->each(function ($role) { |
||||
| 80 | $this->ensureModelSharesGuard($role); |
||||
| 81 | }) |
||||
| 82 | ->all(); |
||||
| 83 | |||||
| 84 | $this->roles()->saveMany($roles); |
||||
| 85 | |||||
| 86 | $this->forgetCachedPermissions(); |
||||
| 87 | 3 | ||||
| 88 | return $roles; |
||||
| 89 | 3 | } |
|||
| 90 | 3 | ||||
| 91 | 3 | /** |
|||
| 92 | 3 | * Revoke the given role from the model. |
|||
| 93 | 3 | * |
|||
| 94 | * @param array|string|Role ...$roles |
||||
| 95 | 3 | * |
|||
| 96 | 3 | * @return array|Role|string |
|||
| 97 | */ |
||||
| 98 | 3 | public function removeRole(...$roles) |
|||
| 99 | { |
||||
| 100 | 3 | \collect($roles) |
|||
| 101 | ->flatten() |
||||
| 102 | ->map(function ($role) { |
||||
| 103 | $role = $this->getStoredRole($role); |
||||
| 104 | $this->roles()->detach($role); |
||||
| 105 | |||||
| 106 | return $role; |
||||
| 107 | }); |
||||
| 108 | |||||
| 109 | $this->forgetCachedPermissions(); |
||||
| 110 | 6 | ||||
| 111 | return $roles; |
||||
| 112 | 6 | } |
|||
| 113 | |||||
| 114 | 6 | /** |
|||
| 115 | * Remove all current roles and set the given ones. |
||||
| 116 | * |
||||
| 117 | * @param array ...$roles |
||||
| 118 | * |
||||
| 119 | * @return array|Role|string |
||||
| 120 | */ |
||||
| 121 | public function syncRoles(...$roles) |
||||
| 122 | { |
||||
| 123 | $this->roles()->sync([]); |
||||
| 124 | 48 | ||||
| 125 | return $this->assignRole($roles); |
||||
| 126 | 48 | } |
|||
| 127 | 3 | ||||
| 128 | /** |
||||
| 129 | * Determine if the model has (one of) the given role(s). |
||||
| 130 | 48 | * |
|||
| 131 | 22 | * @param string|array|Role|\Illuminate\Support\Collection $roles |
|||
| 132 | * |
||||
| 133 | * @return bool |
||||
| 134 | 29 | */ |
|||
| 135 | 16 | public function hasRole($roles): bool |
|||
| 136 | 29 | { |
|||
| 137 | if (\is_string($roles) && false !== \strpos($roles, '|')) { |
||||
| 138 | 29 | $roles = \explode('|', $roles); |
|||
| 139 | } |
||||
| 140 | |||||
| 141 | if (\is_string($roles) || $roles instanceof Role) { |
||||
| 142 | return $this->roles->contains('name', $roles->name ?? $roles); |
||||
|
0 ignored issues
–
show
|
|||||
| 143 | } |
||||
| 144 | |||||
| 145 | $roles = \collect()->make($roles)->map(function ($role) { |
||||
| 146 | return $role instanceof Role ? $role->name : $role; |
||||
|
0 ignored issues
–
show
|
|||||
| 147 | }); |
||||
| 148 | 13 | ||||
| 149 | return !$roles->intersect($this->roles->pluck('name'))->isEmpty(); |
||||
| 150 | 13 | } |
|||
| 151 | |||||
| 152 | /** |
||||
| 153 | * Determine if the model has any of the given role(s). |
||||
| 154 | * |
||||
| 155 | * @param string|array|Role|\Illuminate\Support\Collection $roles |
||||
| 156 | * |
||||
| 157 | * @return bool |
||||
| 158 | */ |
||||
| 159 | public function hasAnyRole($roles): bool |
||||
| 160 | 7 | { |
|||
| 161 | return $this->hasRole($roles); |
||||
| 162 | 7 | } |
|||
| 163 | 4 | ||||
| 164 | /** |
||||
| 165 | * Determine if the model has all of the given role(s). |
||||
| 166 | 7 | * |
|||
| 167 | 2 | * @param $roles |
|||
| 168 | * |
||||
| 169 | * @return bool |
||||
| 170 | 6 | */ |
|||
| 171 | 6 | public function hasAllRoles(...$roles): bool |
|||
| 172 | 6 | { |
|||
| 173 | $helpers = new Helpers(); |
||||
| 174 | 6 | $roles = $helpers->flattenArray($roles); |
|||
| 175 | |||||
| 176 | foreach ($roles as $role) { |
||||
| 177 | if (!$this->hasRole($role)) { |
||||
| 178 | return false; |
||||
| 179 | } |
||||
| 180 | } |
||||
| 181 | return true; |
||||
| 182 | } |
||||
| 183 | |||||
| 184 | /** |
||||
| 185 | 55 | * Return Role object |
|||
| 186 | * |
||||
| 187 | 55 | * @param String|Role $role role name |
|||
| 188 | 47 | * |
|||
| 189 | * @return Role |
||||
| 190 | * @throws ReflectionException |
||||
| 191 | 13 | */ |
|||
| 192 | protected function getStoredRole($role): Role |
||||
| 193 | { |
||||
| 194 | if (\is_string($role)) { |
||||
| 195 | return $this->getRoleClass()->findByName($role, $this->getDefaultGuardName()); |
||||
| 196 | } |
||||
| 197 | |||||
| 198 | return $role; |
||||
| 199 | 1 | } |
|||
| 200 | |||||
| 201 | 1 | /** |
|||
| 202 | * Return a collection of role names associated with this user. |
||||
| 203 | * |
||||
| 204 | * @return Collection |
||||
| 205 | */ |
||||
| 206 | public function getRoleNames(): Collection |
||||
| 207 | { |
||||
| 208 | return $this->roles()->pluck('name'); |
||||
| 209 | } |
||||
| 210 | |||||
| 211 | 4 | /** |
|||
| 212 | * Convert to Role Models |
||||
| 213 | 4 | * |
|||
| 214 | 3 | * @param $roles |
|||
| 215 | * |
||||
| 216 | * @return Collection |
||||
| 217 | 4 | */ |
|||
| 218 | 2 | private function convertToRoleModels($roles): Collection |
|||
| 219 | { |
||||
| 220 | if (is_array($roles)) { |
||||
| 221 | 4 | $roles = collect($roles); |
|||
| 222 | 4 | } |
|||
| 223 | 4 | ||||
| 224 | if (!$roles instanceof Collection) { |
||||
| 225 | 4 | $roles = collect([$roles]); |
|||
| 226 | } |
||||
| 227 | |||||
| 228 | $roles = $roles->map(function ($role) { |
||||
| 229 | return $this->getStoredRole($role); |
||||
| 230 | }); |
||||
| 231 | |||||
| 232 | return $roles; |
||||
| 233 | } |
||||
| 234 | } |
||||
| 235 |
Checks if undeclared accessed properties appear in database migrations and if the creating migration is correct.