]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
add relation between user and tags, tests are broken
authorNicolas Lœuillet <nicolas@loeuillet.org>
Thu, 26 Feb 2015 08:41:42 +0000 (09:41 +0100)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Fri, 6 Mar 2015 20:09:15 +0000 (21:09 +0100)
src/Wallabag/CoreBundle/Controller/WallabagRestController.php
src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Entity/Tag.php
src/Wallabag/CoreBundle/Entity/User.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
src/Wallabag/CoreBundle/Tests/Controller/WallabagRestControllerTest.php

index e59ad4b7bf9d208f77cb51feda46a620f59deab7..81bfbe12a58bf40a0facf908f6f711a36a6b834a 100644 (file)
@@ -9,9 +9,35 @@ use Symfony\Component\HttpFoundation\Response;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Entity\Tag;
 use Wallabag\CoreBundle\Service\Extractor;
+use Symfony\Component\Security\Core\Exception\AccessDeniedException;
 
 class WallabagRestController extends Controller
 {
+    /**
+     * @param Entry  $entry
+     * @param string $tags
+     */
+    private function assignTagsToEntry(Entry $entry, $tags)
+    {
+        foreach (explode(',', $tags) as $label) {
+            $label = trim($label);
+            $tagEntity = $this
+                ->getDoctrine()
+                ->getRepository('WallabagCoreBundle:Tag')
+                ->findOneByLabel($label);
+
+            if (is_null($tagEntity)) {
+                $tagEntity = new Tag($this->getUser());
+                $tagEntity->setLabel($label);
+            }
+
+            // only add the tag on the entry if the relation doesn't exist
+            if (!$entry->getTags()->contains($tagEntity)) {
+                $entry->addTag($tagEntity);
+            }
+        }
+    }
+
     /**
      * Retrieve salt for a giver user.
      *
@@ -87,6 +113,10 @@ class WallabagRestController extends Controller
      */
     public function getEntryAction(Entry $entry)
     {
+        if ($entry->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
+        }
+
         $json = $this->get('serializer')->serialize($entry, 'json');
 
         return new Response($json, 200, array('application/json'));
@@ -106,7 +136,6 @@ class WallabagRestController extends Controller
      */
     public function postEntriesAction(Request $request)
     {
-        //TODO gérer si on passe les tags
         $url = $request->request->get('url');
 
         $content = Extractor::extract($url);
@@ -114,6 +143,9 @@ class WallabagRestController extends Controller
         $entry->setUrl($url);
         $entry->setTitle($request->request->get('title') ?: $content->getTitle());
         $entry->setContent($content->getBody());
+
+        $this->assignTagsToEntry($entry, $request->request->get('tags', array()));
+
         $em = $this->getDoctrine()->getManager();
         $em->persist($entry);
         $em->flush();
@@ -141,8 +173,11 @@ class WallabagRestController extends Controller
      */
     public function patchEntriesAction(Entry $entry, Request $request)
     {
+        if ($entry->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
+        }
+
         $title      = $request->request->get("title");
-        $tags       = $request->request->get("tags", array());
         $isArchived = $request->request->get("archive");
         $isStarred  = $request->request->get("star");
 
@@ -158,6 +193,8 @@ class WallabagRestController extends Controller
             $entry->setStarred($isStarred);
         }
 
+        $this->assignTagsToEntry($entry, $request->request->get('tags', array()));
+
         $em = $this->getDoctrine()->getManager();
         $em->flush();
 
@@ -176,6 +213,10 @@ class WallabagRestController extends Controller
      */
     public function deleteEntriesAction(Entry $entry)
     {
+        if ($entry->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
+        }
+
         $em = $this->getDoctrine()->getManager();
         $em->remove($entry);
         $em->flush();
@@ -196,6 +237,12 @@ class WallabagRestController extends Controller
      */
     public function getEntriesTagsAction(Entry $entry)
     {
+        var_dump($entry->getUser()->getId());
+        var_dump($this->getUser()->getId());
+        if ($entry->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
+        }
+
         $json = $this->get('serializer')->serialize($entry->getTags(), 'json');
 
         return new Response($json, 200, array('application/json'));
@@ -215,25 +262,12 @@ class WallabagRestController extends Controller
      */
     public function postEntriesTagsAction(Request $request, Entry $entry)
     {
-        $tags = explode(',', $request->request->get('tags'));
-
-        foreach ($tags as $label) {
-            $tagEntity = $this
-                ->getDoctrine()
-                ->getRepository('WallabagCoreBundle:Tag')
-                ->findOneByLabel($label);
-
-            if (is_null($tagEntity)) {
-                $tagEntity = new Tag();
-                $tagEntity->setLabel($label);
-            }
-
-            // only add the tag on the entry if the relation doesn't exist
-            if (!$entry->getTags()->contains($tagEntity)) {
-                $entry->addTag($tagEntity);
-            }
+        if ($entry->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
         }
 
+        $this->assignTagsToEntry($entry, $request->request->get('tags', array()));
+
         $em = $this->getDoctrine()->getManager();
         $em->persist($entry);
         $em->flush();
@@ -255,17 +289,30 @@ class WallabagRestController extends Controller
      */
     public function deleteEntriesTagsAction(Entry $entry, Tag $tag)
     {
+        if ($entry->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
+        }
+
+        $entry->removeTag($tag);
+        $em = $this->getDoctrine()->getManager();
+        $em->persist($entry);
+        $em->flush();
+
+        $json = $this->get('serializer')->serialize($entry, 'json');
+
+        return new Response($json, 200, array('application/json'));
     }
 
     /**
      * Retrieve all tags
      *
-     * @ApiDoc(
-     *          {"name"="user", "dataType"="integer", "requirement"="\w+", "description"="The user ID"}
-     * )
+     * @ApiDoc()
      */
-    public function getTagsUserAction()
+    public function getTagsAction()
     {
+        $json = $this->get('serializer')->serialize($this->getUser()->getTags(), 'json');
+
+        return new Response($json, 200, array('application/json'));
     }
 
     /**
@@ -279,5 +326,16 @@ class WallabagRestController extends Controller
      */
     public function deleteTagAction(Tag $tag)
     {
+        if ($tag->getUser()->getId() != $this->getUser()->getId()) {
+            throw $this->createAccessDeniedException();
+        }
+
+        $em = $this->getDoctrine()->getManager();
+        $em->remove($tag);
+        $em->flush();
+
+        $json = $this->get('serializer')->serialize($tag, 'json');
+
+        return new Response($json, 200, array('application/json'));
     }
 }
index edab9adcd87aca1ea6d2d8b91282b4717e416127..b0f077550f44606ddf89f3198dd96b76a4934825 100644 (file)
@@ -38,9 +38,9 @@ class LoadEntryData extends AbstractFixture implements OrderedFixtureInterface
         $entry3->setTitle('test title entry3');
         $entry3->setContent('This is my content /o/');
 
-        $tag1 = new Tag();
+        $tag1 = new Tag($this->getReference('admin-user'));
         $tag1->setLabel("foo");
-        $tag2 = new Tag();
+        $tag2 = new Tag($this->getReference('admin-user'));
         $tag2->setLabel("bar");
 
         $entry3->addTag($tag1);
index 229a67045b0c04fe7737dcd8cefefaa5020fb50d..75aeae84bffff83d0124f2c3d06172e82d047240 100644 (file)
@@ -406,4 +406,9 @@ class Entry
         $this->tags[] = $tag;
         $tag->addEntry($this);
     }
+
+    public function removeTag(Tag $tag)
+    {
+        $this->tags->removeElement($tag);
+    }
 }
index 5aed1fa010008727e3550a6763f710d291ec212f..29a5e4b5eb69e1b2b07ef1bb49608afce7469e7a 100644 (file)
@@ -41,8 +41,14 @@ class Tag
      */
     private $entries;
 
-    public function __construct()
+    /**
+     * @ORM\ManyToOne(targetEntity="User", inversedBy="tags")
+     */
+    private $user;
+
+    public function __construct(User $user)
     {
+        $this->user    = $user;
         $this->entries = new ArrayCollection();
     }
     /**
index 5589c039e754e15e8192a3498a7f6e5a17cdec87..f05c8760e03e2780f5cbbf85e302f93fe2327f26 100644 (file)
@@ -101,10 +101,17 @@ class User implements AdvancedUserInterface, \Serializable
      */
     private $config;
 
+    /**
+     * @ORM\OneToMany(targetEntity="Tag", mappedBy="user", cascade={"remove"})
+     */
+    private $tags;
+
     public function __construct()
     {
-        $this->salt    = md5(uniqid(null, true));
-        $this->entries = new ArrayCollection();
+        $this->isActive = true;
+        $this->salt     = md5(uniqid(null, true));
+        $this->entries  = new ArrayCollection();
+        $this->tags     = new ArrayCollection();
     }
 
     /**
@@ -278,6 +285,25 @@ class User implements AdvancedUserInterface, \Serializable
         return $this->entries;
     }
 
+    /**
+     * @param Entry $entry
+     *
+     * @return User
+     */
+    public function addTag(Tag $tag)
+    {
+        $this->tags[] = $tag;
+
+        return $this;
+    }
+
+    /**
+     * @return ArrayCollection<Tag>
+     */
+    public function getTags()
+    {
+        return $this->tags;
+    }
     /**
      * @inheritDoc
      */
index 10fb9bf7933ca1f986bcce8712d640f5c2a25ef4..a8085ac9cbeb01bdc4c7bb6331ef1b72f6380765 100644 (file)
@@ -124,11 +124,14 @@ class EntryRepository extends EntityRepository
      *
      * @return Entry
      */
-    public function findOneWithTags()
+    public function findOneWithTags($userId)
     {
         $qb = $this->createQueryBuilder('e')
             ->innerJoin('e.tags', 't')
-            ->addSelect('t');
+            ->addSelect('t')
+            ->where('t.user=:userId')->setParameter('userId', 1);
+
+        return $qb->getQuery()->getOneOrNullResult();
 
         return $qb
             ->getQuery()
index cadbb70b7d8f4a22627765e605d3b6258133f36e..044485376780709117682a59c48128ee54280a3d 100644 (file)
@@ -161,7 +161,9 @@ class WallabagRestControllerTest extends WallabagTestCase
         $entry = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
-            ->findOneWithTags();
+            ->findOneWithTags(1);
+
+        var_dump($entry->getTitle());
 
         if (!$entry) {
             $this->markTestSkipped('No content found in db.');