Completed
Push — master ( 0c2413...d80943 )
by one
07:40
created

UserController   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 189
Duplicated Lines 0 %

Test Coverage

Coverage 95%

Importance

Changes 0
Metric Value
wmc 12
eloc 36
dl 0
loc 189
ccs 38
cts 40
cp 0.95
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A createAction() 0 21 3
A deleteAction() 0 10 2
A listAction() 0 6 1
A showAction() 0 7 2
A __construct() 0 3 1
A updateAction() 0 21 3
1
<?php
2
3
/*
4
 * (c) Lukasz D. Tulikowski <[email protected]>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
declare(strict_types=1);
11
12
namespace App\Controller;
13
14
use App\Entity\User;
15
use App\Exception\ApiException;
16
use App\Form\Filter\UserFilter;
17
use App\Form\UserType;
18
use App\Interfaces\ControllerInterface;
19
use Nelmio\ApiDocBundle\Annotation\Model;
20
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
21
use Swagger\Annotations as SWG;
22
use Symfony\Component\HttpFoundation\JsonResponse;
23
use Symfony\Component\HttpFoundation\Request;
24
use Symfony\Component\HttpFoundation\Response;
25
use Symfony\Component\Routing\Annotation\Route;
26
27
/**
28
 * @Route(path="/users")
29
 */
30
class UserController extends AbstractController implements ControllerInterface
31
{
32
    /**
33
     * UserController constructor.
34
     */
35 12
    public function __construct()
36
    {
37 12
        parent::__construct(User::class);
38 12
    }
39
40
    /**
41
     * Get all Users.
42
     *
43
     * @Route(name="api_user_list", methods={Request::METHOD_GET})
44
     *
45
     * @SWG\Tag(name="User")
46
     * @SWG\Response(
47
     *     response=200,
48
     *     description="Returns the list of users",
49
     *     @SWG\Schema(
50
     *         type="array",
51
     *         @SWG\Items(ref=@Model(type=User::class))
52
     *     )
53
     * )
54
     *
55
     * @param Request $request
56
     *
57
     * @return JsonResponse
58
     */
59 2
    public function listAction(Request $request): JsonResponse
60
    {
61 2
        return $this->createCollectionResponse(
62 2
            $this->handleFilterForm(
63 2
                $request,
64 2
                UserFilter::class
65
            )
66
        );
67
    }
68
69
    /**
70
     * Show single Users.
71
     *
72
     * @Route(path="/{user}", name="api_user_show", methods={Request::METHOD_GET})
73
     *
74
     * @SWG\Tag(name="User")
75
     * @SWG\Response(
76
     *     response=200,
77
     *     description="Returns user of given identifier.",
78
     *     @SWG\Schema(
79
     *         type="object",
80
     *         title="user",
81
     *         @SWG\Items(ref=@Model(type=User::class))
82
     *     )
83
     * )
84
     *
85
     * @param User|null $user
86
     *
87
     * @return JsonResponse
88
     */
89 2
    public function showAction(User $user = null): JsonResponse
90
    {
91 2
        if (false === !!$user) {
92 1
            return $this->createNotFoundResponse();
93
        }
94
95 1
        return $this->createResourceResponse($user);
96
    }
97
98
    /**
99
     * Add new User.
100
     *
101
     * @Route(name="api_user_create", methods={Request::METHOD_POST})
102
     *
103
     * @SWG\Tag(name="User")
104
     * @SWG\Response(
105
     *     response=200,
106
     *     description="Updates User of given identifier and returns the updated object.",
107
     *     @SWG\Schema(
108
     *         type="object",
109
     *         @SWG\Items(ref=@Model(type=User::class))
110
     *     )
111
     * )
112
     *
113
     * @param Request $request
114
     * @param User|null $user
115
     *
116
     * @throws \App\Exception\FormInvalidException
117
     *
118
     * @return JsonResponse
119
     */
120 2
    public function createAction(Request $request, User $user = null): JsonResponse
121
    {
122 2
        if (false === !!$user) {
123 2
            $user = new User();
124
        }
125
126 2
        $form = $this->getForm(
127 2
            UserType::class,
128 2
            $user,
129
            [
130 2
                'method' => $request->getMethod(),
131
            ]
132
        );
133
134
        try {
135 2
            $this->formHandler->process($request, $form);
136 1
        } catch (ApiException $e) {
137 1
            return new JsonResponse($e->getData(), Response::HTTP_BAD_REQUEST);
138
        }
139
140 1
        return $this->createResourceResponse($user, Response::HTTP_CREATED);
141
    }
142
143
    /**
144
     * Edit existing User.
145
     *
146
     * @Route(path="/{user}", name="api_user_edit", methods={Request::METHOD_PATCH})
147
     *
148
     * @SWG\Tag(name="User")
149
     * @SWG\Response(
150
     *     response=200,
151
     *     description="Updates User of given identifier and returns the updated object.",
152
     *     @SWG\Schema(
153
     *         type="object",
154
     *         @SWG\Items(ref=@Model(type=User::class))
155
     *     )
156
     * )*
157
     *
158
     * @param Request $request
159
     * @param User|null $user
160
     *
161
     * @return JsonResponse
162
     *
163
     * @Security("is_granted('CAN_UPDATE_USER', user)")
164
     */
165 2
    public function updateAction(Request $request, User $user = null): JsonResponse
166
    {
167 2
        if (false === !!$user) {
168 1
            return $this->createNotFoundResponse();
169
        }
170
171 1
        $form = $this->getForm(
172 1
            UserType::class,
173 1
            $user,
174
            [
175 1
                'method' => $request->getMethod(),
176
            ]
177
        );
178
179
        try {
180 1
            $this->formHandler->process($request, $form);
181
        } catch (ApiException $e) {
182
            return new JsonResponse($e->getMessage(), Response::HTTP_BAD_REQUEST);
183
        }
184
185 1
        return $this->createResourceResponse($user);
186
    }
187
188
    /**
189
     * Delete User.
190
     *
191
     * @Route(path="/{user}", name="api_user_delete", methods={Request::METHOD_DELETE})
192
     *
193
     * @SWG\Tag(name="User")
194
     * @SWG\Response(
195
     *     response=200,
196
     *     description="Delete User of given identifier and returns the empty object.",
197
     *     @SWG\Schema(
198
     *         type="object",
199
     *         @SWG\Items(ref=@Model(type=User::class))
200
     *     )
201
     * )
202
     *
203
     * @param User $user
204
     *
205
     * @return JsonResponse
206
     *
207
     * @Security("is_granted('CAN_DELETE_USER', user)")
208
     */
209 2
    public function deleteAction(User $user = null): JsonResponse
210
    {
211 2
        if (false === !!$user) {
212 1
            return $this->createNotFoundResponse();
213
        }
214
215 1
        $this->entityManager->remove($user);
216 1
        $this->entityManager->flush();
217
218 1
        return $this->createSuccessfulApiResponse(self::DELETED);
219
    }
220
}
221