UsersController::patchUserAction()   A
last analyzed

Complexity

Conditions 5
Paths 5

Size

Total Lines 30

Duplication

Lines 5
Ratio 16.67 %

Importance

Changes 0
Metric Value
dl 5
loc 30
rs 9.1288
c 0
b 0
f 0
cc 5
nc 5
nop 2
1
<?php
2
3
namespace KI\UserBundle\Controller;
4
5
use KI\CoreBundle\Controller\ResourceController;
6
use KI\UserBundle\Entity\Achievement;
7
use KI\UserBundle\Entity\User;
8
use KI\UserBundle\Event\AchievementCheckEvent;
9
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
10
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
11
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
12
use Symfony\Component\DependencyInjection\ContainerInterface;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
15
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
16
use Exception;
17
18
class UsersController extends ResourceController
19
{
20
    public function setContainer(ContainerInterface $container = null)
21
    {
22
        parent::setContainer($container);
23
        $this->initialize('User', 'User');
24
    }
25
26
    /**
27
     * @ApiDoc(
28
     *  resource=true,
29
     *  description="Liste les utilisateurs",
30
     *  output="KI\UserBundle\Entity\User",
31
     *  statusCodes={
32
     *   200="Requête traitée avec succès",
33
     *   401="Une authentification est nécessaire pour effectuer cette action",
34
     *   403="Pas les droits suffisants pour effectuer cette action",
35
     *   503="Service temporairement indisponible ou en maintenance",
36
     *  },
37
     *  section="Utilisateurs"
38
     * )
39
     * @Route("/users")
40
     * @Method("GET")
41
     */
42
    public function getUsersAction()
43
    {
44
        return $this->getAll();
45
    }
46
47
    /**
48
     * @ApiDoc(
49
     *  description="Retourne un utilisateur",
50
     *  output="KI\UserBundle\Entity\User",
51
     *  statusCodes={
52
     *   200="Requête traitée avec succès",
53
     *   401="Une authentification est nécessaire pour effectuer cette action",
54
     *   403="Pas les droits suffisants pour effectuer cette action",
55
     *   404="Ressource non trouvée",
56
     *   503="Service temporairement indisponible ou en maintenance",
57
     *  },
58
     *  section="Utilisateurs"
59
     * )
60
     * @Route("/users/{slug}")
61
     * @Method("GET")
62
     */
63
    public function getUserAction($slug)
64
    {
65
        $user = $this->getOne($slug, true);
66
67
        return $this->json($user);
68
    }
69
70
    /**
71
     * @ApiDoc(
72
     *  description="Modifie un utilisateur",
73
     *  input="KI\UserBundle\Form\UserType",
74
     *  statusCodes={
75
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
76
     *   400="La syntaxe de la requête est erronée",
77
     *   401="Une authentification est nécessaire pour effectuer cette action",
78
     *   403="Pas les droits suffisants pour effectuer cette action",
79
     *   404="Ressource non trouvée",
80
     *   503="Service temporairement indisponible ou en maintenance",
81
     *  },
82
     *  section="Utilisateurs"
83
     * )
84
     * @Route("/users/{slug}")
85
     * @Method("PATCH")
86
     */
87
    public function patchUserAction(Request $request, $slug)
88
    {
89
        // Les admissibles et extérieurs ne peuvent pas modifier leur profil
90
        if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMISSIBLE')
91
            || $this->get('security.authorization_checker')->isGranted('ROLE_EXTERIEUR')
92
        )
93
            throw new AccessDeniedException();
94
95 View Code Duplication
        if ($request->request->has('image')) {
96
            $dispatcher = $this->container->get('event_dispatcher');
97
            $achievementCheck = new AchievementCheckEvent(Achievement::PHOTO);
98
            $dispatcher->dispatch('upont.achievement', $achievementCheck);
99
        }
100
101
        // Un utilisateur peut se modifier lui même
102
        $user = $this->getUser();
103
        $patchData = $this->patch($slug, $user->getUsername() == $slug);
104
105
        $dispatcher = $this->get('event_dispatcher');
106
        $achievementCheck = new AchievementCheckEvent(Achievement::PROFILE);
107
        $dispatcher->dispatch('upont.achievement', $achievementCheck);
108
109
        if ($request->query->has('achievement')) {
110
            $dispatcher = $this->get('event_dispatcher');
111
            $achievementCheck = new AchievementCheckEvent(Achievement::TOUR);
112
            $dispatcher->dispatch('upont.achievement', $achievementCheck);
113
        }
114
115
        return $this->formJson($patchData);
116
    }
