diff --git a/src/Controller/ApiBaseController.php b/src/Controller/ApiBaseController.php index d5afdd9e73c7da99f5f8723415b03864000d6133..f14817729cc89ae9a2cf960c33dd6d22976e8869 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 7c7ac61952947c6919044723bf0189ff18d636cc..22fb564871f819eaaebf6386f76f33eb0c6abfa8 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 1d913c5c56ff9832e3da4d3d075bf3673c5d8172..013b477f0395fc57bc7749cf42be06e82110ba72 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 fc29e5f930788ef4e30a29e6453963f743781769..a3b37ad7dd129bfa036da870971f5bb4efe998f2 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 05611b538dd0fda466693b375144716a7e2a3bf4..4135c5aa13a797e1da051cfbfee512f50eec4a8c 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 27b03bc11db6d98b29224416ae359c071696a0e4..f68ae4b54825fc1abe6385b94390c42c250aed45 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 5e47cf15dfc15173c6de237f21616b415170accf..5fff1a73f13b5589d32f5eafde7436078dc98636 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 052b7ea92435b4b878c7fced6beaf90425dfdecc..60f32262d016c8e551fe56f3bea1cfe2d67e5c31 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 297a0dacce2630ddf0d2c9211464b2f233be07dd..48a3d62e2758d87deff80f7d9d4aac56e046ada1 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')