1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 
<?php

/* --------------------------------------------------------------
   AdminAccessPermissionReader.inc.php 2018-01-22
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2017 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------
*/

/**
 * Class AdminAccessPermissionReader
 *
 * @category   System
 * @package    AdminAccess
 * @subpackage Readers
 */
class AdminAccessPermissionReader implements AdminAccessPermissionReaderInterface
{
    /**
     * @var CI_DB_query_builder
     */
    protected $queryBuilder;
    
    /**
     * @var AdminAccessPermissionFactoryInterface
     */
    protected $permissionFactory;
    
    /**
     * @var string
     */
    protected $permissionTable;
    
    
    /**
     * AdminAccessPermissionReader constructor.
     *
     * @param CI_DB_query_builder                   $queryBuilder      Query builder.
     * @param AdminAccessPermissionFactoryInterface $permissionFactory Permission factory.
     */
    public function __construct(CI_DB_query_builder $queryBuilder,
                                AdminAccessPermissionFactoryInterface $permissionFactory)
    {
        $this->queryBuilder      = $queryBuilder;
        $this->permissionFactory = $permissionFactory;
        
        $this->permissionTable = 'admin_access_permissions';
    }
    
    
    /**
     * Returns an AdminAccessPermission object by given AdminAccessRole and AdminAccessGroup objects.
     *
     * @param AdminAccessRoleInterface  $accessRole  Role object.
     * @param AdminAccessGroupInterface $accessGroup Group object.
     *
     * @return AdminAccessPermissionPresentationInterface|AdminAccessPermissionPersistenceInterface|null Permission
     *                                                                                                   object or null
     *                                                                                                   if permission
     *                                                                                                   not found.
     */
    public function get(AdminAccessRoleInterface $accessRole, AdminAccessGroupInterface $accessGroup)
    {
        $permissionData = $this->queryBuilder->select()->from($this->permissionTable)->where([
                                                                                                 'admin_access_role_id'  => $accessRole->getId(),
                                                                                                 'admin_access_group_id' => $accessGroup->getId(),
                                                                                             ])->get()->row_array();
        
        return $this->_createPermissionObject($permissionData, $accessRole, $accessGroup);
    }
    
    
    /**
     * Returns an AdminAccessPermissionCollection by a given AdminAccessRole and AdminAccessGroupCollection object.
     *
     * @param AdminAccessRoleInterface   $accessRole      User role to find permission for.
     * @param AdminAccessGroupCollection $groupCollection Collection of all groups in system.
     *
     * @return AdminAccessPermissionCollection Permission collection.
     */
    public function getByGroupCollection(AdminAccessRoleInterface $accessRole,
                                         AdminAccessGroupCollection $groupCollection)
    {
        $resultArray = [];
        
        /** @var \AdminAccessGroupInterface $group */
        foreach($groupCollection->getArray() as $group)
        {
            $resultArray[] = $this->get($accessRole, $group);
        }
        
        return $this->permissionFactory->createAdminAccessPermissionCollection($resultArray);
    }
    
    
    /**
     * Returns an AdminAccessPermission objects, that gets its property values from permission data array.
     *
     * @param array|null                $permissionData Permission data.
     * @param AdminAccessRoleInterface  $role           Role needed to create permission object.
     * @param AdminAccessGroupInterface $group          Group needed to create permission object.
     *
     * @return AdminAccessPermissionPersistenceInterface|\AdminAccessPermissionPresentationInterface Permission object.
     */
    protected function _createPermissionObject($permissionData,
                                               AdminAccessRoleInterface $role,
                                               AdminAccessGroupInterface $group)
    {
        $permission = $this->permissionFactory->createAdminAccessPermission();
        
        $permission->setRole($role);
        $permission->setGroup($group);
        
        if($permissionData !== null && $permissionData['reading_granted'])
        {
            $permission->grantReading();
        }
        
        if($permissionData !== null && $permissionData['writing_granted'])
        {
            $permission->grantWriting();
        }
        
        if($permissionData !== null && $permissionData['deleting_granted'])
        {
            $permission->grantDeleting();
        }
        
        return $permission;
    }
    
    
}