117
118
    /**
119
     * @ApiDoc(
120
     *  description="Supprime un utilisateur",
121
     *  statusCodes={
122
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
123
     *   401="Une authentification est nécessaire pour effectuer cette action",
124
     *   403="Pas les droits suffisants pour effectuer cette action",
125
     *   404="Ressource non trouvée",
126
     *   503="Service temporairement indisponible ou en maintenance",
127
     *  },
128
     *  section="Utilisateurs"
129
     * )
130
     * @Route("/users/{slug}")
131
     * @Method("DELETE")
132
     */
133
    public function deleteUserAction($slug)
134
    {
135
        if (!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
136
            throw new AccessDeniedException();
137
        }
138
        $userManager = $this->get('fos_user.user_manager');
139
        $user = $this->findBySlug($slug);
140
        $userManager->deleteUser($user);
141
142
        return $this->json(null, 204);
143
    }
144
145
    /**
146
     * @ApiDoc(
147
     *  description="Récupère la liste des clubs dont l'utilisateur est membre",
148
     *  output="KI\UserBundle\Entity\Club",
149
     *  statusCodes={
150
     *   200="Requête traitée avec succès",
151
     *   401="Une authentification est nécessaire pour effectuer cette action",
152
     *   403="Pas les droits suffisants pour effectuer cette action",
153
     *   404="Ressource non trouvée",
154
     *   503="Service temporairement indisponible ou en maintenance",
155
     *  },
156
     *  section="Utilisateurs"
157
     * )
158
     * @Route("/users/{slug}/clubs")
159
     * @Method("GET")
160
     */
161
    public function getUserClubsAction($slug)
162
    {
163
        $user = $this->findBySlug($slug);
164
165
        $clubs = $this->repository->getUserClubs($user);
166
167
        return $this->json($clubs, 200);
168
    }
169
170
    /**
171
     * @ApiDoc(
172
     *  description="Crée un compte et envoie un mail avec le mot de passe",
173
     *  requirements={
174
     *   {
175
     *    "name"="firstName",
176
     *    "dataType"="string",
177
     *    "description"="Prénom"
178
     *   },
179
     *   {
180
     *    "name"="lastName",
181
     *    "dataType"="string",
182
     *    "description"="Nom"
183
     *   },
184
     *   {
185
     *    "name"="email",
186
     *    "dataType"="string",
187
     *    "description"="Adresse email"
188
     *   },
189
     *  },
190
     *  statusCodes={
191
     *   201="Requête traitée avec succès avec création d’un document",
192
     *   503="Service temporairement indisponible ou en maintenance",
193
     *  },
194
     *  section="Utilisateurs"
195
     * )
196
     * @Route("/users")
197
     * @Method("POST")
198
     */
199
    public function postUsersAction(Request $request)
200
    {
201
        //On limite la création de compte aux admins
202
        if (!$this->isGranted('ROLE_ADMIN')) {
203
            throw new AccessDeniedException();
204
        }
205
206
        if (!$request->request->has('firstName') || !$request->request->has('lastName') || !$request->request->has('email'))
207
            throw new BadRequestHttpException('Champs non rempli(s)');
208
209
        $lastName = $request->request->get('lastName');
210
        $firstName = $request->request->get('firstName');
211
        $email = $request->request->get('email');
212
213
        if (!preg_match('/@eleves\.enpc\.fr$/', $email)) ///@(eleves\.)?enpc\.fr$/
214
            throw new BadRequestHttpException('Adresse mail non utilisable');
215
216
        // On check si l'utilisateur n'existe pas déjà
217
        $repo = $this->manager->getRepository('KIUserBundle:User');
218
        $users = $repo->findByEmail($email);
219
220
        if (count($users) > 0)
221
            throw new BadRequestHttpException('Cet utilisateur existe déjà.');
222
223
        // Si le login existe déjà, on ajoute une lettre du prénom
224
        $login = strtolower(str_replace(' ', '-', substr($this->stripAccents($lastName), 0, 7) . $this->stripAccents($firstName)[0]));
225
        $i = 1;
226
        while (count($repo->findByUsername($login)) > 0) {
227
            if (isset($firstName[$i]))
228
                $login .= $firstName[$i];
229
            else
230
                $login .= '1';
231
            $i++;
232
        }
233
234
        $attributes = [
235
            'username' => $login,
236
            'email' => $email,
237
            'firstName' => $firstName,
238
            'lastName' => $lastName,
239
        ];
240
241
        $this->get('ki_user.factory.user')->createUser($login, [], $attributes);
242
243
        return $this->json(null, 201);
244
    }
