open-orchestra/open-orchestra-cms-bundle

View on GitHub
WorkflowAdminBundle/Controller/Api/StatusController.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace OpenOrchestra\WorkflowAdminBundle\Controller\Api;

use OpenOrchestra\Backoffice\BusinessRules\Strategies\BusinessActionInterface;
use OpenOrchestra\BaseApi\Facade\FacadeInterface;
use OpenOrchestra\ModelInterface\Event\StatusEvent;
use OpenOrchestra\ModelInterface\StatusEvents;
use OpenOrchestra\BaseApiBundle\Controller\Annotation as Api;
use OpenOrchestra\WorkflowAdminBundle\Exceptions\HttpException\StatusNotDeletableException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration as Config;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use OpenOrchestra\BaseApiBundle\Controller\BaseController;
use OpenOrchestra\Backoffice\Security\ContributionActionInterface;
use OpenOrchestra\ModelInterface\Model\StatusInterface;
use OpenOrchestra\Pagination\Configuration\PaginateFinderConfiguration;

/**
 * Class StatusController
 *
 * @Config\Route("status")
 *
 * @Api\Serialize()
 */
class StatusController extends BaseController
{
    /**
     * @param Request $request
     *
     * @return FacadeInterface
     *
     * @Config\Route("", name="open_orchestra_api_status_list_table")
     * @Config\Method({"GET"})
     *
     * @Api\Groups({\OpenOrchestra\ApiBundle\Context\CMSGroupContext::AUTHORIZATIONS})
     */
    public function listTableAction(Request $request)
    {
        $this->denyAccessUnlessGranted(ContributionActionInterface::READ, StatusInterface::ENTITY_TYPE);
        $mapping = array(
            'label' => 'labels'
        );
        $configuration = PaginateFinderConfiguration::generateFromRequest($request, $mapping);
        $repository = $this->get('open_orchestra_model.repository.status');
        $collection = $repository->findForPaginate($configuration);
        $recordsTotal = $repository->countNotOutOfWorkflow();
        $recordsFiltered = $repository->countWithFilter($configuration);
        $facade = $this->get('open_orchestra_api.transformer_manager')->transform('status_collection', $collection);
        $facade->recordsTotal = $recordsTotal;
        $facade->recordsFiltered = $recordsFiltered;

        return $facade;
    }

    /**
     * @return FacadeInterface
     *
     * @Config\Route("/list", name="open_orchestra_api_status_list")
     * @Config\Method({"GET"})
     * @Config\Security("is_granted('IS_AUTHENTICATED_FULLY')")
     *
     */
    public function listAction()
    {
        $status = $this->get('open_orchestra_model.repository.status')->findNotOutOfWorkflow();

        return $this->get('open_orchestra_api.transformer_manager')->transform('status_collection', $status);
    }

    /**
     * @param Request $request
     *
     * @Config\Route("/delete-multiple", name="open_orchestra_api_status_delete_multiple")
     * @Config\Method({"DELETE"})
     *
     * @return Response
     */
    public function deleteStatusesAction(Request $request)
    {
        $format = $request->get('_format', 'json');

        $facade = $this->get('jms_serializer')->deserialize(
            $request->getContent(),
            $this->getParameter('open_orchestra_workflow_admin.facade.status_collection.class'),
            $format
        );
        $statusRepository = $this->get('open_orchestra_model.repository.status');
        $statuses = $this->get('open_orchestra_api.transformer_manager')->reverseTransform('status_collection', $facade);

        $statusIds = array();
        foreach ($statuses as $status) {
            if ($this->isDeleteGranted($status)) {
                $statusIds[] = $status->getId();
                $this->dispatchEvent(StatusEvents::STATUS_DELETE, new StatusEvent($status));
            }
        }
        $statusRepository->removeStatuses($statusIds);

        return array();
    }

    /**
     * @param string $statusId
     *
     * @Config\Route("/{statusId}/delete", name="open_orchestra_api_status_delete")
     * @Config\Method({"DELETE"})
     *
     * @return Response
     * @throws StatusNotDeletableException
     */
    public function deleteAction($statusId)
    {
        $status = $this->get('open_orchestra_model.repository.status')->find($statusId);
        $this->denyAccessUnlessGranted(ContributionActionInterface::DELETE, $status);

        if (!$this->get('open_orchestra_backoffice.business_rules_manager')->isGranted(BusinessActionInterface::DELETE, $status)) {
            throw new StatusNotDeletableException();
        }

        $objectManager = $this->get('object_manager');
        $objectManager->remove($status);
        $objectManager->flush();
        $this->dispatchEvent(StatusEvents::STATUS_DELETE, new StatusEvent($status));

        return array();
    }

    /**
     * Check if current user can delete $status
     *
     * @param StatusInterface $status
     *
     * @return boolean
     */
    protected function isDeleteGranted(StatusInterface $status)
    {
        return $this->isGranted(ContributionActionInterface::DELETE, $status)
            && $this->get('open_orchestra_backoffice.business_rules_manager')->isGranted(BusinessActionInterface::DELETE, $status);
    }
}