On Wed, Mar 8, 2017 at 11:55 AM, Guillaume Delhumeau
<guillaume.delhum...@xwiki.com> wrote:
> Hello everybody.
>
> *TL;DR:* Notifications are nothing but standard Events from the Observation
> Manager, marked as "Storable" and stored by
> the Event Stream. They can be displayed in the top bar of the wiki and/or
> sent by e-mails periodically. Since this is
> overlapping with the Watchlist features, the idea in the future is to
> re-implement the watchlist using the notification
> mechanism and to push the current Watchlist module to contrib. Need your
> agreement to go in that way.
>
>
> *Background:*
>
> A few weeks ago I've sent a proposal about the Notifications feature. I've
> made some work since, and talked with Vincent
> to define a vision.
>
> Let me introduce you what I've already done and what I'm going to do in the
> following days:
>
> * I am going to introduce 2 interfaces: *StorableEvent* and
> *TargetableEvent* (currently I have only implemented a
>   *NotificationEvent* that represent both).
>
> * *StorableEvent*: when an event from the Observation Manager implements
> this interface, it means this event will be
>                  logged (stored) by the Event Stream.
>
> * *TargetableEvent*: introduce a list of "targets", which are the IDs of
> the entities who are targeted by this event.
>                    Example: when someones replies to your forum topic, an
> event called "someone has answered to your
>                    topic" is sent with the topic creator as target.
>
> * As I said, storable events are stored by the Event Stream, which is
> currently implemented by the Activity Stream
>   module. So it means a *StorableEvent* is currently stored as an
> *ActivityEvent* but this remains technical and not visible
>   from the outside.
>
> * I have introduced the role *StorableEventConverter* which convert a
> *StorableEvent* to an Event from the Event Stream.
>   Each application can provide its own converter (to store additional
> parameters for example) but there a default one
>   that is used if nothing else is defined.
>   See:
> https://github.com/xwiki/xwiki-platform/blob/e5a3cc7b6a5cbe82b1668d9d30fbf6a61b026046/xwiki-platform-core/xwiki-platform-eventstream/src/main/java/org/xwiki/eventstream/NotificationConverter.java#L36-L36
>
> * I have added the "target" field (a list of string) to the Event and the
> *ActivityEvent* classes. I have also updated the
>   hibernate mapping for *ActivityEventImpl* accordingly.
>   See:
> https://github.com/xwiki/xwiki-platform/blob/81172b2dfd994ddd727efe93daf8fa446dc4abce/xwiki-platform-core/xwiki-platform-activitystream/xwiki-platform-activitystream-api/src/main/resources/activitystream.hbm.xml#L63-L63
>
> * I have introduced an *EventStatus* class (and *ActivityStatusImpl*) to
> store in the wiki which notifications has been seen
>   by a specified user. This is important because we want to distinguish new
> notifications from those the user have
>   marked as read. Hibernate mapping has been updated as well in the
> Activity Stream module.
>   See:
> https://github.com/xwiki/xwiki-platform/blob/e5a3cc7b6a5cbe82b1668d9d30fbf6a61b026046/xwiki-platform-core/xwiki-platform-eventstream/src/main/java/org/xwiki/eventstream/EventStatus.java#L25-L25
>   See:
> https://github.com/xwiki/xwiki-platform/blob/81172b2dfd994ddd727efe93daf8fa446dc4abce/xwiki-platform-core/xwiki-platform-activitystream/xwiki-platform-activitystream-api/src/main/resources/activitystream.hbm.xml#L69-L69
>
> * I am going to introduce the *StorableEventDescriptor* role. The
> components will give some meta-information about a
>   storable event: the pretty name of the event, the application that can
> send it and a short text giving a description
>   about the event. We need this to expose to the user the list of events
> that she can subscribe to.
>   (Right now I have implemented this as XObjects called "*NotificationType*"
> which is an error)
>
> * I have introduced the concept of NotificationPreference. It's an XObject
> stored in the user profile. When a user wants
>   to subscribe to a particular type of event, this xobject is created with
> the id of the event and the media used for
>   the notification ('web notification', 'email' or both).
>
>   In the future, this preferences should handle some more precise filters.
> Like: "I am interested in the notifcations
>   sent by the Forum Application but only when it comes from the wiki A and
> not the wiki B."
>
> * I have introduced the role *NotificationDisplayer*. It's a component that
> generates the XDOM to display in the
>   notifications menu. Each application can implement its own displayer, but
> failback to a default one.
>
> * The *DefaultNotificationDisplayer* tries to render the template
> 'notifications/{eventType}.vm' and failback to
>   'notifications/default.vm'. It means you can create your own displayer
> either by implementing a custom
>   *NotificationDisplayer* or by creating a template in the right location.
>
> * The *NotificationManager* is responsible for getting the notifications
> for the current user, according to its
>   preferences.
>
> * I have implemented a UI which load the notification asynchronously and
> display them in the notification menu, just
>   below the watchlist options.
>   See:
> http://jira.xwiki.org/secure/attachment/33586/WIP-NotificationsMenu.png
>
> * Unread notifications are displayed with a different styling that others.
>
> * The user has the ability to mark a notification as read.
>
> * I have implemented a preferences page in the user profile, which list all
> *StorableEventDescriptor*.
>   See:
> http://jira.xwiki.org/secure/attachment/33587/WIP-NotificationsPreferences.png
>
> * As a proof of concept, I am going to make the Blog Application send some
> custom events that will be displayed in the
>   notifications menu.
>
> Problems:
>
> * We clearly have some overlapping of concerns with the Watchlist. The UI
> is even very bad since the Watchlist options
>   are displayed in the same "bell" menu than the notifications without
> being connected together. It's confusing.
>
> * That is why we propose, with Vincent, to remove the Watchlist as it is,
> and re-implement its feature using the
>   notifications abilities.
>
> * The email sending is not implemented yet, and will not for the 9.2
> release.
>
> * We don't have a filter to not display similar notifications. For example,
> a user saving a document 10 times in 10
>   minutes will generate 10 notifications. Possible flooding.
>
> * When a user registers, all the notifications that are stored since the
> beginning of the wiki are unread by her. It
>   does not make sense to tell her "you have 1 000 000 000 unread
> notifications" so we need to store a starting date for
>   each user.

You already have a starting date in each profile, the profile page
creation date.

>
> Do you see any problem with that vision?
>
> Thanks you,
>
> --
> Guillaume Delhumeau (guillaume.delhum...@xwiki.com)
> Research & Development Engineer at XWiki SAS
> Committer on the XWiki.org project



-- 
Thomas Mortagne

Reply via email to