Introduction
The Notifications module aims to register all the application events a user might be interested. At a database level, those events are stored in the notifications
collection. On the frontend, they are displayed in the /notifications
page, accessible through the bell icon near the user badge.
Until now, we are registering three kind of events: - When a user replies to somebody else's comment - When a user upvotes somebody else's comment - When a user downvotes somebody else's comment
The model
In lib/models/notification.js
is declared the NotificationSchema
that defines the Notification
Mongoose model. It has the following properties:
- user
: ObjectId
that refers to the User
whose notification is targeted. In the case of a reply, its the user who wrote the replied comment.
- type
: enum
that represents what kind of notification is.
- comment
: ObjectId
that points to a Comment
.
- relatedUser
: ObjectId
that refers to the User
that triggered the notification. In the case of a reply, its the replier.
- topic
: ObjectId
that refers to a related Topic
.
There is a virtual method, url
, that returns the URL of the target object (in this case, the topic that holds the replied/upvoted/downvoted comment).
API endpoints
Notifications are created and pushed to the database via an internal API. They cannot be created through the public API, but they can be queried.
The public API is located in lib/notification-api/index.js
and has only one endpoint: GET /api/notification/all
, that delivers all the notifications for the logged in user (the app forbids to retrieve notifications of other user).
Pushing a new notification
Internally, the notifications are pushed to the notifications
collection through the lib/notifications/index.js
module, by calling the send
function. That function overrides the NotifierClient#send()
function, that internally calls two asynchronous functions: one pushes the notification document and the other one calls notifier
to send a notification e-mail.
Notification page
The notifications page is accessible by browsing to /notifications
or clicking in the bell icon next to the user badge. The page lifecycle is handled in the lib/notifications-page
module.
What about notifier
?
The notifications module does not replace the notifier
module. They work together and its responsibilities are different: notifications
responsibility is to push a notification document into the notifications
collection on the database. notifier
's responsibility is to send an e-mail using the configured transport.
Roadmap
We are heading to change notifier
behavior by making it poll the notification
collection in order to find unread notifications and build and send a digest e-mail notifying all together the pending events of a user.
Also, we are continuously improving the notifications
module to make it more usable.