Completed
Push — master ( df0c35...7f3dc3 )
by Valentyn
03:58
created

UserController::putUsersRoles()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 0
cts 8
cp 0
rs 9.7666
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 6
1
<?php
2
3
namespace App\Users\Controller;
4
5
use App\Controller\BaseController;
6
use App\Users\Entity\User;
7
use App\Users\Entity\UserRoles;
8
use App\Users\Event\UserRegisteredEvent;
9
use App\Users\Repository\ConfirmationTokenRepository;
10
use App\Users\Repository\UserRepository;
11
use App\Users\Request\ConfirmEmailRequest;
12
use App\Users\Request\RegisterUserRequest;
13
use App\Users\Request\UpdateUserRequest;
14
use App\Users\Request\UpdateUserRolesRequest;
15
use App\Users\Service\RegisterService;
16
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
17
use Symfony\Component\HttpFoundation\JsonResponse;
18
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
19
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
20
use Symfony\Component\Routing\Annotation\Route;
21
use Symfony\Component\Translation\TranslatorInterface;
22
use Symfony\Component\Validator\Validator\ValidatorInterface;
23
24
class UserController extends BaseController
25
{
26
    /**
27
     * Registration.
28
     *
29
     * @Route("/api/users", methods={"POST"})
30
     *
31
     * @param RegisterUserRequest      $request
32
     * @param RegisterService          $registerService
33
     * @param EventDispatcherInterface $dispatcher
34
     * @param ValidatorInterface       $validator
35
     *
36
     * @return JsonResponse|\Symfony\Component\HttpFoundation\Response
37
     */
38 3
    public function postUsers(RegisterUserRequest $request, RegisterService $registerService, EventDispatcherInterface $dispatcher, ValidatorInterface $validator)
39
    {
40 3
        if ($this->getUser() !== null) {
41
            throw new AccessDeniedHttpException();
42
        }
43
44 3
        $registeredUser = $registerService->registerByRequest($request);
45 3
        $errors = $validator->validate($registeredUser);
46
47 3
        if ($errors && $errors->count() !== 0) {
48 1
            return $request->getErrorResponse($errors);
49
        }
50
51 2
        $em = $this->getDoctrine()->getManager();
52 2
        $em->persist($registeredUser);
53 2
        $em->flush();
54
55 2
        $userRegisteredEvent = new UserRegisteredEvent($registeredUser);
56 2
        $dispatcher->dispatch(UserRegisteredEvent::NAME, $userRegisteredEvent);
57
58 2
        return $this->response($registeredUser, 200, [], [
59 2
            'groups' => ['view'],
60
        ]);
61
    }
62
63
    /**
64
     * Confirm email.
65
     *
66
     * @Route("/api/confirmEmail", methods={"POST"})
67
     *
68
     * @param ConfirmEmailRequest         $request
69
     * @param ConfirmationTokenRepository $confirmationTokenRepository
70
     * @param TranslatorInterface         $translator
71
     *
72
     * @throws
73
     *
74
     * @return JsonResponse
75
     */
76 2
    public function postConfirmEmail(ConfirmEmailRequest $request, ConfirmationTokenRepository $confirmationTokenRepository, TranslatorInterface $translator)
77
    {
78 2
        $token = $request->get('token');
79
80 2
        if (null === $confirmationToken = $confirmationTokenRepository->findByToken($token)) {
81 1
            throw new NotFoundHttpException($translator->trans('bad_email_confirmation_token', [
82 1
                'token' => $token,
83 1
            ], 'users'));
84
        }
85
86 1
        $user = $confirmationToken->getUser();
87 1
        $user->confirmEmail();
88
89 1
        $entityManager = $this->getDoctrine()->getManager();
90 1
        $entityManager->persist($user);
91 1
        $entityManager->remove($confirmationToken);
92 1
        $entityManager->flush();
93
94 1
        return new JsonResponse(null, 202);
95
    }
96
97
    /**
98
     * todo use param converter?
99
     * Get single user.
100
     *
101
     * @Route("/api/users/{id}", methods={"GET"}, requirements={"id"="\d+"})
102
     *
103
     * @param $id
104
     * @param TranslatorInterface $translator
105
     *
106
     * @return JsonResponse
107
     */
108 3
    public function getUsers($id, TranslatorInterface $translator)
109
    {
110 3
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
111
        /** @var $userRepository \App\Users\Repository\UserRepository */
112 2
        $userRepository = $this->getDoctrine()->getRepository(User::class);
113 2
        $user = $userRepository->find($id);
114
115 2
        if ($user === null) {
116 1
            throw new NotFoundHttpException($translator->trans('not_found_by_id', [
117 1
                'user_id' => $id,
118 1
            ], 'users'));
119
        }
120
121 1
        return $this->response($user, 200, [], [
122 1
            'groups' => ['view'],
123
        ]);
124
    }
125
126
    /**
127
     * Get single user by username.
128
     *
129
     * @Route("/api/users/byUsername/{username}", methods={"GET"})
130
     *
131
     * @param User $user
132
     *
133
     * @return JsonResponse
134
     */
135
    public function getUsersByUsername(User $user)
136
    {
137
        return $this->response($user, 200, [], [
138
            'groups' => ['view'],
139
        ]);
140
    }
141
142
    /**
143
     * @Route("/api/users/{id}", methods={"POST", "PUT", "PATCH"}, requirements={"id"="\d+"})
144
     *
145
     * @param User              $user
146
     * @param UpdateUserRequest $request
147
     *
148
     * @throws \Exception
149
     *
150
     * @return JsonResponse
151
     */
152 4
    public function putUsers(User $user, UpdateUserRequest $request)
153
    {
154 4
        $currentUser = $this->getUser();
155 4
        if ($currentUser === null) {
156 1
            $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
157
        }
158
159
        /** @var $currentUser User */
160 3
        if ($currentUser->getId() !== $user->getId()) {
161 2
            $this->denyAccessUnlessGranted(UserRoles::ROLE_ADMIN);
162
        }
163
164 2
        $profile = $user->getProfile();
165 2
        $profileData = $request->get('profile');
166 2
        $profile->setFirstName($profileData['first_name']);
167 2
        $profile->setLastName($profileData['last_name']);
168 2
        $profile->setBirthDate(new \DateTimeImmutable($profileData['birth_date']));
169 2
        $profile->setAbout($profileData['about']);
170 2
        $profile->setPublicEmail($profileData['public_email']);
171 2
        $profile->setCountryCode($profileData['country_code']);
172 2
        $this->getDoctrine()->getManager()->flush();
173
174 2
        return new JsonResponse(null, 202);
175
    }
176
177
    /**
178
     * @Route("/api/users/{id}/roles", methods={"POST", "PUT", "PATCH"}, requirements={"id"="\d+"})
179
     *
180
     * @param User              $user
181
     * @param UpdateUserRequest $request
182
     *
183
     * @throws \Exception
184
     *
185
     * @return JsonResponse
186
     */
187
    public function putUsersRoles(User $user, UpdateUserRolesRequest $request)
188
    {
189
        $this->denyAccessUnlessGranted(UserRoles::ROLE_ADMIN);
190
191
        $roles = $request->get('roles');
192
        $user->getRolesObject()->removeRole(UserRoles::ROLE_MODERATOR);
193
194
        foreach ($roles as $role) {
195
            $user->getRolesObject()->addRole($role);
196
        }
197
198
        $this->getDoctrine()->getManager()->flush();
199
200
        return new JsonResponse(null, 202);
201
    }
202
203
    /**
204
     * Get all users.
205
     *
206
     * @Route("/api/users", methods={"GET"})
207
     */
208 3
    public function getAll()
209
    {
210 3
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
211
212
        /**
213
         * @var UserRepository
214
         */
215 2
        $userRepository = $this->getDoctrine()->getRepository(User::class);
216 2
        $users = $userRepository->findAll();
217
218 2
        return $this->response($users, 200, [], [
219 2
            'groups' => ['list'],
220
        ]);
221
    }
222
223
    /**
224
     * @Route("/api/users/me", methods={"GET"})
225
     */
226 5
    public function getMe()
227
    {
228 5
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
229
230 5
        return $this->response($this->getUser(), 200, [], [
231 5
            'groups' => ['view'],
232
        ]);
233
    }
234
}
235