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 
<?php

/* --------------------------------------------------------------
   AdminAccessUserReader.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 AdminAccessUserReader
 *
 * @category   System
 * @package    AdminAccess
 * @subpackage Readers
 */
class AdminAccessUserReader implements AdminAccessUserReaderInterface
{
    /**
     * @var CI_DB_query_builder
     */
    protected $queryBuilder;
    
    /**
     * @var AdminAccessUserFactoryInterface
     */
    protected $userFactory;
    
    /**
     * @var \AdminAccessRoleReaderInterface
     */
    protected $roleReader;
    
    /**
     * @var string
     */
    protected $usersTable;
    
    /**
     * @var string
     */
    protected $usersRolesTable;
    
    
    /**
     * AdminAccessUserReader constructor.
     *
     * @param CI_DB_query_builder             $queryBuilder Query builder.
     * @param AdminAccessUserFactoryInterface $userFactory  User factory.
     * @param AdminAccessRoleReaderInterface  $roleReader   Role reader.
     */
    public function __construct(CI_DB_query_builder $queryBuilder,
                                AdminAccessUserFactoryInterface $userFactory,
                                AdminAccessRoleReaderInterface $roleReader)
    {
        $this->queryBuilder = $queryBuilder;
        $this->userFactory  = $userFactory;
        $this->roleReader   = $roleReader;
        
        $this->usersTable      = 'customers';
        $this->usersRolesTable = 'admin_access_users';
    }
    
    
    /**
     * Returns an user by a given customer ID.
     *
     * @param IdType $customerId Customer ID.
     *
     * @throws UserNotFoundException If user not found.
     *
     * @return AdminAccessUserInterface User object.
     *
     * @throws \RoleNotFoundException
     */
    public function getByCustomerId(IdType $customerId)
    {
        $userData = $this->queryBuilder->select()
                                       ->from($this->usersTable)
                                       ->where(['customers_id' => $customerId->asInt()])
                                       ->get()
                                       ->row_array();
        
        if(empty($userData))
        {
            throw new UserNotFoundException($customerId);
        }
        
        return $this->_createAdminUserObject($userData);
    }
    
    
    /**
     * Creates a user object by a given array with the user data.
     *
     * @param array $userData User data.
     *
     * @return AdminAccessUserInterface User object.
     *
     * @throws \RoleNotFoundException
     */
    protected function _createAdminUserObject(array $userData)
    {
        $userId = new IdType($userData['customers_id']);
        
        $user = $this->userFactory->createAdminAccessUser($userId);
        
        $roles = $this->roleReader->getByCustomerId($userId);
        $user->setRoles($roles);
        
        return $user;
    }
}