Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 115
UserService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
306.00
0.00% covered (danger)
0.00%
0 / 115
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 getUser
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 27
 getAllUserRoleCodes
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 30
 getUserModules
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 48
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\constant\UserType;
use com\linways\core\ams\professional\dto\ProductConfiguration\User;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\mapper\UserServiceMapper;
use com\linways\core\ams\professional\service\productConfiguration\UserMenuService;
/**
 *
 * @Date 05/08/20
 * @author  JithinVijayan <jithin@linways.com>
 */
class UserService extends BaseService
{
    /**
     * @var null
     */
    private static $_instance = null;
    /**
     * @var array
     */
    private $mapper = [];
    /**
     * UserMenuService constructor.
     */
    private function __construct()
    {
        $this->mapper = UserServiceMapper::getInstance()->getMapper();
    }
    /**
     * Preventing outside cloning
     */
    private function __clone()
    {
    }
    /**
     * @return UserService|null
     */
    public static function getInstance()
    {
        if (!is_object(self::$_instance))
            self::$_instance = new self();
        return self::$_instance;
    }
    /**
     * Returns student details.
     * Note: Here staff account is used as staff code because we need a unique key as staff code. In some colleges,
     * they using same staff code for different staff accounts.
     *
     * @param $userId
     * @param $userType
     * @return Object|User
     * @throws ProfessionalException
     */
    public function getUser($userId, $userType)
    {
        switch ($userType) {
            case UserType::STAFF:
                $sql = "SELECT sa.staffID as id, sa.staffAccount as code, sa.staffEmail as primaryEmail, '$userType' as user_type,sa.staffName as name,
                        r.id as role_id,r.name as role_name,r.code as role_code
                        FROM staffaccounts sa
                        LEFT JOIN user_account_roles uar ON uar.user_type ='$userType' AND uar.user_id = sa.staffID
                        LEFT JOIN roles r on uar.role_id = r.id
                        WHERE sa.staffID = $userId";
                break;
            case UserType::STUDENT:
                $sql = "SELECT sa.studentID as id, sa.studentAccount as code, '$userType' as user_type,sa.studentName as name,
                        r.id as role_id,r.name as role_name,r.code as role_code
                        FROM studentaccount sa 
                        LEFT JOIN user_account_roles uar ON uar.user_type ='$userType' AND uar.user_id = sa.studentID
                        LEFT JOIN roles r on uar.role_id = r.id
                        WHERE studentID = $userId";
                break;
            default:
                throw new ProfessionalException(ProfessionalException::INVALID_USER_TYPE, "Invalid user type given");
        }
        try {
            return $this->executeQueryForObject($sql, false, $this->mapper[UserServiceMapper::USER_MAPPER]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $userId
     * @param $userType
     * @return array
     * @throws ProfessionalException
     */
    public function getAllUserRoleCodes($userId, $userType)
    {
        switch ($userType) {
            case UserType::STAFF:
                $sql = "SELECT DISTINCT r.code as role_code 
                        FROM staffaccounts sa
                        LEFT JOIN user_account_roles uar ON uar.user_type ='$userType' AND uar.user_id = sa.staffID
                        LEFT JOIN roles r on uar.role_id = r.id
                        WHERE sa.staffID = $userId";
                break;
            case UserType::STUDENT:
                $sql = "SELECT DISTINCT r.code as role_code
                        FROM studentaccount sa 
                        LEFT JOIN user_account_roles uar ON uar.user_type ='$userType' AND uar.user_id = sa.studentID
                        LEFT JOIN roles r on uar.role_id = r.id
                        WHERE studentID = $userId";
                break;
            default:
                throw new ProfessionalException(ProfessionalException::INVALID_USER_TYPE, "Invalid user type given");
        }
        try {
            $resultRoleCodes = $this->executeQueryForList($sql);
            $roleCodes = [];
            foreach ($resultRoleCodes as $roleCode) {
                $roleCodes[] = $roleCode->role_code;
            }
            return $roleCodes;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get user's roles based on user Id
     * @param stdClass $userDetails
     * @return Array $modules
     * @throws ProfessionalException
     */
    public function getUserModules ( $userDetails ) {
        $modules = [];
        try {
            if (empty($userDetails->userId) || empty($userDetails->userType)) {
                throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS, "Invalid user id or user type");
            }
            $sql = "SELECT DISTINCT
                    ap.module
                FROM
                    auth_permission ap
                        INNER JOIN 
                    auth_role_permissions arp ON ap.id = arp.auth_permission_id
                        INNER JOIN 
                    user_account_roles uar ON uar.role_id = arp.role_id
                WHERE
                    uar.user_id = :userId
                    AND uar.user_type = :userType
            UNION
                SELECT DISTINCT
                    ap.module
                FROM
                    auth_permission ap
                        INNER JOIN 
                    auth_group_permission agp ON ap.id = agp.auth_permission_id
                        INNER JOIN 
                    auth_staffaccounts_group asg ON asg.auth_group_id = agp.auth_group_id
                WHERE
                    asg.staff_id = :userId
            UNION
                SELECT DISTINCT
                    ap.module
                FROM
                    auth_permission ap
                        INNER JOIN 
                    auth_staffaccounts_permission asp ON ap.id = asp.auth_permission_id
                WHERE
                    asp.staff_id = :userId ";
            $params = [
                'userId' => $userDetails->userId,
                'userType' => $userDetails->userType
            ];
            $modules = $this->executeQueryForListUsingPreparedStatement($sql, $params);
            $modules = array_column($modules, 'module');
        }
        catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $modules;
    }
}