open-orchestra/open-orchestra-cms-bundle

View on GitHub
UserAdminBundle/Transformer/UserTransformer.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php

namespace OpenOrchestra\UserAdminBundle\Transformer;

use OpenOrchestra\ApiBundle\Context\CMSGroupContext;
use OpenOrchestra\Backoffice\Security\ContributionActionInterface;
use OpenOrchestra\BaseApi\Exceptions\TransformerParameterTypeException;
use OpenOrchestra\BaseApi\Facade\FacadeInterface;
use OpenOrchestra\BaseApi\Transformer\AbstractSecurityCheckerAwareTransformer;
use OpenOrchestra\ModelInterface\Manager\MultiLanguagesChoiceManagerInterface;
use OpenOrchestra\UserBundle\Model\UserInterface;
use OpenOrchestra\UserBundle\Repository\UserRepositoryInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

/**
 * Class UserTransformer
 */
class UserTransformer extends AbstractSecurityCheckerAwareTransformer
{
    protected $eventDispatcher;
    protected $multiLanguagesChoiceManager;
    protected $userRepository;

    /**
     * @param string                               $facadeClass
     * @param AuthorizationCheckerInterface        $authorizationChecker
     * @param EventDispatcherInterface             $eventDispatcher
     * @param MultiLanguagesChoiceManagerInterface $multiLanguagesChoiceManager
     * @param UserRepositoryInterface              $userRepository
     */
    public function __construct(
        $facadeClass,
        AuthorizationCheckerInterface $authorizationChecker,
        EventDispatcherInterface $eventDispatcher,
        MultiLanguagesChoiceManagerInterface $multiLanguagesChoiceManager,
        UserRepositoryInterface $userRepository
    ) {
        parent::__construct($facadeClass, $authorizationChecker);
        $this->eventDispatcher = $eventDispatcher;
        $this->multiLanguagesChoiceManager = $multiLanguagesChoiceManager;
        $this->userRepository = $userRepository;
    }

    /**
     * @param UserInterface $user
     * @param array         $params
     *
     * @return FacadeInterface
     * @throws TransformerParameterTypeException
     */
    public function transform($user, array $params = array())
    {
        if (!$user instanceof UserInterface) {
            throw new TransformerParameterTypeException();
        }

        $facade = $this->newFacade();

        $facade->id = $user->getId();
        $facade->username = $user->getUsername();
        $facade->email = $user->getEmail();
        $facade->roles = implode(',', $user->getRoles());

        $groups = $user->getGroups();
        $labels = array();
        foreach($groups as $group){
            if (!$group->isDeleted()) {
                $labels[] = $this->multiLanguagesChoiceManager->choose($group->getLabels());
            }
        }

        $facade->groups = implode(',', $labels);

        if ($this->hasGroup(CMSGroupContext::AUTHORIZATIONS)) {
            $canDelete = $this->authorizationChecker->isGranted(ContributionActionInterface::DELETE, $user);
            $facade->addRight('can_delete', $canDelete);
        }

        return $facade;
    }

    /**
     * @param FacadeInterface $facade
     * @param array           $params
     *
     * @return UserInterface|null
     */
    public function reverseTransform(FacadeInterface $facade, array $params = array())
    {
        if (null !== $facade->id) {
            return $this->userRepository->find($facade->id);
        }

        return null;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'user';
    }

}