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 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 176
UserRoleService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
1722.00
0.00% covered (danger)
0.00%
0 / 176
 __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
 assignUserRole
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 20
 deleteAssignedUserRole
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 checkUserHasRoles
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 24
 assignRolesToUser
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 31
 assignRoleToMultipleUsers
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 22
 removeRolesFromMultipleUsers
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 19
 removeRolesFromUser
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 26
 deleteUserRolesByRoleId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\request\AddUserToRoleRequest;
use com\linways\core\ams\professional\request\AssignRolesToUserRequest;
use com\linways\core\ams\professional\request\AssignRoleToMultipleUsersRequest;
use com\linways\core\ams\professional\request\DeleteAssignedUserRoleRequest;
use com\linways\core\ams\professional\request\DeleteUserRolesByRoleRequest;
use com\linways\core\ams\professional\request\RemoveRolesFromMultipleUsersRequest;
use com\linways\core\ams\professional\request\RemoveRolesFromUserRequest;
use com\linways\core\ams\professional\logging\AMSLogger;
use com\linways\core\ams\professional\logging\Events;
use com\linways\core\ams\professional\constant\StatusConstants;
/**
 *
 * @Date 30/07/20
 * @author  JithinVijayan <jithin@linways.com>
 */
class UserRoleService extends BaseService
{
    /**
     * @var null
     */
    private static $_instance = null;
    private $logger = null;
    /**
     * UserRoleService constructor.
     */
    private function __construct()
    {
      $this->logger = AMSLogger::getLogger();
    }
    
    
    /**
     * prevent cloning
     */
    private function __clone()
    {
    }
    /**
     * @return UserRoleService|null
     */
    public static function getInstance()
    {
        if (!is_object(self::$_instance))
            self::$_instance = new self();
        return self::$_instance;
    }
    /**
     * @param AddUserToRoleRequest $request
     * @return Object|integer
     * @throws ProfessionalException
     */
    public function assignUserRole(AddUserToRoleRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->roleId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_ROLE_ID, "Invalid role details given");
        }
        if (empty($request->userId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_USER_ID, "Invalid user details given");
        }
        if (empty($request->userType)) {
            throw new ProfessionalException(ProfessionalException::INVALID_USER_TYPE, "Invalid user type given");
        }
        $sql = "INSERT INTO user_account_roles (user_id, user_type, role_id, created_by, created_date, updated_by, updated_date) 
                VALUES ($request->userId,'$request->userType',$request->roleId,$request->createdBy,UTC_TIMESTAMP(),
                        $request->updatedBy,UTC_TIMESTAMP())";
        try {
            return $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param DeleteAssignedUserRoleRequest $request
     * @throws ProfessionalException
     */
    public function deleteAssignedUserRole(DeleteAssignedUserRoleRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->userRoleId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_USER_ROLE_ID, "Invalid user role details given");
        }
        //TODO: Validate user roles already using somewhere in the database
        $sql = "DELETE FROM user_account_roles WHERE id = $request->userRoleId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $userId
     * @param $userType
     * @return Object|array
     * @throws ProfessionalException
     */
    public function checkUserHasRoles($userId, $userType, $roleList=[])
    {
        $userId = (int)$this->realEscapeString($userId);
        $userType = $this->realEscapeString($userType);
        $roleList = $this->realEscapeArray($roleList);
        $cond = "";
        // For centalized login. role taken from the token.
        if(count($roleList) >0 ){
            $cond .= " AND r.code IN ('". implode("','", $roleList) . "')";
        }
        if (empty($userId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_USER_ID, "Invalid user details given");
        }
        if (empty($userType)) {
            throw new ProfessionalException(ProfessionalException::INVALID_USER_TYPE, "Invalid user details given");
        }
        $sql = "SELECT DISTINCT r.code as roleCode 
                FROM user_account_roles
                INNER JOIN roles r on user_account_roles.role_id = r.id
                WHERE user_id = $userId AND user_type = '$userType$cond ORDER BY r.code";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Assigning roles to user
     *
     * @throws ProfessionalException
     */
    public function assignRolesToUser(AssignRolesToUserRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->userId) || empty($request->userType)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        try {
            $sql = "INSERT IGNORE INTO user_account_roles (user_id, user_type, role_id, created_by, created_date, 
                    updated_by, updated_date) VALUES ";
            foreach ($request->roleIds as $roleId) {
                $sql .= "($request->userId,'$request->userType',$roleId,$request->createdBy,UTC_TIMESTAMP(),
                    $request->updatedBy,UTC_TIMESTAMP()),";
            }
            $sql = rtrim($sql, ",");
            $sql .= ";";
            AMSLogger::log_info($this->logger, Events::ASSIGN_ROLES_USER, [
                "CreatedStaff" => $GLOBALS['userId'],
                "AffectedStaff" => $request->userId,
                "roles" => $request->roleIds,
                "status" => StatusConstants::SUCCESS
              ]);
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            AMSLogger::log_error($this->logger, Events::ASSIGN_ROLES_USER, [
                "CreatedStaff" => $GLOBALS['userId'],
                "AffectedStaff" => $request->userId,
                "roles" => $request->roleIds,
                "status" => StatusConstants::FAILURE
              ]);
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Assigning roles to multiple users
     *
     * @throws ProfessionalException
     */
    public function assignRoleToMultipleUsers(AssignRoleToMultipleUsersRequest $request) {
        $request = $this->realEscapeObject($request);
        if (empty($request->userIds) || empty($request->roleIds)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        if (empty($request->userType)) {
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS, "Invalid user type");
        }
        try {
            $sql = "INSERT IGNORE INTO user_account_roles (user_id, user_type, role_id, created_by, created_date, 
                    updated_by, updated_date) VALUES ";
            foreach ($request->userIds as $userId) {
                foreach ($request->roleIds as $roleId) {
                    $sql .= "('$userId','$request->userType','$roleId','$request->createdBy',UTC_TIMESTAMP(), '$request->updatedBy', UTC_TIMESTAMP()),";
                }
            }
            $sql = rtrim($sql, ",");
            $sql .= ";";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Assigning roles to multiple users
     *
     * @throws ProfessionalException
     */
    public function removeRolesFromMultipleUsers(RemoveRolesFromMultipleUsersRequest $request) {
        $request = $this->realEscapeObject($request);
        if (empty($request->userIds) || empty($request->roleIds)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        if (empty($request->userType)) {
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS, "Invalid user type");
        }
        try {
            $sql = "DELETE 
                    FROM 
                        user_account_roles 
                    WHERE 
                        user_id IN ('" . implode("','", $request->userIds) . "') 
                        AND role_id IN ('" . implode("','", $request->roleIds) . "');";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * TODO: Invalid refresh and access token when roles deleting
     * removing roles from a user
     *
     * @param RemoveRolesFromUserRequest $request
     * @throws ProfessionalException
     */
    public function removeRolesFromUser(RemoveRolesFromUserRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->userId) || empty($request->userType)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        try {
            $sql = "DELETE FROM user_account_roles 
                    WHERE user_id = $request->userId 
                    AND user_type='$request->userType' AND role_id IN (" . implode(",", $request->roleIds) . ")";
                     AMSLogger::log_info($this->logger, Events::REMOVE_ASSIGN_ROLES_USER, [
                        "CreatedStaff" => $GLOBALS['userId'],
                        "AffectedStaff" => $request->userId,
                        "roles" => $request->roleIds,
                        "status" => StatusConstants::SUCCESS
                      ]);
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            AMSLogger::log_error($this->logger, Events::REMOVE_ASSIGN_ROLES_USER, [
                "CreatedStaff" => $GLOBALS['userId'],
                "AffectedStaff" => $request->userId,
                "roles" => $request->roleIds,
                "status" => StatusConstants::FAILURE
              ]);
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * deleting user roles by role id
     *
     * @param $roleId
     * @throws ProfessionalException
     */
    public function deleteUserRolesByRoleId(DeleteUserRolesByRoleRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->roleId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_ROLE_ID, "Invalid role details given");
        }
        $sql = "DELETE FROM user_account_roles WHERE role_id = '$request->roleId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}