Completed
Push — master ( 22e9c2...845964 )
by Louis
107:19 queued 52:13
created

OwnController::getOwnClubsAction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
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()
458
    {
459
        $repository = $this->manager->getRepository('KIPublicationBundle:Newsitem');
460
461
        $paginateHelper = $this->get('ki_core.helper.paginate');
462
        extract($paginateHelper->paginateData($repository));
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));
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="Renvoie les clubs de l'utilisateur actuel",
708
     *  output="KI\UserBundle\Entity\ClubUser",
709
     *  statusCodes={
710
     *   200="Requête traitée avec succès",
711
     *   401="Une authentification est nécessaire pour effectuer cette action",
712
     *   403="Pas les droits suffisants pour effectuer cette action",
713
     *   503="Service temporairement indisponible ou en maintenance",
714
     *  },
715
     *  section="Utilisateurs"
716
     * )
717
     * @Route("/own/clubs")
718
     * @Method("GET")
719
     */
720
    public function getOwnClubsAction()
721
    {
722
        return $this->json($this->user->getClubs());
723
    }
724
725
    /**
726
     * @ApiDoc(
727
     *  description="Met à jour les informations du compte",
728
     *  requirements={
729
     *   {
730
     *    "name"="old",
731
     *    "dataType"="string",
732
     *    "description"="L'ancien mot de passe"
733
     *   },
734
     *   {
735
     *    "name"="password",
736
     *    "dataType"="string",
737
     *    "description"="Le nouveau mot de passe"
738
     *   },
739
     *   {
740
     *    "name"="confirm",
741
     *    "dataType"="string",
742
     *    "description"="Le mot de passe une seconde fois (confirmation)"
743
     *   }
744
     *  },
745
     *  statusCodes={
746
     *   204="Requête traitée avec succès mais pas d’information à renvoyer",
747
     *   401="Une authentification est nécessaire pour effectuer cette action",
748
     *   403="Pas les droits suffisants pour effectuer cette action",
749
     *   404="Ressource non trouvée",
750
     *   503="Service temporairement indisponible ou en maintenance",
751
     *  },
752
     *  section="Utilisateurs"
753
     * )
754
     * @Route("/own/user")
755
     * @Method("POST")
756
     */
757
    public function postOwnUserAction(Request $request)
758
    {
759
        if (!$request->request->has('password') || !$request->request->has('confirm') || !$request->request->has('old'))
760
            throw new BadRequestHttpException('Champs password/confirm non rempli(s)');
761
762
        if ($this->user->hasRole('ROLE_ADMISSIBLE'))
763
            return $this->json(null, 403);
764
765
        // Pour changer le mot de passe on doit passer par le UserManager
766
        $userManager = $this->get('fos_user.user_manager');
767
        $user = $userManager->findUserByUsername($this->user->getUsername());
768
769
        $encoder = $this->get('security.encoder_factory')->getEncoder($user);
770
        $encodedPassword = $encoder->encodePassword($request->request->get('old'), $user->getSalt());
771
772
        if ($encodedPassword != $user->getPassword())
773
            throw new BadRequestHttpException('Ancien mot de passe incorrect');
774
775
        $user->setPlainPassword($request->request->get('password'));
776
        $userManager->updateUser($user, true);
777
778
        return $this->json(null, 204);
779
    }
780
}
781