123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <?php
- namespace Modules\User\Models\Traits;
- use Catch\CatchAdmin;
- use Catch\Support\Module\ModuleRepository;
- use Illuminate\Database\Eloquent\Relations\BelongsToMany;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\Route;
- use Illuminate\Support\Str;
- use Modules\Permissions\Models\Permissions;
- trait UserRelations
- {
- protected bool $isPermissionModuleEnabled = false;
- /**
- * init traits
- */
- public function initializeUserRelations(): void
- {
- $this->isPermissionModuleEnabled = app(ModuleRepository::class)->enabled('permissions');
- if ($this->isPermissionModuleEnabled) {
- $this->with = ['roles', 'jobs'];
- }
- }
- /**
- * roles
- *
- * @return BelongsToMany
- */
- public function roles(): BelongsToMany
- {
- return $this->belongsToMany($this->getRolesModel(), 'user_has_roles', 'user_id', 'role_id');
- }
- /**
- * jobs
- *
- * @return BelongsToMany
- */
- public function jobs(): BelongsToMany
- {
- return $this->belongsToMany($this->getJobsModel(), 'user_has_jobs', 'user_id', 'job_id');
- }
- /**
- * permissions
- */
- public function withPermissions(): self
- {
- if (! $this->isPermissionModuleEnabled) {
- return $this;
- }
- /* @var Permissions $permissionsModel */
- $permissionsModel = app($this->getPermissionsModel())->where('hidden',1)->orderByDesc('sort');
- if ($this->isSuperAdmin()) {
- $permissions = $permissionsModel->get();
- } else {
- $permissions = Collection::make();
- $roleIds = $this->roles()->pluck('role_id')->toArray();
- app($this->getRolesModel())->whereIn('id', $roleIds)->with(['permissions' => function($query){
- return $query->where('hidden',1)->orderByDesc('sort');
- }])->get()
- ->each(function ($role) use (&$permissions) {
- $permissions = $permissions->concat($role->permissions);
- });
- $permissions = $permissions->unique('id');
- }
- $this->setAttribute('permissions', $permissions->each(fn ($permission) => $permission->setAttribute('hidden', $permission->isHidden())));
- return $this;
- }
- /**
- *
- * permission module controller.action
- *
- * @param string|null $permission
- * @return bool
- */
- public function can(string $permission = null): bool
- {
- if (! $this->isPermissionModuleEnabled) {
- return true;
- }
- if ($this->isSuperAdmin()) {
- return true;
- }
- $this->withPermissions();
- $actions = Collection::make();
- $this->getAttribute('permissions')->each(function ($permission) use (&$actions) {
- if ($permission->isAction()) {
- [$controller, $action] = explode('@', $permission->permission_mark);
- $actions->add(strtolower(CatchAdmin::getModuleControllerNamespace($permission->module).$controller.'Controller@'.$action));
- }
- });
- if ($permission) {
- [$module, $controller, $action] = explode('@', $permission);
- $permission = strtolower(CatchAdmin::getModuleControllerNamespace($module).$controller.'Controller@'.$action);
- }else{
- $permission = strtolower(Route::currentRouteAction());
- }
- return $actions->contains($permission);
- }
- /**
- * get RolesModel
- *
- * @see \Modules\Permissions\Models\Roles
- * @return string
- */
- protected function getRolesModel(): string
- {
- return '\\'.CatchAdmin::getModuleModelNamespace('permissions').'Roles';
- }
- /**
- * get JobsModel
- *
- * @see \Modules\Permissions\Models\Jobs
- * @return string
- */
- protected function getJobsModel(): string
- {
- return '\\'.CatchAdmin::getModuleModelNamespace('permissions').'Jobs';
- }
- /**
- * get PermissionsModel
- *
- * @return string
- *@see \Modules\Permissions\Models\Permissions
- */
- protected function getPermissionsModel(): string
- {
- return '\\'.CatchAdmin::getModuleModelNamespace('permissions').'Permissions';
- }
- }
|