From ea667aa15d9f969d393847b0fba820a61f0daf61 Mon Sep 17 00:00:00 2001
From: pfleu <fleutotp@gmail.com>
Date: Thu, 15 Dec 2022 23:48:12 +0100
Subject: [PATCH] API : User: get niveau langue. Lexique : extraction de n
 graphies

---
 src/Controller/ApiLexiconController.php | 39 +++++++++++
 src/Controller/ApiUserController.php    | 88 +++++++++++++++++++++++++
 src/Controller/SecurityController.php   | 27 --------
 src/Entity/Lexicon.php                  |  6 +-
 src/Entity/StudiedLanguage.php          |  3 +
 5 files changed, 133 insertions(+), 30 deletions(-)
 create mode 100644 src/Controller/ApiUserController.php

diff --git a/src/Controller/ApiLexiconController.php b/src/Controller/ApiLexiconController.php
index cec42ec..e2e2def 100644
--- a/src/Controller/ApiLexiconController.php
+++ b/src/Controller/ApiLexiconController.php
@@ -128,4 +128,43 @@ class ApiLexiconController extends ApiBaseController
 
         return $this->createJsonResponse(200, ['message' => sprintf("La liste %s a été importée dans le lexique %s en mode %s", $graphyList, $lexicon, $importMode)]);
     }
+
+    /**
+     * Récupère un nombre n de graphies d’un lexique
+     *
+     * @Route("/extract/{nb}", name="api_lexicon_extract_graphies", methods={"GET"})
+     * @OA\Parameter(name="nb", in="path", description="nb de graphies retournées", @OA\Schema(type="integer"))
+     * @OA\Parameter(name="lexiconId", in="query", required=true, description="id du lexique dans lequel chercher", @OA\Schema(type="string"))
+     *
+     * @OA\Response(response=200, description="success", @OA\JsonContent(type="string"))
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     *
+     * @OA\Tag(name="Lexicons")
+     * @Security(name="OAuth2")
+     */
+    public function extractGraphies(Request $request, WiktionaryManager$wiktionaryManager, $nb): Response
+    {
+        $lexiconId = $request->get('lexiconId');
+        if (!$lexiconId) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Le paramètre lexiconId ets obligatoire")]);
+        }
+        $lexicon = $this->doctrine->getRepository(Lexicon::class)->find($lexiconId);
+        if (!$lexicon) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Pas de lexique trouvé pour cette Id")]);
+        }
+
+        $entries = $lexicon->getEntries()->toArray();
+        $graphies = [];
+        foreach ($entries as $entry) {
+            foreach ($entry->getHeadword()->getGraphies() as $graphy) {
+                $graphies[] = $graphy->getValue();
+            }
+        }
+        shuffle($graphies);
+        $selectedGraphies = array_slice($graphies, 0, $nb);
+
+        return $this->createJsonResponse(200, $selectedGraphies);
+    }
 }
