|  |  |  | <?php
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Created by Error202
 | 
					
						
							|  |  |  |  * Date: 15.08.2017
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace core\services;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use DomainException;
 | 
					
						
							|  |  |  | use Exception;
 | 
					
						
							|  |  |  | use ReflectionException;
 | 
					
						
							|  |  |  | use yii\rbac\ManagerInterface;
 | 
					
						
							|  |  |  | use yii\helpers\Json;
 | 
					
						
							|  |  |  | use yii\helpers\ArrayHelper;
 | 
					
						
							|  |  |  | use yii\rbac\Permission;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PermissionManager
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  |     private ManagerInterface $manager;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function __construct(ManagerInterface $manager)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $this->manager = $manager;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function create($name, $description = '', $ruleName = null, $data = null)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         if ($permission = $am->getPermission($name)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $name . '" is already exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         $newPermission = $am->createPermission($name);
 | 
					
						
							|  |  |  |         $newPermission->description = $description;
 | 
					
						
							|  |  |  |         $newPermission->data = $data == null ? null : Json::decode($data);
 | 
					
						
							|  |  |  |         $newPermission->ruleName = empty($ruleName) ? null : $ruleName;
 | 
					
						
							|  |  |  |         try {
 | 
					
						
							|  |  |  |             $am->add($newPermission);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         catch (ReflectionException $e)
 | 
					
						
							|  |  |  |         {
 | 
					
						
							|  |  |  |             throw new DomainException($e->getMessage());
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @param $name
 | 
					
						
							|  |  |  |      * @param $newName
 | 
					
						
							|  |  |  |      * @param string $description
 | 
					
						
							|  |  |  |      * @param null $ruleName
 | 
					
						
							|  |  |  |      * @param null $data
 | 
					
						
							|  |  |  |      * @throws Exception
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public function update($name, $newName, $description = '', $ruleName = null, $data = null)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         if (!$permission = $am->getPermission($name)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $name . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         $permission->name = $newName;
 | 
					
						
							|  |  |  |         $permission->description = $description;
 | 
					
						
							|  |  |  |         $permission->ruleName = empty($ruleName) ? null : $ruleName;
 | 
					
						
							|  |  |  |         $permission->data = $data == null ? null : Json::decode($data);
 | 
					
						
							|  |  |  |         try {
 | 
					
						
							|  |  |  |             $am->update($name, $permission);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         catch (ReflectionException $e)
 | 
					
						
							|  |  |  |         {
 | 
					
						
							|  |  |  |             throw new DomainException($e->getMessage());
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function delete($name)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         if (!$permission = $am->getPermission($name))
 | 
					
						
							|  |  |  |         {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $name . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         $am->remove($permission);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @param $roleName
 | 
					
						
							|  |  |  |      * @param $permissionName
 | 
					
						
							|  |  |  |      * @throws \yii\base\Exception
 | 
					
						
							|  |  |  |      */
 | 
					
						
							|  |  |  |     public function assign($roleName, $permissionName)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         if (!$role = $am->getRole($roleName)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Role "' . $roleName . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         if (!$permission = $am->getPermission($permissionName)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $permissionName . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         $am->addChild($role, $permission);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function unassign($roleName, $permissionName)
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         if (!$role = $am->getRole($roleName)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Role "' . $roleName . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         if (!$permission = $am->getPermission($permissionName)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $permissionName . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         if (!$am->hasChild($role, $permission)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $permissionName . '" does not assigned to "' . $roleName . '".');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         $am->removeChild($role, $permission);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getPermissions(): array
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         return $am->getPermissions();
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getPermission($name): ?Permission
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         if (!$permission = $am->getPermission($name)) {
 | 
					
						
							|  |  |  |             throw new DomainException('Permission "' . $name . '" does not exist.');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         return $permission;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function permissionExists($name): bool
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  | 	    $am = $this->manager;
 | 
					
						
							|  |  |  | 	    if (!$permission = $am->getPermission($name)) {
 | 
					
						
							|  |  |  | 		    return false;
 | 
					
						
							|  |  |  | 	    }
 | 
					
						
							|  |  |  | 	    return true;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getPermissionsSelectArray(): array
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         return ArrayHelper::map($this->getPermissions(), 'name', 'description');
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getPermissionsSelectArrayByRole($id): array
 | 
					
						
							|  |  |  |     {
 | 
					
						
							|  |  |  |         $am = $this->manager;
 | 
					
						
							|  |  |  |         return ArrayHelper::getColumn($am->getPermissionsByRole($id), 'name');
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 |