Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
35 / 35
AclUser\Service\ManageUsersManager
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
7 / 7
13
100.00% covered (success)
100.00%
35 / 35
 getAllUsers
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 findUserById
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 findRoleById
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getRolesByUser
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
9 / 9
 updateUserRoleMembership
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
11 / 11
 toggleSuspensionUserById
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 deleteUserById
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
<?php
/**
 * Class ManageUsersManager
 *
 * @package     AclUser\Service
 * @author      Nigel Hurnell
 * @version     v 1.0.0
 * @copyright   Copyright (c) 2017, Nigel Hurnell
 */
namespace AclUser\Service;
use AclUser\Entity\User;
use AclUser\Entity\Role;
use AclUser\Entity\UserRoleMap;
/**
 * This service is responsible for the logic of adding/editing users
 * and changing user passwords by admin staff.
 * 
 * @package     AclUser\Service
 * @author      Nigel Hurnell
 * @version     v 1.0.0
 * @license     BSD
 * @copyright   Copyright (c) 2017, Nigel Hurnell
 */
class ManageUsersManager extends UserManager
{
    /**
     * Get ArrayCollection of system users
     * 
     * @return ArrayCollection
     */
    public function getAllUsers()
    {
        return $this->entityManager->getRepository(User::class)
                        ->findBy([], ['id' => 'ASC']);
    }
    /**
     * Get User by their database id
     * 
     * @param integer $id
     * @return User|null
     */
    public function findUserById($id)
    {
        return $this->entityManager->getRepository(User::class)
                        ->findOneBy(['id' => $id]);
    }
    /**
     * Get Role by its database id
     * 
     * @param integer $id
     * @return Role|null
     */
    public function findRoleById($id)
    {
        return $this->entityManager->getRepository(Role::class)
                        ->findOneBy(['id' => $id]);
    }
    /**
     * Get this users roles and all possible roles
     * 
     * @param User $user
     * @return array of ArrayCaollections This user's Roles & All possible Roles
     */
    public function getRolesByUser($user)
    {
        $userRoles = isset($user) ? $user->getRoleMaps() : null;
        $allRoles = $this->entityManager->getRepository(Role::class)
                ->findBy(['active' => true]);
        foreach ($userRoles as $userRole) {
            if (in_array($userRole->getRole(), $allRoles)) {
                unset($allRoles[array_search($userRole->getRole(), $allRoles)]);
            }
            if (!$userRole->getRole()->getActive()) {
                $userRoles->removeElement($userRole);
            }
        }
        return [$userRoles, $allRoles];
    }
    /**
     * Grant or revoke User specific Role
     * 
     * @param string $type add or remove action
     * @param int $userId the user's id
     * @param int $roleId the role's id
     */
    public function updateUserRoleMembership($type, $userId, $roleId)
    {
        if ('add' === $type) {
            $entity = new UserRoleMap();
            $entity->setUser($this->findUserById($userId));
            $entity->setRole($this->findRoleById($roleId));
            $this->entityManager->persist($entity);
        } else if ('remove' === $type) {
            $entity = $this->entityManager->getRepository(UserRoleMap::class)
                    ->findOneBy(['user' => $this->findUserById($userId), 'role' => $this->findRoleById($roleId)]);
            $this->entityManager->remove($entity);
        }
        $this->entityManager->flush();
    }
    /**
     * Toggle suspended status of a user
     * 
     * @param integer $id
     * @return boolean
     */
    public function toggleSuspensionUserById($id)
    {
        $entity = $this->getUserById($id);
        $entity->toggleStatus();
        $this->entityManager->merge($entity);
        $this->entityManager->flush();
        return true;
    }
    /**
     * Delete user from database based on the db id
     * 
     * @param integer $id
     */
    public function deleteUserById($id)
    {
        $entity = $this->getUserById($id);
        /* note that user_role_map entries are deleted by database constraint */
        $this->entityManager->remove($entity);
        $this->entityManager->flush();
    }
}