Completed
Push — master ( 096baa...85634b )
by Louis
26s queued 13s
created

OwnController   F

Complexity

Total Complexity 75

Size/Duplication

Total Lines 742
Duplicated Lines 3.64 %

Coupling/Cohesion

Components 1
Dependencies 15

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 75
lcom 1
cbo 15
dl 27
loc 742
rs 1.8461
c 2
b 0
f 0

23 Methods

Rating   Name   Duplication   Size   Complexity  
D getNotificationsAction() 0 32 9
A setContainer() 0 5 1
A getAchievementsAction() 0 4 1
A getUserAchievementsAction() 0 5 1
A getDevicesAction() 0 8 2
B postDeviceAction() 0 26 5
A deleteDeviceAction() 0 17 3
A getOwnEventsAction() 0 16 2
A getOwnCalendarAction() 0 20 2
A getNewsItemsAction() 16 16 1
A getCourseitemsAction() 0 4 1
B changePreferenceAction() 0 17 5
A removePreferenceAction() 0 18 4
A getPreferencesAction() 0 5 1
A getTokenAction() 0 6 1
A getOwnFixsAction() 0 20 2
A getOwnUserAction() 0 4 1
B postOwnUserAction() 0 23 6
D retrieveAchievements() 11 85 14
A getFollowedAction() 0 4 1
A getFollowedClubs() 0 16 4
B getCourseitems() 0 23 6
A getOwnCoursesAction() 0 11 2

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like OwnController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use OwnController, and based on these observations, apply Extract Interface, too.

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\Device;
8
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
9
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
10
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
11
use Symfony\Component\DependencyInjection\ContainerInterface;
12
use Symfony\Component\HttpFoundation\JsonResponse;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpFoundation\Response;
15
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
16
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
17
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
18
19
class OwnController extends ResourceController
20
{
21
    public function setContainer(ContainerInterface $container = null)
22
    {
23
        parent::setContainer($container);
24
        $this->initialize('User', 'User');
25
    }
26
27
    /**
28
     * @ApiDoc(
29
     *  description="Renvoie des détails sur les achievements et le niveau de l'utilisateur",
30
     *  statusCodes={
31
     *   200="Requête traitée avec succès",
32
     *   401="Une authentification est nécessaire pour effectuer cette action",
33
     *   403="Pas les droits suffisants pour effectuer cette action",
34
     *   503="Service temporairement indisponible ou en maintenance",
35
     *  },
36
     *  section="Utilisateurs"
37
     * )
38
     * @Route("/own/achievements")
39
     * @Method("GET")
40
     */
41
    public function getAchievementsAction(Request $request)
42
    {
43
        return $this->retrieveAchievements($request, $this->user);
44
    }
45
46
    /**
47
     * @ApiDoc(
48
     *  description="Renvoie des détails sur les achievements et le niveau de l'utilisateur",
49
     *  statusCodes={
50
     *   200="Requête traitée avec succès",
51
     *   401="Une authentification est nécessaire pour effectuer cette action",
52
     *   403="Pas les droits suffisants pour effectuer cette action",
53
     *   503="Service temporairement indisponible ou en maintenance",
54
     *  },
55
     *  section="Utilisateurs"
56
     * )
57
     * @Route("/users/{slug}/achievements")
58
     * @Method("GET")
59
     */
60
    public function getUserAchievementsAction(Request $request, $slug)
61
    {
62
        $user = $this->findBySlug($slug);
63
        return $this->retrieveAchievements($request, $user);
64
    }
65
66
    /**
67
     * @param Request $request
68
     * @return JsonResponse
69
     */
70
    private function retrieveAchievements($request, $user)
71
    {
72
        $achievementRepository = $this->manager->getRepository('KIUserBundle:Achievement');
73
        $achievementUserRepository = $this->manager->getRepository('KIUserBundle:AchievementUser');
74
        $unlocked = [];
75
        $oUnlocked = [];
76
        $all = $request->query->has('all');
77
78
        $response = $achievementUserRepository->findByUser($user);
79
        foreach ($response as $achievementUser) {
80
            $achievement = $achievementUser->getAchievement();
81
            $oUnlocked[] = $achievement;
82
83
            if ($all || !$achievementUser->getSeen()) {
84
                $unlocked[] = [
85
                    'id' => $achievement->getIdA(),
86
                    'name' => $achievement->name(),
87
                    'description' => $achievement->description(),
88
                    'points' => $achievement->points(),
89
                    'image' => $achievement->image(),
90
                    'date' => $achievementUser->getDate(),
91
                    'seen' => $achievementUser->getSeen(),
92
                    'ownedBy' => $achievementUserRepository->getOwnedByCount($achievement),
93
                ];
94
                if (!$achievementUser->getSeen())
95
                    $achievementUser->setSeen(true);
96
            }
97
        }
98
        $all = $achievementRepository->findAll();
99
        $locked = [];
100
        $points = 0;
101
        $factor = 1;
102
103
        // On regarde quels achievements sont locked et on en profite pour
104
        // calculer le nombre de points de l'utilisateur obtenus par les
105
        // achievements
106
        foreach ($all as $achievement) {
107
            if (!in_array($achievement, $oUnlocked)) {
108
                $locked[] = [
109
                    'id' => $achievement->getIdA(),
110
                    'name' => $achievement->name(),
111
                    'description' => $achievement->description(),
112
                    'points' => $achievement->points(),
113
                    'image' => $achievement->image(),
114
                    'ownedBy' => $achievementUserRepository->getOwnedByCount($achievement),
115
                ];
116 View Code Duplication
            } else {
117
                if (gettype($achievement->points()) == 'integer') {
118
                    $points += $achievement->points();
119
                } else if ($achievement->points() == '+10%') {
120
                    $factor += 0.1;
121
                } else if ($achievement->points() == '+15%') {
122
                    $factor += 0.15;
123
                } else if ($achievement->points() == '+75%') {
124
                    $factor += 0.75;
125
                }
126
            }
127
        }
128
129
        // On trie les achievements par leur ID
130
        $ids = [];
131
        foreach ($unlocked as $key => $achievement) {
132
            $ids[$key] = $achievement['id'];
133
        }
134
        array_multisort($ids, SORT_ASC, $unlocked);
135
        $ids = [];
136
        foreach ($locked as $key => $achievement) {
137
            $ids[$key] = $achievement['id'];
138
        }
139
        array_multisort($ids, SORT_ASC, $locked);
140
141
        // On renvoie pas mal de données utiles
142
        $response = Achievement::getLevel($factor * $points);
143
        $return = [
144
            'number' => $response['number'],
145
            'points' => ceil($factor * $points),
146
            'current_level' => $response['current'],
147
            'next_level' => isset($response['next']) ? $response['next'] : null,
148
            'unlocked' => $unlocked,
149
            'locked' => $locked,
150
        ];
151
152
        $this->manager->flush();
153
        return $this->json($return);
154
    }
155
156
    /**
157
     * @ApiDoc(
158
     *  description="Retourne la liste des smartphones enregistrés",
159
     *  statusCodes={
160
     *   200="Requête traitée avec succès",
161
     *   401="Une authentification est nécessaire pour effectuer cette action",
162
     *   403="Pas les droits suffisants pour effectuer cette action",
163
     *   503="Service temporairement indisponible ou en maintenance",
164
     *  },
165
     *  section="Utilisateurs"
166
     * )
167
     * @Route("/own/devices")
168
     * @Method("GET")
169
     */
170
    public function getDevicesAction()
171
    {
172
        if (!$this->is('USER'))
173
            throw new AccessDeniedException();
174
175
        $user = $this->user;
176
        return $this->json($user->getDevices());
177
    }
178
179
    /**
180
     * @ApiDoc(
181
     *  description="Enregistre un smartphone auprès de l'API",
182
     *  requirements={
183
     *   {
184
     *    "name"="device",
185
     *    "dataType"="string",
186
     *    "description"="Identifiant du téléphone"
187
     *   },
188
     *   {
189
     *    "name"="type",
190
     *    "dataType"="string",
191
     *    "description"="Android | iOS | WP"
192
     *   }
193
     *  },
194
     *  statusCodes={
195
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
196
     *   400="La syntaxe de la requête est erronée",
197
     *   401="Une authentification est nécessaire pour effectuer cette action",
198
     *   403="Pas les droits suffisants pour effectuer cette action",
199
     *   503="Service temporairement indisponible ou en maintenance",
200
     *  },
201
     *  section="Utilisateurs"
202
     * )
203
     * @Route("/own/devices")
204
     * @Method("POST")
205
     */
206
    public function postDeviceAction(Request $request)
207
    {
208
        if (!$this->is('USER')) {
209
            throw new AccessDeniedException();
210
        }
211
212
        if (!$request->request->has('device'))
213
            throw new BadRequestHttpException('Identifiant de téléphone manquant');
214
        if (!$request->request->has('type'))
215
            throw new BadRequestHttpException('Type de téléphone manquant');
216
217
        // On vérifie que le smartphone n'a pas déjà été enregistré
218
        $repo = $this->manager->getRepository('KIUserBundle:Device');
219
        $devices = $repo->findByDevice($request->request->get('device'));
220
        if (!empty($devices))
221
            return $this->json(null, 204);
222
223
        $device = new Device();
224
        $device->setOwner($this->user);
225
        $device->setDevice($request->request->get('device'));
226
        $device->setType($request->request->get('type'));
227
        $this->manager->persist($device);
228
        $this->manager->flush();
229
230
        return $this->json(null, 204);
231
    }
232
233
    /**
234
     * @ApiDoc(
235
     *  description="Supprime un smartphone enregistré",
236
     *  statusCodes={
237
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
238
     *   401="Une authentification est nécessaire pour effectuer cette action",
239
     *   403="Pas les droits suffisants pour effectuer cette action",
240
     *   404="Aucun résultat ne correspond au token transmis",
241
     *   503="Service temporairement indisponible ou en maintenance",
242
     *  },
243
     *  section="Utilisateurs"
244
     * )
245
     * @Route("/own/devices/{id}")
246
     * @Method("DELETE")
247
     */
248
    public function deleteDeviceAction($id)
249
    {
250
        if (!$this->is('USER')) {
251
            throw new AccessDeniedException();
252
        }
253
254
        $repo = $this->manager->getRepository('KIUserBundle:Device');
255
        $device = $repo->findOneByDevice(str_replace('"', '', $id));
256
257
        if ($device === null)
258
            throw new NotFoundHttpException('Téléphone non trouvé');
259
260
        $this->manager->remove($device);
261
        $this->manager->flush();
262
263
        return $this->json(null, 204);
264
    }
265
266
    /**
267
     * @ApiDoc(
268
     *  description="Renvoie les notifications non lues de l'utilisateur actuel",
269
     *  output="KI\UserBundle\Entity\Notification",
270
     *  statusCodes={
271
     *   200="Requête traitée avec succès",
272
     *   401="Une authentification est nécessaire pour effectuer cette action",
273
     *   403="Pas les droits suffisants pour effectuer cette action",
274
     *   503="Service temporairement indisponible ou en maintenance",
275
     *  },
276
     *  section="Utilisateurs"
277
     * )
278
     * @Route("/own/notifications")
279
     * @Method("GET")
280
     */
281
    public function getNotificationsAction()
282
    {
283
        $repo = $this->manager->getRepository('KIUserBundle:Notification');
284
        $user = $this->user;
285
286
        // On récupère toutes les notifs
287
        $notifications = $repo->findAll();
288
        $return = [];
289
290
        // On filtre celles qui sont uniquement destinées à l'utilisateur actuel
291
        foreach ($notifications as $notification) {
292
            $mode = $notification->getMode();
293
            if ($mode == 'to') {
294
                // Si la notification n'a pas été lue
295
                if ($notification->getRecipient()->contains($user) && !$notification->getRead()->contains($user))
296
                    $return[] = $notification;
297
            } else if ($mode == 'exclude') {
298
                // Si la notification n'a pas été lue
299
                if (!$notification->getRead()->contains($user) && !$notification->getRecipient()->contains($user))
300
                    $return[] = $notification;
301
            } else
302
                throw new \Exception('Notification : mode d\'envoi inconnu (' . $mode . ')');
303
        }
304
305
        // On marque chaque notification récupérée comme lue
306
        foreach ($return as $notification) {
307
            $notification->addRead($user);
308
        }
309
        $this->manager->flush();
310
311
        return $this->json($return);
312
    }
313
314
    /**
315
     * @ApiDoc(
316
     *  description="Renvoie la liste des clubs suivis",
317
     *  output="KI\UserBundle\Entity\Club",
318
     *  statusCodes={
319
     *   200="Requête traitée avec succès",
320
     *   401="Une authentification est nécessaire pour effectuer cette action",
321
     *   403="Pas les droits suffisants pour effectuer cette action",
322
     *   503="Service temporairement indisponible ou en maintenance",
323
     *  },
324
     *  section="Utilisateurs"
325
     * )
326
     * @Route("/own/followed")
327
     * @Method("GET")
328
     */
329
    public function getFollowedAction()
330
    {
331
        return $this->json($this->getFollowedClubs());
332
    }
333
334
    protected function getFollowedClubs($user = null)
335
    {
336
        $repo = $this->manager->getRepository('KIUserBundle:Club');
337
        if ($user === null)
338
            $user = $this->user;
339
        $userNotFollowed = $user->getClubsNotFollowed();
340
341
        $clubs = $repo->findAll();
342
        $return = [];
343
        foreach ($clubs as $club) {
344
            if (!$userNotFollowed->contains($club)) {
345
                $return[] = $club;
346
            }
347
        }
348
        return $return;
349
    }
350
351
    /**
352
     * @ApiDoc(
353
     *  description="Renvoie la liste des évènements suivis et persos",
354
     *  output="KI\PublicationBundle\Entity\Event",
355
     *  statusCodes={
356
     *   200="Requête traitée avec succès",
357
     *   401="Une authentification est nécessaire pour effectuer cette action",
358
     *   403="Pas les droits suffisants pour effectuer cette action",
359
     *   503="Service temporairement indisponible ou en maintenance",
360
     *  },
361
     *  section="Utilisateurs"
362
     * )
363
     * @Route("/own/events")
364
     * @Method("GET")
365
     */
366
    public function getOwnEventsAction(Request $request)
367
    {
368
        $userRepository = $this->manager->getRepository('KIUserBundle:User');
369
370
        // Si on prend tout on renvoie comme ça
371
        if ($request->query->has('all')) {
372
            $events = $userRepository->findFollowedEvents($this->getUser()->getId());
373
        } else {
374
            $events = $userRepository->findFollowedEvents(
375
                $this->getUser()->getId(),
376
                $request->query->get('limit'),
377
                $request->query->get('page')
378
            );
379
        }
380
        return $this->json($events);
381
    }
382
383
    /**
384
     * @ApiDoc(
385
     *  description="Retourne le calendrier de l'utilisateur au format ICS",
386
     *  statusCodes={
387
     *   200="Requête traitée avec succès",
388
     *   401="Une authentification est nécessaire pour effectuer cette action",
389
     *   403="Pas les droits suffisants pour effectuer cette action",
390
     *   503="Service temporairement indisponible ou en maintenance",
391
     *  },
392
     *  section="Utilisateurs"
393
     * )
394
     * @Route("/users/{token}/calendar")
395
     * @Method("GET")
396
     */
397
    public function getOwnCalendarAction($token)
398
    {
399
        $user = $this->repository->findOneByToken($token);
400
        if ($user === null) {
401
            throw new NotFoundHttpException('Aucun utilisateur ne correspond au token saisi');
402
        } else {
403
            $userRepository = $this->manager->getRepository('KIUserBundle:User');
404
405
            $events = $userRepository->findFollowedEvents($user->getId());
406
            $courses = $this->getCourseitems($user);
407
408
            $calStr = $this->get('ki_publication.service.calendar')->getCalendar($user, $events, $courses);
409
410
            return new Response($calStr, 200, [
411
                    'Content-Type' => 'text/calendar; charset=utf-8',
412
                    'Content-Disposition' => 'attachment; filename="calendar.ics"',
413
                ]
414
            );
415
        }
416
    }
417
418
    private function getCourseitems($user = null)
419
    {
420
        $repo = $this->getDoctrine()->getManager()->getRepository('KIPublicationBundle:CourseUser');
421
422
        if ($user === null)
423
            $user = $this->user;
424
425
        // On extraie les Courseitem et on les trie par date de début
426
        $result = [];
427
        $timestamp = [];
428
        foreach ($repo->findBy(['user' => $user]) as $courseUser) {
429
            $course = $courseUser->getCourse();
430
            foreach ($course->getCourseitems() as $courseitem) {
431
                if ($courseUser->getGroup() == $courseitem->getGroup() || $courseitem->getGroup() == 0) {
432
                    $result[] = $courseitem;
433
                    $timestamp[] = $courseitem->getStartDate();
434
                }
435
            }
436
        }
437
        array_multisort($timestamp, SORT_ASC, $result);
438
439
        return $result;
440
    }
441
442
    /**
443
     * @ApiDoc(
444
     *  description="Renvoie la liste des news suivies",
445
     *  output="KI\PublicationBundle\Entity\Newsitem",
446
     *  statusCodes={
447
     *   200="Requête traitée avec succès",
448
     *   401="Une authentification est nécessaire pour effectuer cette action",
449
     *   403="Pas les droits suffisants pour effectuer cette action",
450
     *   503="Service temporairement indisponible ou en maintenance",
451
     *  },
452
     *  section="Utilisateurs"
453
     * )
454
     * @Route("/own/newsitems")
455
     * @Method("GET")
456
     */
457 View Code Duplication
    public function getNewsItemsAction()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
458
    {
459
        $repository = $this->manager->getRepository('KIPublicationBundle:Newsitem');
460
461
        $paginateHelper = $this->get('ki_core.helper.paginate');
462
        extract($paginateHelper->paginateData($repository));
0 ignored issues
show
Bug introduced by
$paginateHelper->paginateData($repository) cannot be passed to extract() as the parameter $var_array expects a reference.
Loading history...
463
        $findBy['authorClub'] = $this->getFollowedClubs();
464
        $results = $repository->findBy($findBy, $sortBy, $limit, $offset);
465
466
        list($results, $links, $count) = $paginateHelper->paginateView($results, $limit, $page, $totalPages, $count);
467
468
        return $this->json($results, 200, [
469
            'Links' => implode(',', $links),
470
            'Total-count' => $count
471
        ]);
472
    }
473
474
    /**
475
     * @ApiDoc(
476
     *  description="Renvoie la liste des cours suivis",
477
     *  output="KI\PublicationBundle\Entity\Course",
478
     *  statusCodes={
479
     *   200="Requête traitée avec succès",
480
     *   401="Une authentification est nécessaire pour effectuer cette action",
481
     *   403="Pas les droits suffisants pour effectuer cette action",
482
     *   503="Service temporairement indisponible ou en maintenance",
483
     *  },
484
     *  section="Utilisateurs"
485
     * )
486
     * @Route("/own/courses")
487
     * @Method("GET")
488
     */
489
    public function getOwnCoursesAction()
490
    {
491
        $repo = $this->getDoctrine()->getManager()->getRepository('KIPublicationBundle:CourseUser');
492
493
        $return = [];
494
        foreach ($repo->findBy(['user' => $this->user]) as $courseUser) {
495
            $return[] = ['course' => $courseUser->getCourse(), 'group' => $courseUser->getGroup()];
496
        }
497
498
        return $this->json($return);
499
    }
500
501
    /**
502
     * @ApiDoc(
503
     *  description="Renvoie la liste des prochains cours de l'utilisateur",
504
     *  output="KI\PublicationBundle\Entity\Courseitem",
505
     *  statusCodes={
506
     *   200="Requête traitée avec succès",
507
     *   401="Une authentification est nécessaire pour effectuer cette action",
508
     *   403="Pas les droits suffisants pour effectuer cette action",
509
     *   503="Service temporairement indisponible ou en maintenance",
510
     *  },
511
     *  section="Utilisateurs"
512
     * )
513
     * @Route("/own/courseitems")
514
     * @Method("GET")
515
     */
516
    public function getCourseitemsAction()
517
    {
518
        return $this->json($this->getCourseitems());
519
    }
520
521
    /**
522
     * @ApiDoc(
523
     *  description="Change ou ajoute une préférence",
524
     *  requirements={
525
     *   {
526
     *    "name"="key",
527
     *    "dataType"="string",
528
     *    "description"="Préférence éditée ou changée"
529
     *   },
530
     *   {
531
     *    "name"="value",
532
     *    "dataType"="string",
533
     *    "description"="Valeur de la préférence"
534
     *   }
535
     *  },
536
     *  statusCodes={
537
     *   204="Requête traitée avec succès mais pas d'information à renvoyer",
538
     *   400="La syntaxe de la requête est erronée",
539
     *   401="Une authentification est nécessaire pour effectuer cette action",
540
     *   403="Pas les droits suffisants pour effectuer cette action",
541
     *   503="Service temporairement indisponible ou en maintenance",
542
     *  },
543
     *  section="Utilisateurs"
544
     * )
545
     * @Route("/own/preferences")
546
     * @Method("PATCH")
547
     */
548
    public function changePreferenceAction(Request $request)
549
    {
550
        $user = $this->user;
551
552
        if (!$this->is('USER'))
553
            throw new AccessDeniedException('Accès refusé');
554
555
        if (!($request->request->has('key') && $request->request->has('value')))
556
            throw new BadRequestHttpException('Champ manquant');
557
558
        if ($user->addPreference($request->request->get('key'), $request->request->get('value'))) {
559
            $this->manager->flush();
560
            return $this->json(null, 204);
561
        }
562
563
        throw new BadRequestHttpException('Cette préférence n\'existe pas');
564
    }
565
566
    /**
567
     * @ApiDoc(
568
     *  description="Supprime un préférence",
569
     *  requirements={
570
     *   {
571
     *    "name"="key",
572
     *    "dataType"="string",
573
     *    "description"="Préférence supprimée"
574
     *   }
575
     *  },
576
     *  statusCodes={
577
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
578
     *   401="Une authentification est nécessaire pour effectuer cette action",
579
     *   403="Pas les droits suffisants pour effectuer cette action",
580
     *   404="Ressource non trouvée",
581
     *   503="Service temporairement indisponible ou en maintenance",
582
     *  },
583
     *  section="Utilisateurs"
584
     * )
585
     * @Route("/own/preferences")
586
     * @Method("DELETE")
587
     */
588
    public function removePreferenceAction(Request $request)
589
    {
590
        $user = $this->user;
591
592
        if (!$this->is('USER'))
593
            throw new AccessDeniedException('Accès refusé');
594
595
        if (!($request->request->has('key')))
596
            throw new BadRequestHttpException('Champ manquant');
597
598
        if ($user->removePreference($request->request->get('key'))) {
599
            $this->manager->flush();
600
601
            return $this->json(null, 204);
602
        }
603
604
        throw new BadRequestHttpException('Cette préférence n\'existe pas');
605
    }
606
607
    /**
608
     * @ApiDoc(
609
     *  description="Renvoie les préférences de l'utilisateur courant",
610
     *  output="array",
611
     *  statusCodes={
612
     *   200="Requête traitée avec succès",
613
     *   401="Une authentification est nécessaire pour effectuer cette action",
614
     *   403="Pas les droits suffisants pour effectuer cette action",
615
     *   503="Service temporairement indisponible ou en maintenance",
616
     *  },
617
     *  section="Utilisateurs"
618
     * )
619
     * @Route("/own/preferences")
620
     * @Method("GET")
621
     */
622
    public function getPreferencesAction()
623
    {
624
        $user = $this->user;
625
        return $this->json($user->getPreferences());
626
    }
627
628
    /**
629
     * @ApiDoc(
630
     *  description="Crée un token si non existant et le retourne",
631
     *  statusCodes={
632
     *   200="Requête traitée avec succès",
633
     *   401="Une authentification est nécessaire pour effectuer cette action",
634
     *   403="Pas les droits suffisants pour effectuer cette action",
635
     *   503="Service temporairement indisponible ou en maintenance",
636
     *  },
637
     *  section="Utilisateurs"
638
     * )
639
     * @Route("/own/token")
640
     * @Method("GET")
641
     */
642
    public function getTokenAction()
643
    {
644
        return $this->json([
645
            'token' => $this->get('ki_user.service.token')->getToken()
646
        ]);
647
    }
648
649
    /**
650
     * @ApiDoc(
651
     *  description="Renvoie la liste des dépannages demandés par l'utilisateur",
652
     *  output="KI\ClubinfoBundle\Entity\Fix",
653
     *  statusCodes={
654
     *   200="Requête traitée avec succès",
655
     *   401="Une authentification est nécessaire pour effectuer cette action",
656
     *   403="Pas les droits suffisants pour effectuer cette action",
657
     *   503="Service temporairement indisponible ou en maintenance",
658
     *  },
659
     *  section="Utilisateurs"
660
     * )
661
     * @Route("/own/fixs")
662
     * @Method("GET")
663
     */
664
    public function getOwnFixsAction()
665
    {
666
        $user = $this->user;
667
        if (!$this->is('USER'))
668
            throw new AccessDeniedException('Accès refusé');
669
670
        $repository = $this->manager->getRepository('KIClubinfoBundle:Fix');
671
        $paginateHelper = $this->get('ki_core.helper.paginate');
672
        extract($paginateHelper->paginateData($repository));
0 ignored issues
show
Bug introduced by
$paginateHelper->paginateData($repository) cannot be passed to extract() as the parameter $var_array expects a reference.
Loading history...
673
674
        $findBy['user'] = $user;
675
        $results = $repository->findBy($findBy, $sortBy, $limit, $offset);
676
677
        list($results, $links, $count) = $paginateHelper->paginateView($results, $limit, $page, $totalPages, $count);
678
679
        return $this->json($results, 200, [
680
            'Links' => implode(',', $links),
681
            'Total-count' => $count
682
        ]);
683
    }
684
685
    /**
686
     * @ApiDoc(
687
     *  description="Renvoie l'utilisateur actuel",
688
     *  output="KI\UserBundle\Entity\User",
689
     *  statusCodes={
690
     *   200="Requête traitée avec succès",
691
     *   401="Une authentification est nécessaire pour effectuer cette action",
692
     *   403="Pas les droits suffisants pour effectuer cette action",
693
     *   503="Service temporairement indisponible ou en maintenance",
694
     *  },
695
     *  section="Utilisateurs"
696
     * )
697
     * @Route("/own/user")
698
     * @Method("GET")
699
     */
700
    public function getOwnUserAction()
701
    {
702
        return $this->json($this->user);
703
    }
704
705
    /**
706
     * @ApiDoc(
707
     *  description="Met à jour les informations du compte",
708
     *  requirements={
709
     *   {
710
     *    "name"="old",
711
     *    "dataType"="string",
712
     *    "description"="L'ancien mot de passe"
713
     *   },
714
     *   {
715
     *    "name"="password",
716
     *    "dataType"="string",
717
     *    "description"="Le nouveau mot de passe"
718
     *   },
719
     *   {
720
     *    "name"="confirm",
721
     *    "dataType"="string",
722
     *    "description"="Le mot de passe une seconde fois (confirmation)"
723
     *   }
724
     *  },
725
     *  statusCodes={
726
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
727
     *   401="Une authentification est nécessaire pour effectuer cette action",
728
     *   403="Pas les droits suffisants pour effectuer cette action",
729
     *   404="Ressource non trouvée",
730
     *   503="Service temporairement indisponible ou en maintenance",
731
     *  },
732
     *  section="Utilisateurs"
733
     * )
734
     * @Route("/own/user")
735
     * @Method("POST")
736
     */
737
    public function postOwnUserAction(Request $request)
738
    {
739
        if (!$request->request->has('password') || !$request->request->has('confirm') || !$request->request->has('old'))
740
            throw new BadRequestHttpException('Champs password/confirm non rempli(s)');
741
742
        if ($this->user->hasRole('ROLE_ADMISSIBLE'))
743
            return $this->json(null, 403);
744
745
        // Pour changer le mot de passe on doit passer par le UserManager
746
        $userManager = $this->get('fos_user.user_manager');
747
        $user = $userManager->findUserByUsername($this->user->getUsername());
748
749
        $encoder = $this->get('security.encoder_factory')->getEncoder($user);
750
        $encodedPassword = $encoder->encodePassword($request->request->get('old'), $user->getSalt());
751
752
        if ($encodedPassword != $user->getPassword())
753
            throw new BadRequestHttpException('Ancien mot de passe incorrect');
754
755
        $user->setPlainPassword($request->request->get('password'));
756
        $userManager->updateUser($user, true);
757
758
        return $this->json(null, 204);
759
    }
760
}
761