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