Skip to content
Snippets Groups Projects
Commit 6af31ceb authored by Pierre Fleutot's avatar Pierre Fleutot
Browse files

La méthode unique de création de label passe dans LabelManager et utilise la...

La méthode unique de création de label passe dans LabelManager et utilise la fonction existante getIdenticalLabel pour vérifier l'unicité. On inclut le paramètre milestone dans la méthode.
parent ec7ee76e
No related branches found
No related tags found
No related merge requests found
......@@ -7,6 +7,7 @@ use App\Entity\Graphy;
use App\Entity\GraphyList;
use App\Entity\Label;
use App\Form\GraphyListType;
use App\Manager\LabelManager;
use App\Manager\WiktionaryManager;
use App\Repository\GraphyListRepository;
use Doctrine\Persistence\ManagerRegistry;
......@@ -79,7 +80,7 @@ class ApiGraphyListController extends AppBaseController
* @OA\Tag(name="Lists")
* @Security(name="OAuth2")
*/
public function createGraphyList(Request $request): Response
public function createGraphyList(Request $request, LabelManager $labelManager): Response
{
$data = json_decode($request->getContent(), true);
if (!$data) {
......@@ -98,7 +99,7 @@ class ApiGraphyListController extends AppBaseController
$graphyList = new GraphyList($data['category']);
$graphyList->setCreatedBy($this->getUser());
$graphyList->setLanguage($data['language']);
$listLabel = $this->createLabelIfNoSimilar(Label::LABEL_CATEGORY_LIST, $data['language'], $data['name'], Label::MASTER_PUBLIC);
$listLabel = $labelManager->createLabelIfUnique(Label::LABEL_CATEGORY_LIST, $data['language'], $data['name'], Label::MASTER_PUBLIC, null, null);
$graphyList->setLabel($listLabel);
$graphyList->setName($data['name']);
$this->doctrine->getManager()->persist($graphyList);
......
......@@ -83,7 +83,7 @@ class ApiLabelController extends AppBaseController
* @OA\Tag(name="Labels")
* @Security(name="OAuth2")
*/
public function createLabel(Request $request): Response
public function createLabel(Request $request, LabelManager $labelManager): Response
{
$data = json_decode($request->getContent(), true);
if (!$data) {
......@@ -122,13 +122,13 @@ class ApiLabelController extends AppBaseController
$owner = $this->doctrine->getRepository(User::class)->find($masterId);
if (!$owner) return $this->createJsonResponse(401, ['error' => sprintf("Impossible de trouver l'utilisateur pour l'id «%s»", $masterId)]);
}
if ($data['category'] === Label::LABEL_CATEGORY_MILESTONE) {
$milestoneDate = date_create_from_format('Y-m-d', $milestone);
}
$label = $this->createLabelIfNoSimilar($data['category'], $data['language'], $data['name'], $masterType, $owner ?? null);
$label = $labelManager->createLabelIfUnique($data['category'], $data['language'], $data['name'], $masterType, $owner ?? null, $milestoneDate ?? null);
if (!$label) return $this->createJsonResponse(401, ['error' => sprintf("Un label de même nom existe déjà")]);
if ($label->isMilestone()) {
$label->setMilestone(date_create_from_format('Y-m-d', $milestone));
}
$this->success[] = sprintf("Label %s de type %s créé.", $data['name'], $data['category']);
$this->doctrine->getManager()->flush();
......
......@@ -543,49 +543,4 @@ class AppBaseController extends AbstractController
$this->em->persist($log);
}
// Si label Public : On ne crée pas le label si un de même nom existe déjà
// Si groupe : On ne crée pas le label si un de même nom existe déjà pour le groupe
// Si personnel : On ne crée pas le label si un de même nom existe déjà pour l'utilisateur
public function createLabelIfNoSimilar($category, $language, $name, $masterType, $owner = null, $forceCreation = false)
{
if ($masterType !== Label::MASTER_PUBLIC && ! $owner) {
throw new \Exception("You must provide a master to create a non public label");
}
if ($masterType === Label::MASTER_PUBLIC) {
$similarLabel = $this->doctrine->getRepository(Label::class)->findOneBy([
'name' => $name,
'master' => Label::MASTER_PUBLIC,
'language' => $language
]);
} elseif ($masterType === Label::MASTER_GROUP) {
$similarLabel = $this->doctrine->getRepository(Label::class)->findOneBy([
'name' => $name,
'group' => $owner,
]);
} elseif ($masterType === Label::MASTER_PERSONAL) {
$similarLabel = $this->doctrine->getRepository(Label::class)->findOneBy([
'name' => $name,
'user' => $owner,
]);
}
if ($similarLabel && ! $forceCreation) {
return false;
}
$label = new Label($category);
$label->setLanguage($language);
$label->setName($name);
$label->setMaster($masterType);
if ($masterType === Label::MASTER_GROUP) {
$label->setGroup($owner);
} elseif ($masterType === Label::MASTER_PERSONAL) {
$label->setUser($owner);
}
$this->doctrine->getManager()->persist($label);
return $label;
}
}
......@@ -5,6 +5,7 @@ namespace App\Controller;
use App\Entity\GraphyList;
use App\Entity\Label;
use App\Form\GraphyListType;
use App\Manager\LabelManager;
use App\Repository\GraphyListRepository;
use Doctrine\Persistence\ManagerRegistry;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
......@@ -31,7 +32,7 @@ class GraphyListController extends AppBaseController
/**
* @Route("/add", name="app_graphy_list_new", methods={"GET", "POST"})
*/
public function new(Request $request, GraphyListRepository $graphyListRepository): Response
public function new(Request $request, GraphyListRepository $graphyListRepository, LabelManager $labelManager): Response
{
$graphyList = new GraphyList($this->getUser());
$form = $this->createForm(GraphyListType::class, $graphyList);
......@@ -40,7 +41,7 @@ class GraphyListController extends AppBaseController
if ($form->isSubmitted() && $form->isValid()) {
$language = $form->get('language')->getData();
$graphyList->getLexicon()->setLanguage($language);
$listLabel = $this->createLabelIfNoSimilar(Label::LABEL_CATEGORY_LIST, $language, $graphyList->getName(), Label::MASTER_PUBLIC);
$listLabel = $labelManager->createLabelIfUnique(Label::LABEL_CATEGORY_LIST, $language, $graphyList->getName(), Label::MASTER_PUBLIC, null, null);
$graphyList->setLabel($listLabel);
$graphyListRepository->add($graphyList, true);
......
......@@ -69,7 +69,7 @@ class LabelController extends AppBaseController
}
}
$label = $this->createLabelIfNoSimilar($category, $this->getLanguage(), '', $masterType, $owner);
$label = $labelManager->createLabelIfUnique($category, $this->getLanguage(), '', $masterType, $owner, null, true);
$form = $this->createForm(LabelType::class, $label, [
'action' => $this->generateUrl('app_label_new', [
......@@ -538,7 +538,7 @@ class LabelController extends AppBaseController
public function copyAsPersonal(Request $request, Notification $notification, LabelManager $labelManager): Response
{
$label = $notification->getUpdateRequest()->getLabel();
$personalLabel = $this->createLabelIfNoSimilar($label->getCategory(), $label->getLanguage(), $label->getName(), Label::MASTER_PERSONAL, $this->getUser(), true);
$personalLabel = $labelManager->createLabelIfUnique($label->getCategory(), $label->getLanguage(), $label->getName(), Label::MASTER_PERSONAL, $this->getUser(), $label->getMilestone(), true);
foreach ($label->getHeadwords() as $headword) {
$headword->addLabel($personalLabel);
}
......
......@@ -12,6 +12,9 @@ use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=LabelRepository::class)
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="label", uniqueConstraints={
* @ORM\UniqueConstraint(name="label_unique", columns={"user", "group", "master", "name", "language", "milestone", "graphyList", "category"})
* })
*/
class Label
{
......@@ -72,6 +75,7 @@ class Label
/**
* @ORM\Column(type="string", length=255)
* @Groups({"label:read"})
* @Assert\NotBlank()
*/
private $name;
......
......@@ -71,6 +71,43 @@ class LabelManager
$this->doctrine->getManager()->remove($labelDeleted);
}
/**
* @param $category
* @param $language
* @param $name
* @param $masterType
* @param $owner
* @param null $milestone
* @param bool $forceCreation
* @return Label|bool
* @throws \Exception
*/
public function createLabelIfUnique($category, $language, $name, $masterType, $owner, $milestone = null, $forceCreation = false)
{
if ($masterType !== Label::MASTER_PUBLIC && ! $owner) {
throw new \Exception("You must provide a master to create a non public label");
}
$label = new Label($category);
$label->setLanguage($language);
$label->setName($name);
$label->setMaster($masterType);
$label->setMilestone($milestone);
if ($masterType === Label::MASTER_GROUP) {
$label->setGroup($owner);
} elseif ($masterType === Label::MASTER_PERSONAL) {
$label->setUser($owner);
}
if ($this->getIdenticalLabel($label) && ! $forceCreation) {
return false;
} else {
$this->doctrine->getManager()->persist($label);
return $label;
}
}
/**
* @param Label $label
* @return Label|null
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment