Completed
Push — master ( f93802...a3beff )
by Paweł
34:14
created

RouteController::getAction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 2
1
<?php
2
3
/*
4
 * This file is part of the Superdesk Web Publisher Content Bundle.
5
 *
6
 * Copyright 2015 Sourcefabric z.u. and contributors.
7
 *
8
 * For the full copyright and license information, please see the
9
 * AUTHORS and LICENSE files distributed with this source code.
10
 *
11
 * @copyright 2015 Sourcefabric z.ú
12
 * @license http://www.superdesk.org/license
13
 */
14
15
namespace SWP\Bundle\ContentBundle\Controller;
16
17
use FOS\RestBundle\Controller\FOSRestController;
18
use FOS\RestBundle\View\View;
19
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
20
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
21
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
22
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
23
use SWP\Bundle\ContentBundle\Model\RouteInterface;
24
use SWP\Component\Common\Criteria\Criteria;
25
use SWP\Bundle\ContentBundle\Form\Type\RouteType;
26
use SWP\Component\Common\Pagination\PaginationData;
27
use SWP\Component\Common\Response\ResponseContext;
28
use SWP\Component\Common\Response\SingleResourceResponse;
29
use Symfony\Component\HttpFoundation\Request;
30
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
31
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
32
33
class RouteController extends FOSRestController
34
{
35
    /**
36
     * Lists current tenant routes.
37
     *
38
     * @ApiDoc(
39
     *     resource=true,
40
     *     description="Lists current tenant routes",
41
     *     statusCodes={
42
     *         200="Returned on success."
43
     *     }
44
     * )
45
     * @Route("/api/{version}/content/routes/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_list_routes")
46
     * @Method("GET")
47
     *
48
     * @Cache(expires="10 minutes", public=true)
49
     */
50
    public function listAction(Request $request)
51
    {
52
        $routeRepository = $this->get('swp.repository.route');
53
54
        $routes = $routeRepository->getPaginatedByCriteria(new Criteria(), [], new PaginationData($request));
55
56
        return $this->handleView(View::create($this->get('swp_pagination_rep')->createRepresentation($routes, $request), 200));
57
    }
58
59
    /**
60
     * Show single tenant route.
61
     *
62
     * @ApiDoc(
63
     *     resource=true,
64
     *     description="Show single tenant route",
65
     *     statusCodes={
66
     *         200="Returned on success."
67
     *     }
68
     * )
69
     * @Route("/api/{version}/content/routes/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_show_routes", requirements={"id"=".+"})
70
     * @Method("GET")
71
     *
72
     * @Cache(expires="10 minutes", public=true)
73
     */
74
    public function getAction($id)
75
    {
76
        return new SingleResourceResponse($this->findOr404($id));
77
    }
78
79
    /**
80
     * Delete single tenant route.
81
     *
82
     * @ApiDoc(
83
     *     resource=true,
84
     *     description="Delete single tenant route",
85
     *     statusCodes={
86
     *         204="Returned on success."
87
     *     }
88
     * )
89
     * @Route("/api/{version}/content/routes/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_delete_routes", requirements={"id"=".+"})
90
     * @Method("DELETE")
91
     */
92
    public function deleteAction($id)
93
    {
94
        $repository = $this->get('swp.repository.route');
95
        $route = $this->findOr404($id);
96
97
        if (null !== $route->getContent()) {
98
            throw new ConflictHttpException('Route has content attached to it.');
99
        }
100
101
        $repository->remove($route);
102
103
        return $this->handleView(View::create(true, 204));
104
    }
105
106
    /**
107
     * Creates routes for current tenant.
108
     *
109
     * Parameter `type` cane have one of two values: `content` or `collection`.
110
     *
111
     * @ApiDoc(
112
     *     resource=true,
113
     *     description="Create new route",
114
     *     statusCodes={
115
     *         201="Returned on success.",
116
     *         400="Returned when not valid data."
117
     *     },
118
     *     input="SWP\Bundle\ContentBundle\Form\Type\RouteType"
119
     * )
120
     * @Route("/api/{version}/content/routes/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_create_routes")
121
     * @Method("POST")
122
     */
123 7
    public function createAction(Request $request)
124
    {
125
        /** @var RouteInterface $route */
126 7
        $route = $this->get('swp.factory.route')->create();
127 7
        $form = $this->createForm(RouteType::class, $route, ['method' => $request->getMethod()]);
128
129 7
        $form->handleRequest($request);
130 7
        $this->ensureRouteExists($route->getName());
131
132 7
        if ($form->isValid()) {
133 7
            $route = $this->get('swp.service.route')->createRoute($form->getData());
134
135 7
            $this->get('swp.repository.route')->add($route);
136
137 7
            return new SingleResourceResponse($route, new ResponseContext(201));
138
        }
139
140
        return new SingleResourceResponse($form, new ResponseContext(400));
141
    }
142
143
    /**
144
     * Updates routes for current tenant.
145
     *
146
     * Parameter `type` cane have one of two values: `content` or `collection`.
147
     *
148
     * @ApiDoc(
149
     *     resource=true,
150
     *     description="Update single route",
151
     *     statusCodes={
152
     *         200="Returned on success.",
153
     *         400="Returned when not valid data.",
154
     *         404="Returned when not found.",
155
     *         409="Returned on conflict."
156
     *     },
157
     *     input="SWP\Bundle\ContentBundle\Form\Type\RouteType"
158
     * )
159
     * @Route("/api/{version}/content/routes/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_update_routes", requirements={"id"=".+"})
160
     * @Method("PATCH")
161
     */
162
    public function updateAction(Request $request, $id)
163
    {
164
        $objectManager = $this->get('swp.object_manager.route');
165
        $route = $this->findOr404($id);
166
        $form = $this->createForm(RouteType::class, $route, ['method' => $request->getMethod()]);
167
        $form->handleRequest($request);
168
169
        if ($form->isValid()) {
170
            $route = $this->get('swp.service.route')->updateRoute($form->getData());
171
172
            $objectManager->flush();
173
174
            return $this->handleView(View::create($route, 200));
175
        }
176
177
        return $this->handleView(View::create($form, 400));
178
    }
179
180
    private function findOr404($id)
181
    {
182
        if (null === $route = $this->get('swp.provider.route')->getOneById($id)) {
183
            throw new NotFoundHttpException('Route was not found.');
184
        }
185
186
        return $route;
187
    }
188
189 7
    private function ensureRouteExists($name)
190
    {
191 7
        if (null !== $this->get('swp.repository.route')->findOneByName($name)) {
192
            throw new ConflictHttpException(sprintf('Route "%s" already exists!', $name));
193
        }
194 7
    }
195
}
196