Completed
Push — master ( c5110b...a167e6 )
by Valentyn
13:46
created

UserController::postConfirmEmail()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 2

Importance

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