diff options
Diffstat (limited to 'src/Wallabag/CoreBundle')
10 files changed, 109 insertions, 66 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index fd2069e0..64d53f0c 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php | |||
@@ -20,25 +20,23 @@ class TagController extends Controller | |||
20 | */ | 20 | */ |
21 | public function addTagFormAction(Request $request, Entry $entry) | 21 | public function addTagFormAction(Request $request, Entry $entry) |
22 | { | 22 | { |
23 | $tag = new Tag($this->getUser()); | 23 | $tag = new Tag(); |
24 | $form = $this->createForm(new NewTagType(), $tag); | 24 | $form = $this->createForm(new NewTagType(), $tag); |
25 | $form->handleRequest($request); | 25 | $form->handleRequest($request); |
26 | 26 | ||
27 | if ($form->isValid()) { | 27 | if ($form->isValid()) { |
28 | $existingTag = $this->getDoctrine() | 28 | $existingTag = $this->getDoctrine() |
29 | ->getRepository('WallabagCoreBundle:Tag') | 29 | ->getRepository('WallabagCoreBundle:Tag') |
30 | ->findOneByLabelAndUserId($tag->getLabel(), $this->getUser()->getId()); | 30 | ->findOneByLabel($tag->getLabel()); |
31 | 31 | ||
32 | $em = $this->getDoctrine()->getManager(); | 32 | $em = $this->getDoctrine()->getManager(); |
33 | 33 | ||
34 | if (is_null($existingTag)) { | 34 | if (is_null($existingTag)) { |
35 | $entry->addTag($tag); | 35 | $entry->addTag($tag); |
36 | $em->persist($tag); | 36 | $em->persist($tag); |
37 | } else { | 37 | } elseif (!$existingTag->hasEntry($entry)) { |
38 | if (!$existingTag->hasEntry($entry)) { | 38 | $entry->addTag($existingTag); |
39 | $entry->addTag($existingTag); | 39 | $em->persist($existingTag); |
40 | $em->persist($existingTag); | ||
41 | } | ||
42 | } | 40 | } |
43 | 41 | ||
44 | $em->flush(); | 42 | $em->flush(); |
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php index 0513cdb8..6c6a331a 100644 --- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php +++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadEntryData.php | |||
@@ -6,7 +6,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture; | |||
6 | use Doctrine\Common\DataFixtures\OrderedFixtureInterface; | 6 | use Doctrine\Common\DataFixtures\OrderedFixtureInterface; |
7 | use Doctrine\Common\Persistence\ObjectManager; | 7 | use Doctrine\Common\Persistence\ObjectManager; |
8 | use Wallabag\CoreBundle\Entity\Entry; | 8 | use Wallabag\CoreBundle\Entity\Entry; |
9 | use Wallabag\CoreBundle\Entity\Tag; | ||
10 | 9 | ||
11 | class LoadEntryData extends AbstractFixture implements OrderedFixtureInterface | 10 | class LoadEntryData extends AbstractFixture implements OrderedFixtureInterface |
12 | { | 11 | { |
@@ -50,13 +49,8 @@ class LoadEntryData extends AbstractFixture implements OrderedFixtureInterface | |||
50 | $entry3->setContent('This is my content /o/'); | 49 | $entry3->setContent('This is my content /o/'); |
51 | $entry3->setLanguage('en'); | 50 | $entry3->setLanguage('en'); |
52 | 51 | ||
53 | $tag1 = new Tag($this->getReference('bob-user')); | 52 | $entry3->addTag($this->getReference('foo-tag')); |
54 | $tag1->setLabel('foo'); | 53 | $entry3->addTag($this->getReference('bar-tag')); |
55 | $tag2 = new Tag($this->getReference('bob-user')); | ||
56 | $tag2->setLabel('bar'); | ||
57 | |||
58 | $entry3->addTag($tag1); | ||
59 | $entry3->addTag($tag2); | ||
60 | 54 | ||
61 | $manager->persist($entry3); | 55 | $manager->persist($entry3); |
62 | 56 | ||
@@ -71,13 +65,8 @@ class LoadEntryData extends AbstractFixture implements OrderedFixtureInterface | |||
71 | $entry4->setContent('This is my content /o/'); | 65 | $entry4->setContent('This is my content /o/'); |
72 | $entry4->setLanguage('en'); | 66 | $entry4->setLanguage('en'); |
73 | 67 | ||
74 | $tag1 = new Tag($this->getReference('admin-user')); | 68 | $entry4->addTag($this->getReference('foo-tag')); |
75 | $tag1->setLabel('foo'); | 69 | $entry4->addTag($this->getReference('bar-tag')); |
76 | $tag2 = new Tag($this->getReference('admin-user')); | ||
77 | $tag2->setLabel('bar'); | ||
78 | |||
79 | $entry4->addTag($tag1); | ||
80 | $entry4->addTag($tag2); | ||
81 | 70 | ||
82 | $manager->persist($entry4); | 71 | $manager->persist($entry4); |
83 | 72 | ||
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTagData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTagData.php new file mode 100644 index 00000000..8553dced --- /dev/null +++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTagData.php | |||
@@ -0,0 +1,41 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\DataFixtures\ORM; | ||
4 | |||
5 | use Doctrine\Common\DataFixtures\AbstractFixture; | ||
6 | use Doctrine\Common\DataFixtures\OrderedFixtureInterface; | ||
7 | use Doctrine\Common\Persistence\ObjectManager; | ||
8 | use Wallabag\CoreBundle\Entity\Tag; | ||
9 | |||
10 | class LoadTagData extends AbstractFixture implements OrderedFixtureInterface | ||
11 | { | ||
12 | /** | ||
13 | * {@inheritdoc} | ||
14 | */ | ||
15 | public function load(ObjectManager $manager) | ||
16 | { | ||
17 | $tag1 = new Tag(); | ||
18 | $tag1->setLabel('foo'); | ||
19 | |||
20 | $manager->persist($tag1); | ||
21 | |||
22 | $this->addReference('foo-tag', $tag1); | ||
23 | |||
24 | $tag2 = new Tag(); | ||
25 | $tag2->setLabel('bar'); | ||
26 | |||
27 | $manager->persist($tag2); | ||
28 | |||
29 | $this->addReference('bar-tag', $tag2); | ||
30 | |||
31 | $manager->flush(); | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * {@inheritdoc} | ||
36 | */ | ||
37 | public function getOrder() | ||
38 | { | ||
39 | return 25; | ||
40 | } | ||
41 | } | ||
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 2813c944..b413c489 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php | |||
@@ -465,7 +465,7 @@ class Entry | |||
465 | // check if tag already exist but has not yet be persisted | 465 | // check if tag already exist but has not yet be persisted |
466 | // it seems that the previous condition with `contains()` doesn't check that case | 466 | // it seems that the previous condition with `contains()` doesn't check that case |
467 | foreach ($this->tags as $existingTag) { | 467 | foreach ($this->tags as $existingTag) { |
468 | if ($existingTag->getUser() !== $tag->getUser() || $existingTag->getLabel() === $tag->getLabel()) { | 468 | if ($existingTag->getLabel() === $tag->getLabel()) { |
469 | return; | 469 | return; |
470 | } | 470 | } |
471 | } | 471 | } |
diff --git a/src/Wallabag/CoreBundle/Entity/Tag.php b/src/Wallabag/CoreBundle/Entity/Tag.php index 4ed588be..0689c7b3 100644 --- a/src/Wallabag/CoreBundle/Entity/Tag.php +++ b/src/Wallabag/CoreBundle/Entity/Tag.php | |||
@@ -38,6 +38,7 @@ class Tag | |||
38 | private $label; | 38 | private $label; |
39 | 39 | ||
40 | /** | 40 | /** |
41 | * @Expose | ||
41 | * @Gedmo\Slug(fields={"label"}) | 42 | * @Gedmo\Slug(fields={"label"}) |
42 | * @ORM\Column(length=128, unique=true) | 43 | * @ORM\Column(length=128, unique=true) |
43 | */ | 44 | */ |
@@ -48,14 +49,8 @@ class Tag | |||
48 | */ | 49 | */ |
49 | private $entries; | 50 | private $entries; |
50 | 51 | ||
51 | /** | 52 | public function __construct() |
52 | * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="tags") | ||
53 | */ | ||
54 | private $user; | ||
55 | |||
56 | public function __construct(\Wallabag\UserBundle\Entity\User $user) | ||
57 | { | 53 | { |
58 | $this->user = $user; | ||
59 | $this->entries = new ArrayCollection(); | 54 | $this->entries = new ArrayCollection(); |
60 | } | 55 | } |
61 | 56 | ||
@@ -112,12 +107,4 @@ class Tag | |||
112 | { | 107 | { |
113 | return $this->entries->contains($entry); | 108 | return $this->entries->contains($entry); |
114 | } | 109 | } |
115 | |||
116 | /** | ||
117 | * @return User | ||
118 | */ | ||
119 | public function getUser() | ||
120 | { | ||
121 | return $this->user; | ||
122 | } | ||
123 | } | 110 | } |
diff --git a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php index 41ef25b8..991c9a56 100644 --- a/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php +++ b/src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php | |||
@@ -37,7 +37,7 @@ class RuleBasedTagger | |||
37 | } | 37 | } |
38 | 38 | ||
39 | foreach ($rule->getTags() as $label) { | 39 | foreach ($rule->getTags() as $label) { |
40 | $tag = $this->getTag($entry->getUser(), $label); | 40 | $tag = $this->getTag($label); |
41 | 41 | ||
42 | $entry->addTag($tag); | 42 | $entry->addTag($tag); |
43 | } | 43 | } |
@@ -62,7 +62,7 @@ class RuleBasedTagger | |||
62 | 62 | ||
63 | foreach ($entries as $entry) { | 63 | foreach ($entries as $entry) { |
64 | foreach ($rule->getTags() as $label) { | 64 | foreach ($rule->getTags() as $label) { |
65 | $tag = $this->getTag($user, $label); | 65 | $tag = $this->getTag($label); |
66 | 66 | ||
67 | $entry->addTag($tag); | 67 | $entry->addTag($tag); |
68 | } | 68 | } |
@@ -73,19 +73,18 @@ class RuleBasedTagger | |||
73 | } | 73 | } |
74 | 74 | ||
75 | /** | 75 | /** |
76 | * Fetch a tag for a user. | 76 | * Fetch a tag. |
77 | * | 77 | * |
78 | * @param User $user | ||
79 | * @param string $label The tag's label. | 78 | * @param string $label The tag's label. |
80 | * | 79 | * |
81 | * @return Tag | 80 | * @return Tag |
82 | */ | 81 | */ |
83 | private function getTag(User $user, $label) | 82 | private function getTag($label) |
84 | { | 83 | { |
85 | $tag = $this->tagRepository->findOneByLabelAndUserId($label, $user->getId()); | 84 | $tag = $this->tagRepository->findOneByLabel($label); |
86 | 85 | ||
87 | if (!$tag) { | 86 | if (!$tag) { |
88 | $tag = new Tag($user); | 87 | $tag = new Tag(); |
89 | $tag->setLabel($label); | 88 | $tag->setLabel($label); |
90 | } | 89 | } |
91 | 90 | ||
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 57bf8024..9ff80d6e 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php | |||
@@ -5,6 +5,7 @@ namespace Wallabag\CoreBundle\Repository; | |||
5 | use Doctrine\ORM\EntityRepository; | 5 | use Doctrine\ORM\EntityRepository; |
6 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 6 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
7 | use Pagerfanta\Pagerfanta; | 7 | use Pagerfanta\Pagerfanta; |
8 | use Wallabag\CoreBundle\Entity\Tag; | ||
8 | 9 | ||
9 | class EntryRepository extends EntityRepository | 10 | class EntryRepository extends EntityRepository |
10 | { | 11 | { |
@@ -179,4 +180,22 @@ class EntryRepository extends EntityRepository | |||
179 | ->getQuery() | 180 | ->getQuery() |
180 | ->getSingleResult(); | 181 | ->getSingleResult(); |
181 | } | 182 | } |
183 | |||
184 | /** | ||
185 | * Remove a tag from all user entries. | ||
186 | * We are using a native SQL query because Doctrine doesn't know EntryTag entity because it's a ManyToMany relation. | ||
187 | * Instead of that SQL query we should loop on every entry and remove the tag, could be really long ... | ||
188 | * | ||
189 | * @param int $userId | ||
190 | * @param Tag $tag | ||
191 | */ | ||
192 | public function removeTag($userId, Tag $tag) | ||
193 | { | ||
194 | $sql = 'DELETE et FROM entry_tag et WHERE et.entry_id IN ( SELECT e.id FROM entry e WHERE e.user_id = :userId ) AND et.tag_id = :tagId'; | ||
195 | $stmt = $this->getEntityManager()->getConnection()->prepare($sql); | ||
196 | $stmt->execute([ | ||
197 | 'userId' => $userId, | ||
198 | 'tagId' => $tag->getId(), | ||
199 | ]); | ||
200 | } | ||
182 | } | 201 | } |
diff --git a/src/Wallabag/CoreBundle/Repository/TagRepository.php b/src/Wallabag/CoreBundle/Repository/TagRepository.php index ac3145a1..c4aeb594 100644 --- a/src/Wallabag/CoreBundle/Repository/TagRepository.php +++ b/src/Wallabag/CoreBundle/Repository/TagRepository.php | |||
@@ -9,16 +9,29 @@ use Pagerfanta\Pagerfanta; | |||
9 | class TagRepository extends EntityRepository | 9 | class TagRepository extends EntityRepository |
10 | { | 10 | { |
11 | /** | 11 | /** |
12 | * Find Tags. | 12 | * Return only the QueryBuilder to retrieve all tags for a given user. |
13 | * | 13 | * |
14 | * @param int $userId | 14 | * @param int $userId |
15 | * | 15 | * |
16 | * @return array | 16 | * @return QueryBuilder |
17 | */ | ||
18 | private function getQbForAllTags($userId) | ||
19 | { | ||
20 | return $this->createQueryBuilder('t') | ||
21 | ->leftJoin('t.entries', 'e') | ||
22 | ->where('e.user = :userId')->setParameter('userId', $userId); | ||
23 | } | ||
24 | |||
25 | /** | ||
26 | * Find Tags and return a Pager. | ||
27 | * | ||
28 | * @param int $userId | ||
29 | * | ||
30 | * @return Pagerfanta | ||
17 | */ | 31 | */ |
18 | public function findTags($userId) | 32 | public function findTags($userId) |
19 | { | 33 | { |
20 | $qb = $this->createQueryBuilder('t') | 34 | $qb = $this->getQbForAllTags($userId); |
21 | ->where('t.user =:userId')->setParameter('userId', $userId); | ||
22 | 35 | ||
23 | $pagerAdapter = new DoctrineORMAdapter($qb); | 36 | $pagerAdapter = new DoctrineORMAdapter($qb); |
24 | 37 | ||
@@ -26,19 +39,16 @@ class TagRepository extends EntityRepository | |||
26 | } | 39 | } |
27 | 40 | ||
28 | /** | 41 | /** |
29 | * Find a tag by its label and its owner. | 42 | * Find Tags. |
30 | * | 43 | * |
31 | * @param string $label | 44 | * @param int $userId |
32 | * @param int $userId | ||
33 | * | 45 | * |
34 | * @return Tag|null | 46 | * @return array |
35 | */ | 47 | */ |
36 | public function findOneByLabelAndUserId($label, $userId) | 48 | public function findAllTags($userId) |
37 | { | 49 | { |
38 | return $this->createQueryBuilder('t') | 50 | return $this->getQbForAllTags($userId) |
39 | ->where('t.label = :label')->setParameter('label', $label) | ||
40 | ->andWhere('t.user = :user_id')->setParameter('user_id', $userId) | ||
41 | ->getQuery() | 51 | ->getQuery() |
42 | ->getOneOrNullResult(); | 52 | ->getResult(); |
43 | } | 53 | } |
44 | } | 54 | } |
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php index 7b32354f..89ca31e2 100644 --- a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php | |||
@@ -44,7 +44,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
44 | $form = $crawler->filter('button[id=config_save]')->form(); | 44 | $form = $crawler->filter('button[id=config_save]')->form(); |
45 | 45 | ||
46 | $data = array( | 46 | $data = array( |
47 | 'config[theme]' => 0, | 47 | 'config[theme]' => 'baggy', |
48 | 'config[items_per_page]' => '30', | 48 | 'config[items_per_page]' => '30', |
49 | 'config[language]' => 'en', | 49 | 'config[language]' => 'en', |
50 | ); | 50 | ); |
@@ -63,7 +63,7 @@ class ConfigControllerTest extends WallabagCoreTestCase | |||
63 | { | 63 | { |
64 | return array( | 64 | return array( |
65 | array(array( | 65 | array(array( |
66 | 'config[theme]' => 0, | 66 | 'config[theme]' => 'baggy', |
67 | 'config[items_per_page]' => '', | 67 | 'config[items_per_page]' => '', |
68 | 'config[language]' => 'en', | 68 | 'config[language]' => 'en', |
69 | )), | 69 | )), |
diff --git a/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php b/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php index 1de134b8..cddc8b08 100644 --- a/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Helper/RuleBasedTaggerTest.php | |||
@@ -69,9 +69,7 @@ class RuleBasedTaggerTest extends \PHPUnit_Framework_TestCase | |||
69 | 69 | ||
70 | $tags = $entry->getTags(); | 70 | $tags = $entry->getTags(); |
71 | $this->assertSame('foo', $tags[0]->getLabel()); | 71 | $this->assertSame('foo', $tags[0]->getLabel()); |
72 | $this->assertSame($user, $tags[0]->getUser()); | ||
73 | $this->assertSame('bar', $tags[1]->getLabel()); | 72 | $this->assertSame('bar', $tags[1]->getLabel()); |
74 | $this->assertSame($user, $tags[1]->getUser()); | ||
75 | } | 73 | } |
76 | 74 | ||
77 | public function testTagWithAMixOfMatchingRules() | 75 | public function testTagWithAMixOfMatchingRules() |
@@ -92,7 +90,6 @@ class RuleBasedTaggerTest extends \PHPUnit_Framework_TestCase | |||
92 | 90 | ||
93 | $tags = $entry->getTags(); | 91 | $tags = $entry->getTags(); |
94 | $this->assertSame('foo', $tags[0]->getLabel()); | 92 | $this->assertSame('foo', $tags[0]->getLabel()); |
95 | $this->assertSame($user, $tags[0]->getUser()); | ||
96 | } | 93 | } |
97 | 94 | ||
98 | public function testWhenTheTagExists() | 95 | public function testWhenTheTagExists() |
@@ -100,7 +97,8 @@ class RuleBasedTaggerTest extends \PHPUnit_Framework_TestCase | |||
100 | $taggingRule = $this->getTaggingRule('rule as string', array('foo')); | 97 | $taggingRule = $this->getTaggingRule('rule as string', array('foo')); |
101 | $user = $this->getUser([$taggingRule]); | 98 | $user = $this->getUser([$taggingRule]); |
102 | $entry = new Entry($user); | 99 | $entry = new Entry($user); |
103 | $tag = new Tag($user); | 100 | $tag = new Tag(); |
101 | $tag->setLabel('foo'); | ||
104 | 102 | ||
105 | $this->rulerz | 103 | $this->rulerz |
106 | ->expects($this->once()) | 104 | ->expects($this->once()) |
@@ -110,7 +108,9 @@ class RuleBasedTaggerTest extends \PHPUnit_Framework_TestCase | |||
110 | 108 | ||
111 | $this->tagRepository | 109 | $this->tagRepository |
112 | ->expects($this->once()) | 110 | ->expects($this->once()) |
113 | ->method('findOneByLabelAndUserId') | 111 | // the method `findOneByLabel` doesn't exist, EntityRepository will then call `_call` method |
112 | // to magically call the `findOneBy` with ['label' => 'foo'] | ||
113 | ->method('__call') | ||
114 | ->willReturn($tag); | 114 | ->willReturn($tag); |
115 | 115 | ||
116 | $this->tagger->tag($entry); | 116 | $this->tagger->tag($entry); |
@@ -118,7 +118,7 @@ class RuleBasedTaggerTest extends \PHPUnit_Framework_TestCase | |||
118 | $this->assertFalse($entry->getTags()->isEmpty()); | 118 | $this->assertFalse($entry->getTags()->isEmpty()); |
119 | 119 | ||
120 | $tags = $entry->getTags(); | 120 | $tags = $entry->getTags(); |
121 | $this->assertSame($tag, $tags[0]); | 121 | $this->assertSame($tag->getLabel(), $tags[0]->getLabel()); |
122 | } | 122 | } |
123 | 123 | ||
124 | public function testSameTagWithDifferentfMatchingRules() | 124 | public function testSameTagWithDifferentfMatchingRules() |