3 namespace Wallabag\CoreBundle\Event\Activity
;
5 use Doctrine\ORM\EntityManager
;
6 use FOS\UserBundle\Event\UserEvent
;
7 use FOS\UserBundle\FOSUserEvents
;
8 use Psr\Log\LoggerInterface
;
9 use Symfony\Component\EventDispatcher\Event
;
10 use Symfony\Component\EventDispatcher\EventSubscriberInterface
;
11 use Wallabag\CoreBundle\Entity\Activity
;
12 use Wallabag\CoreBundle\Event\Activity\Actions\Annotation\AnnotationCreatedEvent
;
13 use Wallabag\CoreBundle\Event\Activity\Actions\Annotation\AnnotationDeletedEvent
;
14 use Wallabag\CoreBundle\Event\Activity\Actions\Annotation\AnnotationEditedEvent
;
15 use Wallabag\CoreBundle\Event\Activity\Actions\Annotation\AnnotationEvent
;
16 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntryDeletedEvent
;
17 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntryEditedEvent
;
18 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntryEvent
;
19 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntryFavouriteEvent
;
20 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntryReadEvent
;
21 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntrySavedEvent
;
22 use Wallabag\CoreBundle\Event\Activity\Actions\Entry\EntryTaggedEvent
;
23 use Wallabag\CoreBundle\Event\Activity\Actions\Federation\FollowEvent
;
24 use Wallabag\CoreBundle\Event\Activity\Actions\Federation\RecommendedEntryEvent
;
25 use Wallabag\CoreBundle\Event\Activity\Actions\Federation\UnfollowEvent
;
26 use Wallabag\CoreBundle\Event\Activity\Actions\Share\ShareAcceptedEvent
;
27 use Wallabag\CoreBundle\Event\Activity\Actions\Share\ShareCancelledEvent
;
28 use Wallabag\CoreBundle\Event\Activity\Actions\Share\ShareCreatedEvent
;
29 use Wallabag\CoreBundle\Event\Activity\Actions\Share\ShareDeniedEvent
;
30 use Wallabag\CoreBundle\Event\Activity\Actions\Share\ShareEvent
;
31 use Wallabag\CoreBundle\Event\Activity\Actions\User\UserDeletedEvent
;
32 use Wallabag\CoreBundle\Event\Activity\Actions\User\UserEditedEvent
;
33 use Wallabag\CoreBundle\Notifications\ActionInterface
;
36 * This listener will create the associated configuration when a user register.
37 * This configuration will be created right after the registration (no matter if it needs an email validation).
39 class ActivitySubscriber
implements EventSubscriberInterface
48 * @var LoggerInterface $logger
52 public function __construct(EntityManager
$em, LoggerInterface
$logger)
55 $this->logger
= $logger;
58 public static function getSubscribedEvents()
61 EntrySavedEvent
::NAME
=> 'entryActivity',
62 EntryDeletedEvent
::NAME
=> 'entryActivity',
63 EntryEditedEvent
::NAME
=> 'entryActivity',
64 EntryTaggedEvent
::NAME
=> 'taggedEntry',
65 EntryFavouriteEvent
::NAME
=> 'entryActivity',
66 EntryReadEvent
::NAME
=> 'entryActivity',
68 AnnotationCreatedEvent
::NAME
=> 'annotationActivity',
69 AnnotationEditedEvent
::NAME
=> 'annotationActivity',
70 AnnotationDeletedEvent
::NAME
=> 'annotationActivity',
72 FollowEvent
::NAME
=> 'followedAccount',
73 UnfollowEvent
::NAME
=> 'unfollowedAccount',
74 RecommendedEntryEvent
::NAME
=> 'recommendedEntry',
76 ShareCreatedEvent
::NAME
=> 'shareActivity',
77 ShareAcceptedEvent
::NAME
=> 'shareActivity',
78 ShareDeniedEvent
::NAME
=> 'shareActivity',
79 ShareCancelledEvent
::NAME
=> 'shareActivity',
81 // when a user register using the normal form
82 FOSUserEvents
::REGISTRATION_COMPLETED
=> 'userActivity',
83 // when we manually create a user using the command line
84 // OR when we create it from the config UI
85 FOSUserEvents
::USER_CREATED
=> 'userActivity',
86 UserEditedEvent
::NAME
=> 'userActivity',
87 UserDeletedEvent
::NAME
=> 'userActivity',
91 public function userActivity(Event
$event)
94 if ($event instanceof UserEvent
) {
95 $activityType = Activity
::USER_CREATE
;
96 } elseif ($event instanceof UserEditedEvent
) {
97 $activityType = Activity
::USER_EDIT
;
98 } elseif ($event instanceof UserDeletedEvent
) {
99 $activityType = Activity
::USER_REMOVE
;
102 $user = $event->getUser();
103 $activity = new Activity($activityType, Activity
::USER_OBJECT
, $user->getId());
104 $activity->setUser($user->getAccount());
105 $this->em
->persist($activity);
109 public function entryActivity(EntryEvent
$event)
111 $entry = $event->getEntry();
114 if ($event instanceof EntrySavedEvent
) {
115 $activityType = Activity
::ENTRY_ADD
;
116 } elseif ($event instanceof EntryDeletedEvent
) {
117 $activityType = Activity
::ENTRY_DELETE
;
118 } elseif ($event instanceof EntryEditedEvent
) {
119 $activityType = Activity
::ENTRY_EDIT
;
120 } elseif ($event instanceof EntryFavouriteEvent
) {
121 if ($entry->isStarred()) {
122 $activityType = Activity
::ENTRY_FAVOURITE
;
124 $activityType = Activity
::ENTRY_UNFAVOURITE
;
126 } elseif ($event instanceof EntryReadEvent
) {
127 if ($entry->isArchived()) {
128 $activityType = Activity
::ENTRY_READ
;
130 $activityType = Activity
::ENTRY_UNREAD
;
134 $activity = new Activity($activityType, Activity
::ENTRY_OBJECT
, $entry->getId());
135 $activity->setUser($entry->getUser()->getAccount());
136 $this->em
->persist($activity);
140 public function taggedEntry(EntryTaggedEvent
$event)
142 $entry = $event->getEntry();
143 $activity = new Activity($event->isRemove() ? Activity
::ENTRY_REMOVE_TAG
: Activity
::ENTRY_ADD_TAG
, Activity
::ENTRY_OBJECT
, $entry->getId());
144 $activity->setUser($entry->getUser()->getAccount());
145 $activity->setSecondaryObjectType(Activity
::TAG_OBJECT
)
146 ->setSecondaryObjectId($event->getTags()[0]->getId());
147 $this->em
->persist($activity);
151 public function annotationActivity(AnnotationEvent
$event)
153 $annotation = $event->getAnnotation();
156 if ($event instanceof AnnotationCreatedEvent
) {
157 $activityType = Activity
::ANNOTATION_ADD
;
158 } elseif ($event instanceof AnnotationEditedEvent
) {
159 $activityType = Activity
::ANNOTATION_EDIT
;
160 } elseif ($event instanceof AnnotationDeletedEvent
) {
161 $activityType = Activity
::ANNOTATION_REMOVE
;
164 $activity = new Activity($activityType, Activity
::ANNOTATION_OBJECT
, $annotation->getId());
165 $activity->setUser($annotation->getUser()->getAccount());
166 $this->em
->persist($activity);
170 public function followedAccount(FollowEvent
$event)
172 $activity = new Activity(Activity
::FOLLOW_ACCOUNT
, Activity
::ACCOUNT_OBJECT
, $event->getAccount()->getId());
173 $activity->setUser($event->getAccount());
174 $activity->setSecondaryObjectType(Activity
::ACCOUNT_OBJECT
)
175 ->setSecondaryObjectId($event->getFollower()->getId());
176 $this->em
->persist($activity);
180 public function unfollowedAccount(UnfollowEvent
$event)
182 $activity = new Activity(Activity
::UNFOLLOW_ACCOUNT
, Activity
::ACCOUNT_OBJECT
, $event->getAccount()->getId());
183 $activity->setUser($event->getAccount());
184 $activity->setSecondaryObjectType(Activity
::ACCOUNT_OBJECT
)
185 ->setSecondaryObjectId($event->getFollower()->getId());
186 $this->em
->persist($activity);
190 public function recommendedEntry(RecommendedEntryEvent
$event)
192 $entry = $event->getEntry();
193 $account = $entry->getUser()->getAccount();
194 $activity = new Activity(Activity
::RECOMMEND_ENTRY
, Activity
::ACCOUNT_OBJECT
, $account->getId());
195 $activity->setUser($account);
196 $activity->setSecondaryObjectType(Activity
::ENTRY_OBJECT
)
197 ->setSecondaryObjectId($entry->getId());
198 $this->em
->persist($activity);
202 public function shareActivity(ShareEvent
$event)
204 $share = $event->getShare();
207 if ($event instanceof ShareCreatedEvent
) {
208 $activityType = Activity
::USER_SHARE_CREATED
;
209 } elseif ($event instanceof ShareAcceptedEvent
) {
210 $activityType = Activity
::USER_SHARE_ACCEPTED
;
211 } elseif ($event instanceof ShareDeniedEvent
) {
212 $activityType = Activity
::USER_SHARE_REFUSED
;
213 } elseif ($event instanceof ShareCancelledEvent
) {
214 $activityType = Activity
::USER_SHARE_CANCELLED
;
217 $activity = new Activity($activityType, Activity
::SHARE_OBJECT
, $share->getId());
218 $activity->setUser($share->getUserOrigin());
219 $activity->setSecondaryObjectType(Activity
::ACCOUNT_OBJECT
)
220 ->setSecondaryObjectId($share->getUserDestination()->getId());
221 $this->em
->persist($activity);