Completed
Push — master ( 3460d4...501fc3 )
by Paweł
76:02 queued 29:07
created

RouteController   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 168
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 12

Test Coverage

Coverage 27.91%

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 12
dl 0
loc 168
ccs 12
cts 43
cp 0.2791
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A ensureRouteExists() 0 6 2
A listAction() 0 10 1
A getAction() 0 4 1
A deleteAction() 0 13 2
A createAction() 0 19 2
A updateAction() 0 17 2
A findOr404() 0 8 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
     *     filters={
45
     *         {"name"="type", "dataType"="string", "pattern"="collection|content"}
46
     *     }
47
     * )
48
     * @Route("/api/{version}/content/routes/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_list_routes")
49
     * @Method("GET")
50
     *
51
     * @Cache(expires="10 minutes", public=true)
52
     */
53
    public function listAction(Request $request)
54
    {
55
        $routeRepository = $this->get('swp.repository.route');
56
57
        $routes = $routeRepository->getPaginatedByCriteria(new Criteria([
58
            'type' => $request->query->get('type', ''),
59
        ]), [], new PaginationData($request));
60
61
        return $this->handleView(View::create($this->get('swp_pagination_rep')->createRepresentation($routes, $request), 200));
62
    }
63
64
    /**
65
     * Show single tenant route.
66
     *
67
     * @ApiDoc(
68
     *     resource=true,
69
     *     description="Show single tenant route",
70
     *     statusCodes={
71
     *         200="Returned on success."
72
     *     }
73
     * )
74
     * @Route("/api/{version}/content/routes/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_show_routes", requirements={"id"=".+"})
75
     * @Method("GET")
76
     *
77
     * @Cache(expires="10 minutes", public=true)
78
     */
79
    public function getAction($id)
80
    {
81
        return new SingleResourceResponse($this->findOr404($id));
82
    }
83
84
    /**
85
     * Delete single tenant route.
86
     *
87
     * @ApiDoc(
88
     *     resource=true,
89
     *     description="Delete single tenant route",
90
     *     statusCodes={
91
     *         204="Returned on success."
92
     *     }
93
     * )
94
     * @Route("/api/{version}/content/routes/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_delete_routes", requirements={"id"=".+"})
95
     * @Method("DELETE")
96
     */
97
    public function deleteAction($id)
98
    {
99
        $repository = $this->get('swp.repository.route');
100
        $route = $this->findOr404($id);
101
102
        if (null !== $route->getContent()) {
103
            throw new ConflictHttpException('Route has content attached to it.');
104
        }
105
106
        $repository->remove($route);
107
108
        return $this->handleView(View::create(true, 204));
109
    }
110
111
    /**
112
     * Creates routes for current tenant.
113
     *
114
     * Parameter `type` cane have one of two values: `content` or `collection`.
115
     *
116
     * @ApiDoc(
117
     *     resource=true,
118
     *     description="Create new route",
119
     *     statusCodes={
120
     *         201="Returned on success.",
121
     *         400="Returned when not valid data."
122
     *     },
123
     *     input="SWP\Bundle\ContentBundle\Form\Type\RouteType"
124
     * )
125
     * @Route("/api/{version}/content/routes/", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_create_routes")
126
     * @Method("POST")
127
     */
128 7
    public function createAction(Request $request)
129
    {
130
        /** @var RouteInterface $route */
131 7
        $route = $this->get('swp.factory.route')->create();
132 7
        $form = $this->createForm(RouteType::class, $route, ['method' => $request->getMethod()]);
133
134 7
        $form->handleRequest($request);
135 7
        $this->ensureRouteExists($route->getName());
136
137 7
        if ($form->isValid()) {
138 7
            $route = $this->get('swp.service.route')->createRoute($form->getData());
139
140 7
            $this->get('swp.repository.route')->add($route);
141
142 7
            return new SingleResourceResponse($route, new ResponseContext(201));
143
        }
144
145
        return new SingleResourceResponse($form, new ResponseContext(400));
146
    }
147
148
    /**
149
     * Updates routes for current tenant.
150
     *
151
     * Parameter `type` cane have one of two values: `content` or `collection`.
152
     *
153
     * @ApiDoc(
154
     *     resource=true,
155
     *     description="Update single route",
156
     *     statusCodes={
157
     *         200="Returned on success.",
158
     *         400="Returned when not valid data.",
159
     *         404="Returned when not found.",
160
     *         409="Returned on conflict."
161
     *     },
162
     *     input="SWP\Bundle\ContentBundle\Form\Type\RouteType"
163
     * )
164
     * @Route("/api/{version}/content/routes/{id}", options={"expose"=true}, defaults={"version"="v1"}, name="swp_api_content_update_routes", requirements={"id"=".+"})
165
     * @Method("PATCH")
166
     */
167
    public function updateAction(Request $request, $id)
168
    {
169
        $objectManager = $this->get('swp.object_manager.route');
170
        $route = $this->findOr404($id);
171
        $form = $this->createForm(RouteType::class, $route, ['method' => $request->getMethod()]);
172
        $form->handleRequest($request);
173
174
        if ($form->isValid()) {
175
            $route = $this->get('swp.service.route')->updateRoute($form->getData());
176
177
            $objectManager->flush();
178
179
            return $this->handleView(View::create($route, 200));
180
        }
181
182
        return $this->handleView(View::create($form, 400));
183
    }
184
185
    private function findOr404($id)
186
    {
187
        if (null === $route = $this->get('swp.provider.route')->getOneById($id)) {
188
            throw new NotFoundHttpException('Route was not found.');
189
        }
190
191
        return $route;
192
    }
193
194 7
    private function ensureRouteExists($name)
195
    {
196 7
        if (null !== $this->get('swp.repository.route')->findOneByName($name)) {
197
            throw new ConflictHttpException(sprintf('Route "%s" already exists!', $name));
198
        }
199 7
    }
200
}
201