Completed
Push — master ( 50cc67...a8ce2f )
by Valentyn
03: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\Security\Core\Exception\BadCredentialsException;
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
     * @return JsonResponse
73
     */
74 2
    public function postConfirmEmail(ConfirmEmailRequest $request, ConfirmationTokenRepository $confirmationTokenRepository, TranslatorInterface $translator)
75
    {
76 2
        $token = $request->get('token');
77
78 2
        if (null === $confirmationToken = $confirmationTokenRepository->findByToken($token)) {
79 1
            throw new BadCredentialsException($translator->trans('bad_email_confirmation_token', [
80 1
                'token' => $token,
81 1
            ], 'users'));
82
        }
83
84 1
        $user = $confirmationToken->getUser();
85 1
        $user->confirmEmail();
86
87 1
        $entityManager = $this->getDoctrine()->getManager();
88 1
        $entityManager->persist($user);
89 1
        $entityManager->remove($confirmationToken);
90 1
        $entityManager->flush();
91
92 1
        return new JsonResponse(null, 202);
93
    }
94
95
    /**
96
     * todo use param converter?
97
     * Get single user.
98
     *
99
     * @Route("/api/users/{id}", methods={"GET"}, requirements={"id"="\d+"})
100
     *
101
     * @param $id
102
     * @param TranslatorInterface $translator
103
     *
104
     * @return JsonResponse
105
     */
106 3
    public function getUsers($id, TranslatorInterface $translator)
107
    {
108
        /** @var $userRepository \App\Users\Repository\UserRepository */
109 3
        $userRepository = $this->getDoctrine()->getRepository(User::class);
110 3
        $user = $userRepository->find($id);
111
112 3
        if ($user === null) {
113 1
            throw new NotFoundHttpException($translator->trans('not_found_by_id', [
114 1
                'user_id' => $id,
115 1
            ], 'users'));
116
        }
117
118 2
        return $this->response($user, 200, [], [
119 2
            'groups' => ['view'],
120
        ]);
121
    }
122
123
    /**
124
     * Get single user by username.
125
     *
126
     * @Route("/api/users/{username}", methods={"GET"})
127
     *
128
     * @param User $user
129
     *
130
     * @return JsonResponse
131
     */
132
    public function getUsersByUsername(User $user)
133
    {
134
        return $this->response($user, 200, [], [
135
            'groups' => ['view'],
136
        ]);
137
    }
138
139
    /**
140
     * @Route("/api/users/{id}", methods={"POST", "PUT", "PATCH"}, requirements={"id"="\d+"})
141
     *
142
     * @param User              $user
143
     * @param UpdateUserRequest $request
144
     *
145
     * @throws \Exception
146
     *
147
     * @return JsonResponse
148
     */
149
    public function putUsers(User $user, UpdateUserRequest $request)
150
    {
151
        $currentUser = $this->getUser();
152
        if ($currentUser === null) {
153
            $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
154
        }
155
156
        /** @var $currentUser User */
157
        if ($currentUser->getId() !== $user->getId()) {
158
            $this->denyAccessUnlessGranted(UserRoles::ROLE_ADMIN);
159
        }
160
161
        $profile = $user->getProfile();
162
        $profileData = $request->get('profile');
163
        $profile->setFirstName($profileData['first_name']);
164
        $profile->setLastName($profileData['last_name']);
165
        $profile->setBirthDate(new \DateTimeImmutable($profileData['birth_date']));
166
        $profile->setAbout($profileData['about']);
167
        $profile->setPublicEmail($profileData['public_email']);
168
        $this->getDoctrine()->getManager()->flush();
169
170
        return new JsonResponse(null, 202);
171
    }
172
173
    /**
174
     * Get all users.
175
     *
176
     * @Route("/api/users", methods={"GET"})
177
     */
178 3
    public function getAll()
179
    {
180 3
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
181
182
        /**
183
         * @var UserRepository
184
         */
185 2
        $userRepository = $this->getDoctrine()->getRepository(User::class);
186 2
        $users = $userRepository->findAll();
187
188 2
        return $this->response($users, 200, [], [
189 2
            'groups' => ['list'],
190
        ]);
191
    }
192
193
    /**
194
     * @Route("/api/users/me", methods={"GET"})
195
     */
196
    public function getMe()
197
    {
198
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
199
200
        return $this->response($this->getUser(), 200, [], [
201
            'groups' => ['view'],
202
        ]);
203
    }
204
}
205