diff --git a/src/Controller/ApiUserController.php b/src/Controller/ApiUserController.php
new file mode 100644
index 0000000..e1d07e8
--- /dev/null
+++ b/src/Controller/ApiUserController.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Controller;
+
+use App\Entity\StudiedLanguage;
+use App\Entity\User;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Routing\Annotation\Route;
+use Nelmio\ApiDocBundle\Annotation\Security;
+use OpenApi\Annotations as OA;
+use Symfony\Component\Serializer\SerializerInterface;
+
+/**
+ * @Route("/api/user")
+ */
+class ApiUserController extends ApiBaseController
+{
+    /**
+     * Utilisée par une appli cliente pour lier un compte user au compte user balex correspondant grâce à l'IUID
+     *
+     * @Route("/details", name="api_user_details", methods={"GET"})
+     *
+     * @OA\Response(
+     *     response=200,
+     *     description="Success"
+     * )
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     * @OA\Tag(name="User")
+     * @Security(name="OAuth2")
+     */
+    public function userDetails(): Response
+    {
+        /** @var User $user */
+        $user = $this->getUser();
+        return $this->json([
+            'message' => 'You successfully authenticated!',
+            'email' => $user->getEmail(),
+            'uuid' => $user->getUuid(),
+            'pseudo' => $user->getPseudo(),
+        ]);
+    }
+
+    /**
+     * Si on précise la langue, retourne le niveau pour cette langue, sinon retourne tous les couples langue/niveau de l'utilisateur
+     *
+     * @Route("/level/{id}", name="api_user_level", methods={"GET"})
+     *
+     * @OA\Parameter(name="id", in="path", description="user id", @OA\Schema(type="string"))
+     * @OA\Parameter(name="language", in="query", description="langue pour laquelle on veut connaître le niveau", @OA\Schema(type="string"))
+     *
+     * @OA\Response(
+     *     response=200,
+     *     description="Success"
+     * )
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     * @OA\Tag(name="User")
+     * @Security(name="OAuth2")
+     */
+    public function getStudiedLanguages(SerializerInterface $serializer, Request $request, User $user): Response
+    {
+        if ($user === null) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Pas d'utilisateur trouvé pour cette Id")]);
+        }
+        $language = $request->get('language');
+        if ($language && !in_array($language, $this->getLanguages())) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Pas de langue trouvée pour: %s", $language)]);
+        }
+
+        if ($language) {
+            $studiedLanguage = $this->doctrine->getRepository(StudiedLanguage::class)->findOneBy([
+                'user' => $user,
+                'language' => $language,
+            ]);
+            return $this->createJsonResponse(200, [$studiedLanguage->getLevel()]);
+        } else {
+            $content = $serializer->serialize($user->getStudiedLanguages(), 'json', ['groups' => ["studiedLanguage:read"]]);
+
+            return new JsonResponse($content, 200, [], true);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php
index 7ededc4..e47379e 100644
--- a/src/Controller/SecurityController.php
+++ b/src/Controller/SecurityController.php
@@ -11,33 +11,6 @@ use OpenApi\Annotations as OA;
 
 class SecurityController extends AbstractController
 {
-    /**
-     * Utilisée par une appli cliente pour lier un compte user au compte user balex correspondant grâce à l'IUID
-     *
-     * @Route("/api/user-details", name="app_user_details", methods={"GET"})
-     *
-     * @OA\Response(
-     *     response=200,
-     *     description="Success"
-     * )
-     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
-     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
-     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
-     * @OA\Tag(name="User")
-     * @Security(name="OAuth2")
-     */
-    public function userDetails(): Response
-    {
-        /** @var User $user */
-        $user = $this->getUser();
-        return $this->json([
-            'message' => 'You successfully authenticated!',
-            'email' => $user->getEmail(),
-            'uuid' => $user->getUuid(),
-            'pseudo' => $user->getPseudo(),
-        ]);
-    }
-
     /**
      * @Route("/logout", name="app_logout", methods={"GET"})
      */
diff --git a/src/Entity/Lexicon.php b/src/Entity/Lexicon.php
index 0515011..80fe185 100644
--- a/src/Entity/Lexicon.php
+++ b/src/Entity/Lexicon.php
@@ -158,9 +158,9 @@ class Lexicon
     }
 
     /**
-     * @return Collection<int, Entry>
-     */
-    public function getEntries(): Collection
+      * @return Collection|Entry[]
+      */
+    public function getEntries()
     {
         return $this->entries;
     }
diff --git a/src/Entity/StudiedLanguage.php b/src/Entity/StudiedLanguage.php
index 4f931ea..6b707eb 100644
--- a/src/Entity/StudiedLanguage.php
+++ b/src/Entity/StudiedLanguage.php
@@ -4,6 +4,7 @@ namespace App\Entity;
 
 use App\Repository\LabelRepository;
 use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Serializer\Annotation\Groups;
 
 /**
  * @ORM\Entity()
@@ -19,11 +20,13 @@ class StudiedLanguage
     private $id;
 
     /**
+     * @Groups({"studiedLanguage:read"})
      * @ORM\Column(type="string", length=100)
      */
     private $language;
 
     /**
+     * @Groups({"studiedLanguage:read"})
      * @ORM\Column(type="string", length=20)
      */
     private $level;
-- 
GitLab