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 / 226
JobController
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
1482
0.00% covered (danger)
0.00%
0 / 226
 indexAction
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 25
 newAction
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 23
 showAction
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 26
 editAction
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 27
 updateAction
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 43
 deleteAction
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 31
 createNewForm
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 10
 createEditForm
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 11
 createDeleteForm
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 7
 createJobFilteringForm
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 9
 getMandates
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 14
<?php
/*
 * This file is part of the Incipio package.
 *
 * (c) Théo FIDRY <theo.fidry@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace FrontBundle\Controller;
use FrontBundle\Form\Type\JobFilteringType;
use FrontBundle\Form\Type\JobType;
use GuzzleHttp\Exception\RequestException as ClientRequestException;
use GuzzleHttp\Exception\TransferException as ClientTransferException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
 * @Route("/jobs")
 *
 * @author Théo FIDRY <theo.fidry@gmail.com>
 */
class JobController extends BaseController
{
    /**
     * Lists all Job entities.
     *
     * @Route("/", name="jobs")
     *
     * @Method({"GET", "POST"})
     * @Template()
     *
     * @param Request $request
     *
     * @return array
     */
    public function indexAction(Request $request)
    {
        $filterForm = $this->createJobFilteringForm($request);
        $jobRequest = $this->createRequest('GET', 'api_jobs_cget', $request);
        // Check if a request has been made to filter the list of users
        if ('POST' === $request->getMethod()) {
            // Handle filter form
            $filterForm->handleRequest($request);
            if ($filterForm->isSubmitted() && $filterForm->isValid()) {
                $data = $filterForm->getData();
                $query = '';
                // Update user request to filter the list of users to match the requested type
                if (null !== $data['mandate_id']) {
                    $query .= sprintf('&filter[where][mandate]=%s', $data['mandate_id']);
                }
                $jobRequest->setQuery($query);
            }
        }
        // Retrieve users, since it's a paginated collection go through all available pages
        try {
            $jobs = $this->sendAndDecode($jobRequest, true);
        } catch (ClientTransferException $exception) {
            $this->handleGuzzleException($exception);
            $jobs = [];
        }
        return [
            'jobs' => $jobs,
            'filter_form' => $filterForm->createView(),
        ];
    }
    /**
     * @Route("/new", name="jobs_new")
     * @Method({"GET", "POST"})
     * @Template()
     *
     * @param Request $request
     *
     * @return array
     */
    public function newAction(Request $request)
    {
        $newForm = $this->createNewForm($request);
        $newForm->handleRequest($request);
        if ($newForm->isSubmitted() && $newForm->isValid()) {
            try {
                $job = $this->sendAndDecode(
                    $this->createRequest(
                        'POST',
                        'api_jobs_cpost',
                        $request,
                        [
                            'json' => $newForm->getData(),
                        ]
                    )
                );
                // Job properly created, redirect to job show view
                $this->addFlash('success', 'Le poste bien a été créé.');
                return $this->redirectToRoute('jobs_show', ['id' => $job['@id']]);
            } catch (ClientTransferException $exception) {
                $this->handleGuzzleException($exception);
            }
        }
        return ['new_form' => $this->createNewForm($request, $newForm->getData())->createView()];
    }
    /**
     * Finds and displays a Job entity.
     *
     * @Route("/{id}", name="jobs_show")
     *
     * @Method("GET")
     * @Template()
     *
     * @param Request $request
     * @param int     $id
     *
     * @return array
     */
    public function showAction(Request $request, $id)
    {
        try {
            $job = $this->sendAndDecode(
                $this->createRequest(
                    'GET',
                    'api_jobs_get',
                    $request,
                    ['parameters' => ['id' => $id]]
                )
            );
            return [
                'delete_form' => $this->createDeleteForm($id)->createView(),
                'job' => $job,
            ];
        } catch (ClientRequestException $exception) {
            if (null !== $exception->getResponse()
                && Response::HTTP_NOT_FOUND === $exception->getResponse()->getStatusCode()
            ) {
                throw $this->createNotFoundException('Unable to find Job entity.');
            }
            $this->handleGuzzleException($exception);
        } catch (ClientTransferException $exception) {
            $this->handleGuzzleException($exception);
        }
        return $this->redirectToRoute('jobs');
    }
    /**
     * @Route("/{id}/edit", name="jobs_edit")
     *
     * @Method("GET")
     * @Template()
     *
     * @param Request $request
     * @param int     $id
     *
     * @return array
     */
    public function editAction(Request $request, $id)
    {
        $job = [];
        try {
            $job = $this->sendAndDecode(
                $this->createRequest(
                    'GET',
                    'api_jobs_get',
                    $request,
                    ['parameters' => ['id' => $id]]
                )
            );
            return [
                'job' => $job,
                'edit_form' => $this->createEditForm($job, $request)->createView(),
            ];
        } catch (ClientRequestException $exception) {
            if (null !== $exception->getResponse()
                && Response::HTTP_NOT_FOUND === $exception->getResponse()->getStatusCode()
            ) {
                throw $this->createNotFoundException('Unable to find User entity.');
            }
            $this->handleGuzzleException($exception);
        } catch (ClientTransferException $exception) {
            $this->handleGuzzleException($exception);
        }
        return ['edit_form' => $this->createEditForm($job, $request)->createView()];
    }
    /**
     * Edits an existing Job entity.
     *
     * @Route("/{id}", name="jobs_update")
     *
     * @Method("PUT")
     * @Template("FrontBundle:Job:edit.html.twig")
     *
     * @param Request $request
     * @param int     $id
     *
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function updateAction(Request $request, $id)
    {
        $job = [];
        try {
            // Get the job to check if exist and to retrieve its data
            $job = $this->sendAndDecode(
                $this->createRequest(
                    'GET',
                    'api_jobs_get',
                    $request,
                    ['parameters' => ['id' => $id]]
                )
            );
            // Handle update request
            $editForm = $this->createEditForm($job, $request);
            $editForm->handleRequest($request);
            if ($editForm->isValid()) {
                $this->client->send(
                    $this->createRequest(
                        'PUT',
                        'api_jobs_put',
                        $request,
                        [
                            'json' => $editForm->getData(),
                            'parameters' => ['id' => $id],
                        ]
                    )
                );
                $this->addFlash('success', 'Le poste a bien été mis à jour.');
                return $this->redirectToRoute('jobs_show', ['id' => $id]);
            }
        } catch (ClientRequestException $exception) {
            if (null !== $exception->getResponse()
                && Response::HTTP_NOT_FOUND === $exception->getResponse()->getStatusCode()
            ) {
                throw $this->createNotFoundException('Unable to find Job entity.');
            }
            $this->handleGuzzleException($exception);
        } catch (ClientTransferException $exception) {
            $this->handleGuzzleException($exception);
        }
        return [
            'job' => $job,
            'edit_form' => $this->createEditForm($job, $request)->createView(),
        ];
    }
    /**
     * Deletes a Job entity.
     *
     * @Route("/{id}", name="jobs_delete")
     *
     * @Method("DELETE")
     *
     * @param Request $request
     * @param         $id
     *
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function deleteAction(Request $request, $id)
    {
        $deleteForm = $this->createDeleteForm($id);
        $deleteForm->handleRequest($request);
        if ($deleteForm->isValid()) {
            try {
                $this->client->send(
                    $this->createRequest(
                        'DELETE',
                        'api_jobs_delete',
                        $request,
                        [
                            'parameters' => ['id' => $id],
                        ]
                    )
                );
                $this->addFlash('success', 'Le poste a bien été supprimé.');
            } catch (ClientRequestException $exception) {
                if (null !== $exception->getResponse()
                    && Response::HTTP_NOT_FOUND === $exception->getResponse()->getStatusCode()
                ) {
                    throw $this->createNotFoundException('Unable to find Job entity.');
                }
                $this->handleGuzzleException($exception);
            } catch (ClientTransferException $exception) {
                $this->handleGuzzleException($exception);
            }
        } else {
            $this->addFlash('error', $deleteForm->getErrors());
        }
        return $this->redirectToRoute('jobs');
    }
    /**
     * Creates a form to create a Job entity.
     *
     * @param array|null $job The normalized job.
     *
     * @return \Symfony\Component\Form\Form
     */
    private function createNewForm(Request $request, array $job = [])
    {
        $form = $this->createForm(new JobType($this->getMandates($request)),
            $job,
            [
                'action' => $this->generateUrl('jobs_new'),
                'method' => 'POST',
            ]
        );
        return $form;
    }
    /**
     * Creates a form to edit a Job entity.
     *
     * @param array   $job     The normalized job.
     * @param Request $request
     *
     * @return \Symfony\Component\Form\Form The form
     */
    private function createEditForm(array $job, Request $request)
    {
        $form = $this->createForm(
            new JobType($this->getMandates($request)),
            $job,
            [
                'action' => $this->generateUrl('jobs_update', ['id' => $job['@id']]),
                'method' => 'PUT',
            ]
        );
        return $form;
    }
    /**
     * Creates a form to delete a Job entity by id.
     *
     * @param int $id The entity id
     *
     * @return \Symfony\Component\Form\Form The form
     */
    private function createDeleteForm($id)
    {
        return $this->createFormBuilder()
            ->setAction($this->generateUrl('jobs_delete', ['id' => $id]))
            ->setMethod('DELETE')
            ->getForm()
        ;
    }
    /**
     * @param Request $request
     *
     * @return \Symfony\Component\Form\FormInterface
     */
    private function createJobFilteringForm(Request $request)
    {
        return $this->createForm(new JobFilteringType($this->getMandates($request)),
            [
                'action' => $this->generateUrl('jobs'),
                'method' => 'POST',
            ])
            ->add('submit', 'submit', ['label' => 'Filtrer'])
        ;
    }
    /**
     * @param Request $request
     *
     * @return array
     */
    private function getMandates(Request $request)
    {
        $mandateFormValues = [];
        $mandates = $this->requestAndDecode(
            'GET',
            'api_mandates_cget',
            $request,
            ['query' => 'filter[order][startAt]=desc'],
            true
        );
        foreach ($mandates as $mandate) {
            $mandateFormValues[$mandate['@id']] = $mandate['name'];
        }
        return $mandateFormValues;
    }
}