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