245
246
    /**
247
     * @ApiDoc(
248
     *  description="Crée un compte et envoie un mail avec le mot de passe",
249
     *  requirements={
250
     *   {
251
     *    "name"="users",
252
     *    "dataType"="file",
253
     *    "description"="Prénom"
254
     *   },
255
     *  },
256
     *  statusCodes={
257
     *   201="Requête traitée avec succès avec création d’un document",
258
     *   503="Service temporairement indisponible ou en maintenance",
259
     *  },
260
     *  section="Utilisateurs"
261
     * )
262
     * @Route("/import/users")
263
     * @Method("POST")
264
     */
265
    public function importUsersAction(Request $request)
266
    {
267
        set_time_limit(3600);
268
        if (!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN'))
269
            return $this->json(null, 403);
270
271
        if (!$request->files->has('users'))
272
            throw new BadRequestHttpException('Aucun fichier envoyé');
273
        $file = $request->files->get('users');
274
275
        // Check CSV
276
        if ($file->getMimeType() !== 'text/plain' && $file->getMimeType() !== 'text/csv') {
277
            throw new Exception('L\import doit se faire au moyen d\'un fichier CSV');
278
        }
279
280
        // On récupère le contenu du fichier
281
        $path = __DIR__ . '/../../../../web/uploads/tmp/';
282
        $file->move($path, 'users.list');
283
        $list = fopen($path . 'users.list', 'r+');
284
        if ($list === false)
285
            throw new BadRequestHttpException('Erreur lors de l\'upload du fichier');
286
287
        // Dans un premier temps on va effectuer une première passe pour vérifier qu'il n'y a pas de duplicatas
288
        $fails = $success = [];
289
290
        while (!feof($list)) {
291
            // On enlève le caractère de fin de ligne
292
            $line = str_replace(["\r", "\n"], ['', ''], fgets($list));
293
            if(empty($line))
294
                continue;
295
296
            $gender = $login = $firstName = $lastName = $email = $promo = $department = $origin = null;
0 ignored issues
show
Unused Code introduced by
$login is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
297
            $explode = explode(',', $line);
298
            list($gender, $lastName, $firstName, $email, $origin, $department, $promo) = $explode;
299
            $firstName = ucfirst($firstName);
300
            $lastName = ucwords(mb_strtolower($lastName));
301
302
            $login = explode('@', $email)[0];
303
304
            $e = [];
305
            if (!preg_match('/@(eleves\.)?enpc\.fr$/', $email))
306
                $e[] = 'Adresse mail non utilisable';
307
308
            if (count($e) > 0) {
309
                $fails[] = $line . ' : ' . implode(', ', $e);
310
            } else {
311
312
                /**
313
                 * @var $user User
314
                 */
315
                $user = $this->repository->findOneBy(['email' => $email]);
316
                if (!$user) {
317
                    $attributes = [
318
                        'username' => $login,
319
                        'email' => $email,
320
                        'loginMethod' => 'form',
321
                        'firstName' => $firstName,
322
                        'lastName' => $lastName,
323
                        'promo' => $promo,
324
                        'department' => $department,
325
                        'origin' => $origin,
326
                    ];
327
328
                    $user = $this->get('ki_user.factory.user')->createUser($login, [], $attributes);
329
                } else {
330
                    $user->setPromo($promo);
331
                    $user->setDepartment($department);
332
                    $user->setOrigin($origin);
333
                }
334
                $user->setGender($gender);
335
336
                $success[] = $firstName . ' ' . $lastName;
337
            }
338
        }
339
340
        return $this->json([
341
            'success' => $success,
342
            'fails' => $fails,
343
        ], 201);
344
    }
345
346
    private function stripAccents($string)
347
    {
348
        return str_replace(
349
            ['à', 'á', 'â', 'ã', 'ä', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'Ý'],
350
            ['a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y'],
351
            $string);
352
    }
353
}
354