From ab3094eeb7f36f77f13ff2e169b37e9cbca3dd61 Mon Sep 17 00:00:00 2001 From: Yorick Terweijden Date: Mon, 5 May 2014 12:04:49 +0200 Subject: [PATCH] Implements the deletion of SnippetTemplates --- .../Snippet/SnippetTemplateRepository.php | 27 +++++++++++++++---- .../Entity/Snippet/SnippetTemplate.php | 4 +-- .../Controller/SnippetTemplatesController.php | 27 +++++++++++++++++++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/newscoop/library/Newscoop/Entity/Repository/Snippet/SnippetTemplateRepository.php b/newscoop/library/Newscoop/Entity/Repository/Snippet/SnippetTemplateRepository.php index e3f3a11c88..3b087845c3 100644 --- a/newscoop/library/Newscoop/Entity/Repository/Snippet/SnippetTemplateRepository.php +++ b/newscoop/library/Newscoop/Entity/Repository/Snippet/SnippetTemplateRepository.php @@ -201,11 +201,28 @@ public function getCurrentlyUsed() return $queryBuilder->getQuery(); } - /** - * Flush method - */ - public function flush() + public function deleteSnippetTemplate($id, $force = false) { - $this->getEntityManager()->flush(); + // check if the SnippetTemplate has any Snippets attached to it. + $snippetTemplate = $this->getTemplateById($id, 'all'); + if (!is_null($snippetTemplate)) { + $snippets = $snippetTemplate->getSnippets()->toArray(); + if (count($snippets) == 0 || $force == true) { + $em = $this->getEntityManager(); + $em->remove($snippetTemplate); + $em->flush(); + + return true; + } else { + foreach ($snippets as $snippet) { + $snippetIdArr[$snippet->getId()] = $snippet->getId(); + } + $snippetIds = implode(", ", array_flip($snippetIdArr)); + + throw new \Newscoop\Exception\ResourcesConflictException('SnippetTemplate with ID: '.$id.' is in use by Snippets ('.$snippetIds.')'); + } + } else { + throw new \Exception('SnippetTemplate with ID: '.$id.' does not exist'); + } } } diff --git a/newscoop/library/Newscoop/Entity/Snippet/SnippetTemplate.php b/newscoop/library/Newscoop/Entity/Snippet/SnippetTemplate.php index 5edebab513..7a18c8c130 100644 --- a/newscoop/library/Newscoop/Entity/Snippet/SnippetTemplate.php +++ b/newscoop/library/Newscoop/Entity/Snippet/SnippetTemplate.php @@ -29,7 +29,7 @@ class SnippetTemplate protected $id; /** - * @ORM\OneToMany(targetEntity="Newscoop\Entity\Snippet", mappedBy="template") + * @ORM\OneToMany(targetEntity="Newscoop\Entity\Snippet", cascade={"remove"}, mappedBy="template") * @var Doctrine\Common\Collections\ArrayCollection */ protected $snippets; @@ -47,7 +47,7 @@ class SnippetTemplate protected $controller; /** - * @ORM\OneToMany(targetEntity="Newscoop\Entity\Snippet\SnippetTemplate\SnippetTemplateField", mappedBy="template", cascade={"persist"}, indexBy="templateFieldName") + * @ORM\OneToMany(targetEntity="Newscoop\Entity\Snippet\SnippetTemplate\SnippetTemplateField", mappedBy="template", cascade={"persist", "remove"}, indexBy="templateFieldName") * @var Doctrine\Common\Collections\ArrayCollection */ protected $fields; diff --git a/newscoop/src/Newscoop/GimmeBundle/Controller/SnippetTemplatesController.php b/newscoop/src/Newscoop/GimmeBundle/Controller/SnippetTemplatesController.php index 68421c3a0f..b8220123c5 100644 --- a/newscoop/src/Newscoop/GimmeBundle/Controller/SnippetTemplatesController.php +++ b/newscoop/src/Newscoop/GimmeBundle/Controller/SnippetTemplatesController.php @@ -101,4 +101,31 @@ public function getSingleSnippetTemplateAction(Request $request, $id) return $snippetTemplate; } + /** + * Delete SnippetTemplate + * + * @ApiDoc( + * statusCodes={ + * 204="Returned when SnippetTemplate removed succesfuly", + * 404={ + * "Returned when the SnippetTemplate is not found", + * }, + * 409="Returned when SnippetTemplate is used by Articles" + * }, + * parameters={ + * {"name"="force", "dataType"="boolean", "required"=false, "description"="Force delete"}, + * } + * ) + * + * @Route("/snippetTemplates/{id}.{_format}", defaults={"_format"="json"}) + * @Method("DELETE") + * @View(statusCode=204) + */ + public function deleteSnippetTemplateAction(Request $request, $id) + { + $force = $request->query->get('force', false); + $em = $this->container->get('em'); + $articleSnippets = $em->getRepository('Newscoop\Entity\Snippet\SnippetTemplate') + ->deleteSnippetTemplate($id, $force); + } }