Completed
Push — master ( a8ce2f...c024d2 )
by Valentyn
03:21
created

UserController::getUsers()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 17
ccs 10
cts 10
cp 1
rs 9.7
c 0
b 0
f 0
cc 2
nc 2
nop 2
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 3
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
109
        /** @var $userRepository \App\Users\Repository\UserRepository */
110 2
        $userRepository = $this->getDoctrine()->getRepository(User::class);
111 2
        $user = $userRepository->find($id);
112
113 2
        if ($user === null) {
114 1
            throw new NotFoundHttpException($translator->trans('not_found_by_id', [
115 1
                'user_id' => $id,
116 1
            ], 'users'));
117
        }
118
119 1
        return $this->response($user, 200, [], [
120 1
            'groups' => ['view'],
121
        ]);
122
    }
123
124
    /**
125
     * Get single user by username.
126
     *
127
     * @Route("/api/users/byUsername/{username}", methods={"GET"})
128
     *
129
     * @param User $user
130
     *
131
     * @return JsonResponse
132
     */
133
    public function getUsersByUsername(User $user)
134
    {
135
        return $this->response($user, 200, [], [
136
            'groups' => ['view'],
137
        ]);
138
    }
139
140
    /**
141
     * @Route("/api/users/{id}", methods={"POST", "PUT", "PATCH"}, requirements={"id"="\d+"})
142
     *
143
     * @param User              $user
144
     * @param UpdateUserRequest $request
145
     *
146
     * @throws \Exception
147
     *
148
     * @return JsonResponse
149
     */
150 4
    public function putUsers(User $user, UpdateUserRequest $request)
151
    {
152 4
        $currentUser = $this->getUser();
153 4
        if ($currentUser === null) {
154 1
            $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
155
        }
156
157
        /** @var $currentUser User */
158 3
        if ($currentUser->getId() !== $user->getId()) {
159 2
            $this->denyAccessUnlessGranted(UserRoles::ROLE_ADMIN);
160
        }
161
162 2
        $profile = $user->getProfile();
163 2
        $profileData = $request->get('profile');
164 2
        $profile->setFirstName($profileData['first_name']);
165 2
        $profile->setLastName($profileData['last_name']);
166 2
        $profile->setBirthDate(new \DateTimeImmutable($profileData['birth_date']));
167 2
        $profile->setAbout($profileData['about']);
168 2
        $profile->setPublicEmail($profileData['public_email']);
169 2
        $this->getDoctrine()->getManager()->flush();
170
171 2
        return new JsonResponse(null, 202);
172
    }
173
174
    /**
175
     * Get all users.
176
     *
177
     * @Route("/api/users", methods={"GET"})
178
     */
179 3
    public function getAll()
180
    {
181 3
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
182
183
        /**
184
         * @var UserRepository
185
         */
186 2
        $userRepository = $this->getDoctrine()->getRepository(User::class);
187 2
        $users = $userRepository->findAll();
188
189 2
        return $this->response($users, 200, [], [
190 2
            'groups' => ['list'],
191
        ]);
192
    }
193
194
    /**
195
     * @Route("/api/users/me", methods={"GET"})
196
     */
197 5
    public function getMe()
198
    {
199 5
        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
200
201 5
        return $this->response($this->getUser(), 200, [], [
202 5
            'groups' => ['view'],
203
        ]);
204
    }
205
}
206