diff options
author | Thomas Citharel <tcit@tcit.fr> | 2017-02-24 11:34:36 +0100 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2017-05-30 11:47:39 +0200 |
commit | 61351218f90df455c6edcc530bfc746d60b43a12 (patch) | |
tree | abb1945e9f9c648ac686eb67bb1386eb175f72d3 /src/Wallabag/CoreBundle | |
parent | d181bd728565454ec53d960f321ed0a4c3bf26c8 (diff) | |
download | wallabag-61351218f90df455c6edcc530bfc746d60b43a12.tar.gz wallabag-61351218f90df455c6edcc530bfc746d60b43a12.tar.zst wallabag-61351218f90df455c6edcc530bfc746d60b43a12.zip |
Save changes
PHP CS
Fixed Events on changes
Renamed field
First draft for migration (create table Change)
Added setter for tag in EntryTaggedEvent
Fixed migration for Change table
Added API route for entry history
Removed deletion history
Diffstat (limited to 'src/Wallabag/CoreBundle')
9 files changed, 265 insertions, 5 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index 8d2ac6d4..2a287825 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -9,12 +9,12 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; | |||
9 | use Symfony\Component\HttpFoundation\Request; | 9 | use Symfony\Component\HttpFoundation\Request; |
10 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | 10 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
11 | use Wallabag\CoreBundle\Entity\Entry; | 11 | use Wallabag\CoreBundle\Entity\Entry; |
12 | use Wallabag\CoreBundle\Event\EntryUpdatedEvent; | ||
12 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; | 13 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; |
13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; | 14 | use Wallabag\CoreBundle\Form\Type\EditEntryType; |
14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; | 15 | use Wallabag\CoreBundle\Form\Type\NewEntryType; |
15 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | 16 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; |
16 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | 17 | use Wallabag\CoreBundle\Event\EntrySavedEvent; |
17 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; | ||
18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; | 18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; |
19 | 19 | ||
20 | class EntryController extends Controller | 20 | class EntryController extends Controller |
@@ -391,6 +391,7 @@ class EntryController extends Controller | |||
391 | $em->flush(); | 391 | $em->flush(); |
392 | 392 | ||
393 | // entry saved, dispatch event about it! | 393 | // entry saved, dispatch event about it! |
394 | $this->get('event_dispatcher')->dispatch(EntryUpdatedEvent::NAME, new EntryUpdatedEvent($entry)); | ||
394 | $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); | 395 | $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); |
395 | 396 | ||
396 | return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); | 397 | return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); |
@@ -413,6 +414,8 @@ class EntryController extends Controller | |||
413 | $entry->toggleArchive(); | 414 | $entry->toggleArchive(); |
414 | $this->getDoctrine()->getManager()->flush(); | 415 | $this->getDoctrine()->getManager()->flush(); |
415 | 416 | ||
417 | $this->get('event_dispatcher')->dispatch(EntryUpdatedEvent::NAME, new EntryUpdatedEvent($entry)); | ||
418 | |||
416 | $message = 'flashes.entry.notice.entry_unarchived'; | 419 | $message = 'flashes.entry.notice.entry_unarchived'; |
417 | if ($entry->isArchived()) { | 420 | if ($entry->isArchived()) { |
418 | $message = 'flashes.entry.notice.entry_archived'; | 421 | $message = 'flashes.entry.notice.entry_archived'; |
@@ -445,6 +448,8 @@ class EntryController extends Controller | |||
445 | $entry->toggleStar(); | 448 | $entry->toggleStar(); |
446 | $this->getDoctrine()->getManager()->flush(); | 449 | $this->getDoctrine()->getManager()->flush(); |
447 | 450 | ||
451 | $this->get('event_dispatcher')->dispatch(EntryUpdatedEvent::NAME, new EntryUpdatedEvent($entry)); | ||
452 | |||
448 | $message = 'flashes.entry.notice.entry_unstarred'; | 453 | $message = 'flashes.entry.notice.entry_unstarred'; |
449 | if ($entry->isStarred()) { | 454 | if ($entry->isStarred()) { |
450 | $message = 'flashes.entry.notice.entry_starred'; | 455 | $message = 'flashes.entry.notice.entry_starred'; |
@@ -481,9 +486,6 @@ class EntryController extends Controller | |||
481 | UrlGeneratorInterface::ABSOLUTE_PATH | 486 | UrlGeneratorInterface::ABSOLUTE_PATH |
482 | ); | 487 | ); |
483 | 488 | ||
484 | // entry deleted, dispatch event about it! | ||
485 | $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry)); | ||
486 | |||
487 | $em = $this->getDoctrine()->getManager(); | 489 | $em = $this->getDoctrine()->getManager(); |
488 | $em->remove($entry); | 490 | $em->remove($entry); |
489 | $em->flush(); | 491 | $em->flush(); |
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index fb6a720b..e6d55931 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php | |||
@@ -9,6 +9,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; | |||
9 | use Symfony\Component\HttpFoundation\Request; | 9 | use Symfony\Component\HttpFoundation\Request; |
10 | use Wallabag\CoreBundle\Entity\Entry; | 10 | use Wallabag\CoreBundle\Entity\Entry; |
11 | use Wallabag\CoreBundle\Entity\Tag; | 11 | use Wallabag\CoreBundle\Entity\Tag; |
12 | use Wallabag\CoreBundle\Event\EntryTaggedEvent; | ||
12 | use Wallabag\CoreBundle\Form\Type\NewTagType; | 13 | use Wallabag\CoreBundle\Form\Type\NewTagType; |
13 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | 14 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; |
14 | 15 | ||
@@ -28,7 +29,7 @@ class TagController extends Controller | |||
28 | $form->handleRequest($request); | 29 | $form->handleRequest($request); |
29 | 30 | ||
30 | if ($form->isSubmitted() && $form->isValid()) { | 31 | if ($form->isSubmitted() && $form->isValid()) { |
31 | $this->get('wallabag_core.tags_assigner')->assignTagsToEntry( | 32 | $tags = $this->get('wallabag_core.tags_assigner')->assignTagsToEntry( |
32 | $entry, | 33 | $entry, |
33 | $form->get('label')->getData() | 34 | $form->get('label')->getData() |
34 | ); | 35 | ); |
@@ -37,6 +38,8 @@ class TagController extends Controller | |||
37 | $em->persist($entry); | 38 | $em->persist($entry); |
38 | $em->flush(); | 39 | $em->flush(); |
39 | 40 | ||
41 | $this->get('event_dispatcher')->dispatch(EntryTaggedEvent::NAME, new EntryTaggedEvent($entry, $tags)); | ||
42 | |||
40 | $this->get('session')->getFlashBag()->add( | 43 | $this->get('session')->getFlashBag()->add( |
41 | 'notice', | 44 | 'notice', |
42 | 'flashes.tag.notice.tag_added' | 45 | 'flashes.tag.notice.tag_added' |
@@ -64,6 +67,8 @@ class TagController extends Controller | |||
64 | $em = $this->getDoctrine()->getManager(); | 67 | $em = $this->getDoctrine()->getManager(); |
65 | $em->flush(); | 68 | $em->flush(); |
66 | 69 | ||
70 | $this->get('event_dispatcher')->dispatch(EntryTaggedEvent::NAME, new EntryTaggedEvent($entry, $tag)); | ||
71 | |||
67 | // remove orphan tag in case no entries are associated to it | 72 | // remove orphan tag in case no entries are associated to it |
68 | if (count($tag->getEntries()) === 0) { | 73 | if (count($tag->getEntries()) === 0) { |
69 | $em->remove($tag); | 74 | $em->remove($tag); |
diff --git a/src/Wallabag/CoreBundle/Entity/Change.php b/src/Wallabag/CoreBundle/Entity/Change.php new file mode 100644 index 00000000..203a2d31 --- /dev/null +++ b/src/Wallabag/CoreBundle/Entity/Change.php | |||
@@ -0,0 +1,86 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Entity; | ||
4 | |||
5 | use Doctrine\ORM\Mapping as ORM; | ||
6 | |||
7 | /** | ||
8 | * Change. | ||
9 | * | ||
10 | * This entity stores a datetime for each event (updated or tagged) done on an entry. | ||
11 | * | ||
12 | * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\ChangeRepository") | ||
13 | * @ORM\Table(name="`change`") | ||
14 | */ | ||
15 | class Change | ||
16 | { | ||
17 | const MODIFIED_TYPE = 1; | ||
18 | const CHANGED_TAG_TYPE = 2; | ||
19 | |||
20 | /** | ||
21 | * @var int | ||
22 | * | ||
23 | * @ORM\Column(type="integer") | ||
24 | * @ORM\Id | ||
25 | * @ORM\GeneratedValue(strategy="AUTO") | ||
26 | */ | ||
27 | private $id; | ||
28 | |||
29 | /** | ||
30 | * @var int | ||
31 | * | ||
32 | * @ORM\Column(type="integer") | ||
33 | */ | ||
34 | private $type; | ||
35 | |||
36 | /** | ||
37 | * @ORM\ManyToOne(targetEntity="Wallabag\CoreBundle\Entity\Entry", inversedBy="changes") | ||
38 | */ | ||
39 | private $entry; | ||
40 | |||
41 | /** | ||
42 | * @var \DateTime | ||
43 | * | ||
44 | * @ORM\Column(name="created_at", type="datetime") | ||
45 | */ | ||
46 | private $createdAt; | ||
47 | |||
48 | public function __construct($type, Entry $entry) | ||
49 | { | ||
50 | $this->type = $type; | ||
51 | $this->entry = $entry; | ||
52 | $this->createdAt = new \DateTime(); | ||
53 | } | ||
54 | |||
55 | /** | ||
56 | * @return int | ||
57 | */ | ||
58 | public function getId() | ||
59 | { | ||
60 | return $this->id; | ||
61 | } | ||
62 | |||
63 | /** | ||
64 | * @return int | ||
65 | */ | ||
66 | public function getType() | ||
67 | { | ||
68 | return $this->type; | ||
69 | } | ||
70 | |||
71 | /** | ||
72 | * @return DateTime | ||
73 | */ | ||
74 | public function getCreatedAt() | ||
75 | { | ||
76 | return $this->createdAt; | ||
77 | } | ||
78 | |||
79 | /** | ||
80 | * @return Entry | ||
81 | */ | ||
82 | public function getEntry() | ||
83 | { | ||
84 | return $this->entry; | ||
85 | } | ||
86 | } | ||
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 08a67c34..a24409b9 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php | |||
@@ -233,6 +233,11 @@ class Entry | |||
233 | */ | 233 | */ |
234 | private $tags; | 234 | private $tags; |
235 | 235 | ||
236 | /** | ||
237 | * @ORM\OneToMany(targetEntity="Wallabag\CoreBundle\Entity\Change", mappedBy="entry", cascade={"remove"}) | ||
238 | */ | ||
239 | private $changes; | ||
240 | |||
236 | /* | 241 | /* |
237 | * @param User $user | 242 | * @param User $user |
238 | */ | 243 | */ |
@@ -240,6 +245,7 @@ class Entry | |||
240 | { | 245 | { |
241 | $this->user = $user; | 246 | $this->user = $user; |
242 | $this->tags = new ArrayCollection(); | 247 | $this->tags = new ArrayCollection(); |
248 | $this->changes = new ArrayCollection(); | ||
243 | } | 249 | } |
244 | 250 | ||
245 | /** | 251 | /** |
diff --git a/src/Wallabag/CoreBundle/Event/EntryTaggedEvent.php b/src/Wallabag/CoreBundle/Event/EntryTaggedEvent.php new file mode 100644 index 00000000..88856fb1 --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/EntryTaggedEvent.php | |||
@@ -0,0 +1,42 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event; | ||
4 | |||
5 | use Symfony\Component\EventDispatcher\Event; | ||
6 | use Wallabag\CoreBundle\Entity\Entry; | ||
7 | use Wallabag\CoreBundle\Entity\Tag; | ||
8 | |||
9 | /** | ||
10 | * This event is fired as soon as a tag is added on an entry. | ||
11 | */ | ||
12 | class EntryTaggedEvent extends Event | ||
13 | { | ||
14 | const NAME = 'entry.tagged'; | ||
15 | |||
16 | /** @var Entry */ | ||
17 | protected $entry; | ||
18 | |||
19 | /** @var Tag[] */ | ||
20 | protected $tags; | ||
21 | |||
22 | public function __construct(Entry $entry, $tags) | ||
23 | { | ||
24 | $this->entry = $entry; | ||
25 | |||
26 | if (false === is_array($tags)) { | ||
27 | $tags = [$tags]; | ||
28 | } | ||
29 | |||
30 | $this->tags = $tags; | ||
31 | } | ||
32 | |||
33 | public function getEntry() | ||
34 | { | ||
35 | return $this->entry; | ||
36 | } | ||
37 | |||
38 | public function getTags() | ||
39 | { | ||
40 | return $this->tags; | ||
41 | } | ||
42 | } | ||
diff --git a/src/Wallabag/CoreBundle/Event/EntryUpdatedEvent.php b/src/Wallabag/CoreBundle/Event/EntryUpdatedEvent.php new file mode 100644 index 00000000..7282835e --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/EntryUpdatedEvent.php | |||
@@ -0,0 +1,26 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event; | ||
4 | |||
5 | use Symfony\Component\EventDispatcher\Event; | ||
6 | use Wallabag\CoreBundle\Entity\Entry; | ||
7 | |||
8 | /** | ||
9 | * This event is fired as soon as an entry was updated. | ||
10 | */ | ||
11 | class EntryUpdatedEvent extends Event | ||
12 | { | ||
13 | const NAME = 'entry.updated'; | ||
14 | |||
15 | protected $entry; | ||
16 | |||
17 | public function __construct(Entry $entry) | ||
18 | { | ||
19 | $this->entry = $entry; | ||
20 | } | ||
21 | |||
22 | public function getEntry() | ||
23 | { | ||
24 | return $this->entry; | ||
25 | } | ||
26 | } | ||
diff --git a/src/Wallabag/CoreBundle/Event/Subscriber/ChangesSubscriber.php b/src/Wallabag/CoreBundle/Event/Subscriber/ChangesSubscriber.php new file mode 100644 index 00000000..1ba18a4f --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/Subscriber/ChangesSubscriber.php | |||
@@ -0,0 +1,59 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event\Subscriber; | ||
4 | |||
5 | use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
6 | use Doctrine\ORM\EntityManager; | ||
7 | use Psr\Log\LoggerInterface; | ||
8 | use Wallabag\CoreBundle\Entity\Change; | ||
9 | use Wallabag\CoreBundle\Event\EntryTaggedEvent; | ||
10 | use Wallabag\CoreBundle\Event\EntryUpdatedEvent; | ||
11 | |||
12 | class ChangesSubscriber implements EventSubscriberInterface | ||
13 | { | ||
14 | /** @var LoggerInterface $logger */ | ||
15 | private $logger; | ||
16 | |||
17 | /** @var EntityManager $em */ | ||
18 | private $em; | ||
19 | |||
20 | public function __construct(EntityManager $em, LoggerInterface $logger) | ||
21 | { | ||
22 | $this->logger = $logger; | ||
23 | $this->em = $em; | ||
24 | } | ||
25 | |||
26 | public static function getSubscribedEvents() | ||
27 | { | ||
28 | return [ | ||
29 | EntryUpdatedEvent::NAME => 'onEntryUpdated', | ||
30 | EntryTaggedEvent::NAME => 'onEntryTagged', | ||
31 | ]; | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * @param EntryUpdatedEvent $event | ||
36 | */ | ||
37 | public function onEntryUpdated(EntryUpdatedEvent $event) | ||
38 | { | ||
39 | $change = new Change(Change::MODIFIED_TYPE, $event->getEntry()); | ||
40 | |||
41 | $this->em->persist($change); | ||
42 | $this->em->flush(); | ||
43 | |||
44 | $this->logger->debug('saved updated entry '.$event->getEntry()->getId().' event '); | ||
45 | } | ||
46 | |||
47 | /** | ||
48 | * @param EntryTaggedEvent $event | ||
49 | */ | ||
50 | public function onEntryTagged(EntryTaggedEvent $event) | ||
51 | { | ||
52 | $change = new Change(Change::CHANGED_TAG_TYPE, $event->getEntry()); | ||
53 | |||
54 | $this->em->persist($change); | ||
55 | $this->em->flush(); | ||
56 | |||
57 | $this->logger->debug('saved (un)tagged entry '.$event->getEntry()->getId().' event '); | ||
58 | } | ||
59 | } | ||
diff --git a/src/Wallabag/CoreBundle/Repository/ChangeRepository.php b/src/Wallabag/CoreBundle/Repository/ChangeRepository.php new file mode 100644 index 00000000..18d015a7 --- /dev/null +++ b/src/Wallabag/CoreBundle/Repository/ChangeRepository.php | |||
@@ -0,0 +1,26 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Repository; | ||
4 | |||
5 | use Doctrine\ORM\EntityRepository; | ||
6 | |||
7 | class ChangeRepository extends EntityRepository | ||
8 | { | ||
9 | /** | ||
10 | * Used only in test case to get a tag for our entry. | ||
11 | * | ||
12 | * @param int $timestamp | ||
13 | * | ||
14 | * @return Tag | ||
15 | */ | ||
16 | public function findChangesSinceDate($timestamp) | ||
17 | { | ||
18 | $date = new \DateTime(); | ||
19 | $date->setTimestamp($timestamp); | ||
20 | |||
21 | return $this->createQueryBuilder('c') | ||
22 | ->where('c.createdAt >= :timestamp')->setParameter('timestamp', $date) | ||
23 | ->getQuery() | ||
24 | ->getResult(); | ||
25 | } | ||
26 | } | ||
diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml index a68b2fdc..0def87f3 100644 --- a/src/Wallabag/CoreBundle/Resources/config/services.yml +++ b/src/Wallabag/CoreBundle/Resources/config/services.yml | |||
@@ -199,3 +199,11 @@ services: | |||
199 | 199 | ||
200 | wallabag_core.entry.download_images.client: | 200 | wallabag_core.entry.download_images.client: |
201 | class: GuzzleHttp\Client | 201 | class: GuzzleHttp\Client |
202 | |||
203 | wallabag_core.subscriber.changes: | ||
204 | class: Wallabag\CoreBundle\Event\Subscriber\ChangesSubscriber | ||
205 | arguments: | ||
206 | - "@doctrine.orm.default_entity_manager" | ||
207 | - "@logger" | ||
208 | tags: | ||
209 | - { name: kernel.event_subscriber } | ||