From dadb65c25186a1d429bca196b579c78a8a87ad08 Mon Sep 17 00:00:00 2001 From: pfleu <fleutotp@gmail.com> Date: Fri, 16 Dec 2022 10:14:34 +0100 Subject: [PATCH] =?UTF-8?q?API:=20ajout=20requ=C3=AAte=20extract=20graphie?= =?UTF-8?q?s=20with=20label.=20Ajout=20requ=C3=AAte=20enlever=20label=20?= =?UTF-8?q?=C3=A0=20graphies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/ApiBaseController.php | 18 +++- src/Controller/ApiEntryController.php | 2 +- src/Controller/ApiGraphyController.php | 2 +- src/Controller/ApiGraphyListController.php | 2 +- src/Controller/ApiHeadwordController.php | 2 +- src/Controller/ApiLabelController.php | 102 ++++++++++++++++++++- src/Entity/Headword.php | 5 + src/Entity/Label.php | 6 +- src/Repository/HeadwordRepository.php | 16 ++++ 9 files changed, 146 insertions(+), 9 deletions(-) diff --git a/src/Controller/ApiBaseController.php b/src/Controller/ApiBaseController.php index d5afdd9..f148177 100644 --- a/src/Controller/ApiBaseController.php +++ b/src/Controller/ApiBaseController.php @@ -54,7 +54,14 @@ class ApiBaseController extends AbstractController return ltrim($this->warning . ' ' . $this->success); } - protected function createJsonResponse(int $code, array $data = []): Response + /** + * Si pas de data, on rÊcupère les messages loguÊs dans success et warning + * + * @param int $code + * @param array $data + * @return Response + */ + protected function createJsonResponse(int $code = 200, array $data = []): Response { $data = $data ? : $this->getResponseMessage(); @@ -66,6 +73,15 @@ class ApiBaseController extends AbstractController return $response; } + public function addSuccessMessage($message) + { + $this->success[] = $message; + } + public function addWarningMessage($message) + { + $this->warning[] = $message; + } + /** * @param $lexiconsIds array */ diff --git a/src/Controller/ApiEntryController.php b/src/Controller/ApiEntryController.php index 7c7ac61..22fb564 100644 --- a/src/Controller/ApiEntryController.php +++ b/src/Controller/ApiEntryController.php @@ -406,7 +406,7 @@ class ApiEntryController extends ApiBaseController } /** - * @Route("/remove", name="api_entry_delete", methods={"DELETE"}) + * @Route("/delete", name="api_entry_delete", methods={"DELETE"}) * * @OA\Response( * response=200, diff --git a/src/Controller/ApiGraphyController.php b/src/Controller/ApiGraphyController.php index 1d913c5..013b477 100644 --- a/src/Controller/ApiGraphyController.php +++ b/src/Controller/ApiGraphyController.php @@ -79,7 +79,7 @@ class ApiGraphyController extends ApiBaseController } /** - * @Route("/remove", name="graphy_delete", methods={"DELETE"}) + * @Route("/delete", name="graphy_delete", methods={"DELETE"}) * * @OA\Response( * response=200, diff --git a/src/Controller/ApiGraphyListController.php b/src/Controller/ApiGraphyListController.php index fc29e5f..a3b37ad 100644 --- a/src/Controller/ApiGraphyListController.php +++ b/src/Controller/ApiGraphyListController.php @@ -249,7 +249,7 @@ class ApiGraphyListController extends ApiBaseController } /** - * @Route("/remove/{id}", name="api_graphy_list_delete", methods={"DELETE"}) + * @Route("/delete/{id}", name="api_graphy_list_delete", methods={"DELETE"}) * * @OA\Response( * response=200, diff --git a/src/Controller/ApiHeadwordController.php b/src/Controller/ApiHeadwordController.php index 05611b5..4135c5a 100644 --- a/src/Controller/ApiHeadwordController.php +++ b/src/Controller/ApiHeadwordController.php @@ -86,7 +86,7 @@ class ApiHeadwordController extends ApiBaseController } /** - * @Route("/remove", name="headword_delete", methods={"DELETE"}) + * @Route("/delete", name="headword_delete", methods={"DELETE"}) * * @OA\Response( * response=200, diff --git a/src/Controller/ApiLabelController.php b/src/Controller/ApiLabelController.php index 27b03bc..f68ae4b 100644 --- a/src/Controller/ApiLabelController.php +++ b/src/Controller/ApiLabelController.php @@ -4,7 +4,10 @@ namespace App\Controller; use App\Entity\Entry; use App\Entity\Graphy; +use App\Entity\Headword; use App\Entity\Label; +use App\Entity\Lexicon; +use App\Manager\WiktionaryManager; use App\Repository\LabelRepository; use Doctrine\Persistence\ManagerRegistry; use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted; @@ -223,7 +226,9 @@ class ApiLabelController extends ApiBaseController } /** - * @Route("/remove/{id}", name="api_label_delete", methods={"DELETE"}) + * Supprime le label + * + * @Route("/delete/{id}", name="api_label_delete", methods={"DELETE"}) * * @OA\Response( * response=200, @@ -249,4 +254,99 @@ class ApiLabelController extends ApiBaseController return $this->createJsonResponse(200, ['success' => sprintf("Label %s (id: %s) supprimÊ", $label->getName(), $label->getId())]); } + + /** + * Retire le label aux graphies spÊcifiÊes + * + * @Route("/remove/{id}", name="api_label_remove", methods={"DELETE"}) + * + * @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\Parameter( + * name="id", + * in="path", + * description="id of the label to be removed", + * @OA\Schema(type="integer") + * ) + * @OA\RequestBody( + * required=true, + * @OA\JsonContent( + * required={"graphies"}, + * @OA\Property(property="graphies", type="array", + * example={"hi", "friends"}, + * @OA\Items( + * type="string" + * ) + * ) + * ) + * ) + * + * @OA\Tag(name="Labels") + * @Security(name="OAuth2") + */ + public function remove(Label $label, Request $request) + { + $data = json_decode($request->getContent(), true); + if (!$data) { + return $this->createJsonResponse(401, ['error' => sprintf("Json non valide")]); + } + if ($missingFields = $this->getMissingFields($data, ['graphies'])) { + return $this->createJsonResponse(401, ['error' => sprintf("Veuillez fournir une valeur pour: %s", implode(', ', $missingFields))]); + } + + $headwords = $this->doctrine->getRepository(Headword::class)->getByGraphyValues($data['graphies']); + $count = 0; + foreach ($headwords as $headword) { + if ($headword->hasLabel($label)) { + $headword->removeLabel($label); + $count++; + } + } + $this->doctrine->getManager()->flush(); + $this->addSuccessMessage(sprintf("Le label ÂĢ%sÂģ (id %s) a ÊtÊ retirÊ de %s mots-vedettes", $label, $label->getId(), $count)); + + return $this->createJsonResponse(); + } + + /** + * RÊcupère un nombre n de graphies à partir des mot-vedettes possÊdant un label donnÊ + * + * @Route("/{id}/extract/{nb}", name="api_label_extract_graphies", methods={"GET"}) + * @OA\Parameter(name="id", in="path", description="id du label que doivent possÊder les graphies (leur mot-vedette)", @OA\Schema(type="integer")) + * @OA\Parameter(name="nb", in="path", description="nb de graphies retournÊes", @OA\Schema(type="integer")) + * + * @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="Labels") + * @Security(name="OAuth2") + */ + public function extractGraphies(Request $request, WiktionaryManager$wiktionaryManager, Label $label, $nb): Response + { +// $labelId = $request->get('labelId'); +// if (!$labelId) { +// return $this->createJsonResponse(401, ['error' => sprintf("Le paramètre labelId ets obligatoire")]); +// } +// $label = $this->doctrine->getRepository(Label::class)->find($labelId); +// if (!$label) { +// return $this->createJsonResponse(401, ['error' => sprintf("Pas de label trouvÊ pour cette Id")]); +// } + + $headwords = $label->getHeadwords()->toArray(); + $graphies = []; + foreach ($headwords as $headword) { + foreach ($headword->getGraphies() as $graphy) { + $graphies[] = $graphy->getValue(); + } + } + shuffle($graphies); + $selectedGraphies = array_slice($graphies, 0, $nb); + + return $this->createJsonResponse(200, $selectedGraphies); + } } diff --git a/src/Entity/Headword.php b/src/Entity/Headword.php index 5e47cf1..5fff1a7 100644 --- a/src/Entity/Headword.php +++ b/src/Entity/Headword.php @@ -277,4 +277,9 @@ class Headword return $this; } + + public function hasLabel(Label $label) + { + return $this->getLabels()->contains($label); + } } diff --git a/src/Entity/Label.php b/src/Entity/Label.php index 052b7ea..60f3226 100644 --- a/src/Entity/Label.php +++ b/src/Entity/Label.php @@ -233,9 +233,9 @@ class Label } /** - * @return Collection<int, Headword> - */ - public function getHeadwords(): Collection + * @return Collection|Headword[] + */ + public function getHeadwords() { return $this->headwords; } diff --git a/src/Repository/HeadwordRepository.php b/src/Repository/HeadwordRepository.php index 297a0da..48a3d62 100644 --- a/src/Repository/HeadwordRepository.php +++ b/src/Repository/HeadwordRepository.php @@ -57,6 +57,22 @@ class HeadwordRepository extends ServiceEntityRepository return $result ? reset($result) : null; } + /** + * @return Headword[] + */ + public function getByGraphyValues($values) + { + $result = $this->createQueryBuilder('h') + ->innerJoin('h.graphies', 'g') + ->andWhere('g.value IN (:values)') + ->setParameter('values', $values) + ->getQuery() + ->getResult() + ; + + return $result; + } + // public function findOneBySomeField($value): ?Headword // { // return $this->createQueryBuilder('l') -- GitLab