open-orchestra/open-orchestra-media-admin-bundle

View on GitHub
MediaAdminBundle/Transformer/FolderTreeTransformer.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace OpenOrchestra\MediaAdminBundle\Transformer;

use OpenOrchestra\MediaAdminBundle\Facade\FolderTreeFacade;
use OpenOrchestra\BaseApi\Exceptions\HttpException\FacadeClassNotSetException;
use OpenOrchestra\BaseApi\Exceptions\TransformerParameterTypeException;
use OpenOrchestra\BaseApi\Facade\FacadeInterface;
use OpenOrchestra\Backoffice\Security\ContributionActionInterface;
use OpenOrchestra\BaseApi\Transformer\AbstractSecurityCheckerAwareTransformer;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use OpenOrchestra\MediaAdmin\Security\ContributionActionInterface as MediaContributionActionInterface;
use OpenOrchestra\ModelInterface\Manager\MultiLanguagesChoiceManagerInterface;

/**
 * Class FolderTreeTransformer
 */
class FolderTreeTransformer extends AbstractSecurityCheckerAwareTransformer
{
    protected $folderFacadeClass;
    protected $multiLanguageChoiceManager;

    /**
     * @param string                        $treeFacadeClass
     * @param string                        $folderFacadeClass
     * @param AuthorizationCheckerInterface $authorizationChecker
     * @param MultiLanguagesChoiceManagerInterface $multiLanguageChoiceManager
     */
    public function __construct(
        $treeFacadeClass,
        $folderFacadeClass,
        AuthorizationCheckerInterface $authorizationChecker,
        MultiLanguagesChoiceManagerInterface $multiLanguageChoiceManager
    ) {
        parent::__construct($treeFacadeClass, $authorizationChecker);
        $this->folderFacadeClass = $folderFacadeClass;
        $this->multiLanguageChoiceManager = $multiLanguageChoiceManager;
    }

    /**
     * @param array $folderCollection
     * @param array $params
     *
     * @return FolderTreeFacade
     */
    public function transform($folderCollection, array $params = array())
    {
        $facade = $this->newFacade();
        $facade->folder = null;

        if (is_array($folderCollection)) {
            foreach ($folderCollection as $folder) {
                $facade->addChild($this->transformSubTree($folder));
            }
        }

        return $facade;
    }

    /**
     * Transform the subtree having $folder as root
     *
     * @param array $folder
     *
     * @return FacadeInterface
     */
    protected function transformSubTree(array $folder)
    {
        $rootFolder = $folder['folder'];

        $folderFacade = $this->newFolderFacade();
        $folderFacade->id = (string)$rootFolder['_id'];
        $folderFacade->folderId = $rootFolder['folderId'];
        $folderFacade->name = $this->multiLanguageChoiceManager->choose($rootFolder['names']);
        $folderFacade->type = $rootFolder['type'];
        $folderFacade->siteId = $rootFolder['siteId'];
        $folderFacade->addRight(
            'can_edit',
            $this->authorizationChecker->isGranted(ContributionActionInterface::EDIT, $rootFolder)
        );
        $folderFacade->addRight(
            'can_create',
            $this->authorizationChecker->isGranted(ContributionActionInterface::CREATE, $rootFolder)
        );
        $folderFacade->addRight(
            'can_create_media',
            $this->authorizationChecker->isGranted(MediaContributionActionInterface::CREATE_MEDIA_UNDER, $rootFolder)
        );

        $treeFacade = $this->newFacade();
        $treeFacade->folder = $folderFacade;

        if (isset($folder['children']) && is_array($folder['children'])) {
            foreach ($folder['children'] as $children) {
                $treeFacade->addChild($this->transformSubTree($children));
            }
        }

        return $treeFacade;
    }

    /**
     * @return mixed
     *
     * @throws FacadeClassNotSetException
     * @throws TransformerParameterTypeException
     */
    protected function newFolderFacade()
    {
        if (null === $this->folderFacadeClass) {
            throw new FacadeClassNotSetException();
        }

        $facade = new $this->folderFacadeClass();

        if (!$facade instanceof FacadeInterface) {
            throw new TransformerParameterTypeException();
        }

        return $facade;
    }

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