The 'notif-engine' is an 'npm module' to store notifications before sending them in the supported data stores and then send them through supported providers; nevertheless, it updates the status of sending the notifications in your data store.
-
Easy notification storage (multiple channel support) — Store
email|pushbefore sending them. Currently supports MongoDB as the data store. -
Easy notification sending — Send
email|pushthrough supported providers and update the status in your data store. Currently supports Amazon Simple Email Service for emails and OneSignal for push notifications. -
Multi lingual template support — Define templates in multiple languages and use them.
-
MIT license — Use it like you want.
$ npm i @coffeebeanslabs/notif-engine$ yarn add @coffeebeanslabs/notif-engineconst notifEngine = require('@coffeebeanslabs/notif-engine');
await notifEngine.createNotificationTransaction({
mongo: {
MONGOURL: '<your_mongourl_or_mongoclusterurls>',
DATABASE_NAME: '<same-as-dynamic.mail.database_name-in-consumer/configurations/configuration.json>',
SCHEMA_NAME: '<same-as-dynamic.mail.schema_name-in-consumer/configurations/configuration.json>',
},
data: {
server: '<your_operating_server_type_localhost/staging/production'>,
type: 'mail',
provider: 'amazonses',
trigger_event: 'create',
notification_template_slug: 'welcome',
user_id: ['your_user_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],
user_email: ['your_user_email_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],
data: [{
user_id: 'each_values_in_data.user_id_will_have_one_object_each_in_data.data',
user_email: 'each_values_in_data.user_email_will_have_one_object_each_in_data.data',
user_name: 'your_user\'s_name',
user_language: 'your_user\'s_language_must_be_one_of_defined_inside_the_respective_template_in_template_schema',
brand_name: '<your_brand_name>',
verification_link: '<your_verification_link>',
brand_url: '<your_brand_url_link>',
brand_url_without_protocol: '<your_brand_url_link_without_protocol>',
attachments: ['your_file_paths_as_array_of_strings_compatible_with_nodemailer'],
include_player_ids: ['your_onesignal_player_ids_targeted_in_the_notification']
}],
status: -1,
db_created_at: <timestamp>,
db_updated_at: <timestamp>
}
});const notifEngine = require('@coffeebeanslabs/notif-engine');
await notifEngine.createNotificationTransaction({
mongo: {
MONGOURL: '<your_mongourl_or_mongoclusterurls>',
DATABASE_NAME: '<same-as-dynamic.push.database_name-in-consumer/configurations/configuration.json>',
SCHEMA_NAME: '<same-as-dynamic.push.schema_name-in-consumer/configurations/configuration.json>',
},
data: {
server: '<your_operating_server_type_localhost/staging/production'>,
type: 'push',
provider: 'onesignal',
trigger_event: 'create',
notification_template_slug: 'welcome',
user_id: ['your_user_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],
user_email: ['your_user_email_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],
data: [{
user_id: 'each_values_in_data.user_id_will_have_one_object_each_in_data.data',
user_email: 'each_values_in_data.user_email_will_have_one_object_each_in_data.data',
user_name: 'your_user\'s_name',
user_language: 'your_user\'s_language_must_be_one_of_defined_inside_the_respective_template_in_template_schema',
brand_name: '<your_brand_name>',
verification_link: '<your_verification_link>',
brand_url: '<your_brand_url_link>',
brand_url_without_protocol: '<your_brand_url_link_without_protocol>',
attachments: ['your_file_paths_as_array_of_strings_compatible_with_nodemailer'],
include_player_ids: ['your_onesignal_player_ids_targeted_in_the_notification']
}],
status: -1,
db_created_at: <timestamp>,
db_updated_at: <timestamp>
}
});$ git@github.com:CoffeeBeansLabs/notif-engine.git && cd notif-engine && npm installor
$ https://github.com/CoffeeBeansLabs/notif-engine.git && cd notif-engine && npm install- Create a new file at
consumer/configurations/configuration.jsonmanually or by copy pasting and editing the contents ofconsumer/configurations/configuration.template.json - Be sure to at least update the
<database_name_here>,<schema_name_here>and'Full Name' <email@address.com>in the file - You are now ready to turn on the consumer process
- The
batch_sizeis for the quantum of messages being read in a single read for sending - The
max_retriesis for the number of attempts being done while sending, if the sending fails - As a rule of thumb, for all schemas the meaning of the statuses is as below :
-2=SENDING_FAILED-1=NOT_PROCESSED// The default which has to be set for produced notifications to get created and then sent0=PROCESSING1=SENDING_SUCCEEDED
- As a rule of thumb, for all schemas the meaning of the enabled_flags is as below :
1=ENABLED0=DISABLED
SESHOST="<amazonses_host>" SESPORT=<amazonses_port> SESISSECURE=<amazonses_is_secure_flag_integer_0_or_1> SESUSER="<amazonses_user>" SESPASS="<amazonses_password>" OSAPPID="<onesignal_appid>" OSAPIKEY="<onesignal_apikey>" MONGOURL="<your_mongourl_or_mongoclusterurls>" node consumer/app.js
- Templates form the base content layout for all the channels and are prerequisite for the
notif-engineto work - Transactions are produced from your code into the
notif-engineto have enough data to produce the actual notifications for respective channels, this is called the producer code notif-engineruns and creates respective channel notifications (email|push) in their specified schemas, this is called the consumer code- For producer, the configuration is passed as parameters to the function calls
- For consumer, the
consumer/configurations/configuration.jsonis the base for the configuration and the consumer process works on this. This file is to be created manually before turning on the consumer process and a template is available for the same atconsumer/configurations/configuration.template.json
- The templates provide a mechanism to configure a base for each supported channel which will be string replaced by the data in transactions to generate the actual data that will be stored in the respective collections of that respective channel and this actual data stored will be used to send the notification via the configured service provider
- Reference for designing email templates
- Reference for designing html inside the email templates
- Reference for designing push templates for onesignal
- HTML output for the
enemail template below
- Push output for the
enpush template below
- Setting up test data for templates manually
<schema_name_here>is the collection which stores templates data and has to be configured inconsumer/configurations/configuration.json base.template.schema_namefor using the moduleslugidentifier for the template, as database primary keys/id keys may change but this will always be consistent for retrievalnamehuman readable string for describing the templateinapp_templateinapp notification template for the template in considerationemail_templateemail notification template for the template in considerationemail_template.provideremail notification provideremail_template.subjectemail notification subject which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)email_template.htmlemail notification html/content which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)email_template.attachmentsemail notification attachments as supported by nodemailerpush_templatepush notification template for the template in considerationpush_template.providerpush notification providerpush_template.headingspush notification heading which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)push_template.subtitlepush notification subtitle which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)push_template.contentspush notification contents which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)push_template.urlpush notification hyperlink to open (external url or internal deep links to the app)push_template.android_accent_colorpush notification accent color for android devicespush_template.huawei_accent_colorpush notification accent color for huawei devicespush_template.android_led_colorpush notification led color for android devicespush_template.huawei_led_colorpush notification led color for huawei devicessms_templatesms notification template for the template in considerationis_enabledswitch for turning on/off the usage of template in consideration
db.getCollection('<schema_name_here>').insertOne({
"slug" : "welcome",
"name" : "welcome mail with verification link",
"inapp_template" : null,
"email_template" : {
"provider" : "amazonses",
"subject" : {
"en" : "Welcome to CoffeeBeans Consulting LLP!",
"in" : "Selamat Datang di CoffeeBeans Consulting LLP!"
},
"html" : {
"en" : "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" height=\"100%\" width=\"100%\" id=\"bodyTable\"> <tr> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"600\" id=\"emailContainer\" style=\"border-radius: 10px;box-shadow: 0 2.8px 2.2px rgba(0, 0, 0, 0.034), 0 6.7px 5.3px rgba(0, 0, 0, 0.048), 0 12.5px 10px rgba(0, 0, 0, 0.06), 0 22.3px 17.9px rgba(0, 0, 0, 0.072), 0 41.8px 33.4px rgba(0, 0, 0, 0.086), 0 100px 80px rgba(0, 0, 0, 0.12)\"> <tr style=\"background-color: #f7dc61;\"> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" id=\"emailHeader\"> <tr> <td align=\"center\" valign=\"top\"> <img src=\"https://www.coffeebeans.io/images/logo-a8559bab.png\" alt=\"CoffeeBeans Consulting LLP logo\" width=\"50\" height=\"50\"> </td></tr></table> </td></tr><tr> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" id=\"emailBody\"> <tr> <td align=\"left\" valign=\"top\"> Hi {{user_name}}, <br/><br/>Welcome! We are incredibly excited to have you on {{brand_name}}. We applaud your fantastic decision :). <br/><br/> Please click on the following verification link to verify your email and enjoy all the benefits of using {{brand_name}} : <a href=\"{{verification_link}}\" target=\"_blank\" style=\"text-decoration: none;color: #f7dc61;\">{{verification_link}}</a><br/><br/>Cheers, <br/>{{brand_name}}</td></tr></table> </td></tr><tr> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" id=\"emailFooter\"> <tr> <td align=\"center\" valign=\"top\"><a href=\"{{brand_url}}\" target=\"_blank\" style=\"text-decoration: none;color: #f7dc61;\">{{brand_url_without_protocol}}</a> </td></tr></table> </td></tr></table> </td></tr></table>",
"in" : "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" height=\"100%\" width=\"100%\" id=\"bodyTable\"> <tr> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"600\" id=\"emailContainer\" style=\"border-radius: 10px;box-shadow: 0 2.8px 2.2px rgba(0, 0, 0, 0.034), 0 6.7px 5.3px rgba(0, 0, 0, 0.048), 0 12.5px 10px rgba(0, 0, 0, 0.06), 0 22.3px 17.9px rgba(0, 0, 0, 0.072), 0 41.8px 33.4px rgba(0, 0, 0, 0.086), 0 100px 80px rgba(0, 0, 0, 0.12)\"> <tr style=\"background-color: #f7dc61;\"> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" id=\"emailHeader\"> <tr> <td align=\"center\" valign=\"top\"> <img src=\"https://www.coffeebeans.io/images/logo-a8559bab.png\" alt=\"CoffeeBeans Consulting LLP logo\" width=\"50\" height=\"50\"> </td></tr></table> </td></tr><tr> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" id=\"emailBody\"> <tr> <td align=\"left\" valign=\"top\"> Hai {{user_name}}, <br/> <br/> Selamat datang! Kami sangat senang menerima Anda di {{brand_name}}. Kami menghargai keputusan fantastis Anda :). <br/> <br/> Silakan klik tautan verifikasi berikut untuk memverifikasi email Anda dan nikmati semua manfaat menggunakan {{brand_name}} : <a href=\"{{verification_link}}\" target=\"_blank\" style=\"text-decoration: none;color: #f7dc61;\">{{verification_link}}</a><br/> <br/> Ceria, <br / >{{brand_name}}</td></tr></table> </td></tr><tr> <td align=\"center\" valign=\"top\"> <table border=\"0\" cellpadding=\"20\" cellspacing=\"0\" width=\"100%\" id=\"emailFooter\"> <tr> <td align=\"center\" valign=\"top\"><a href=\"{{brand_url}}\" target=\"_blank\" style=\"text-decoration: none;color: #f7dc61;\">{{brand_url_without_protocol}}</a> </td></tr></table> </td></tr></table> </td></tr></table>"
},
"attachments" : []
},
"push_template" : {
"provider" : "onesignal",
"headings" : {
"en" : "Welcome!",
"in" : "Selamat datang!"
},
"subtitle" : {
"en" : "Excited to have you onboard",
"in" : "Senang melihat Anda bergabung"
},
"contents" : {
"en" : "Hi {{user_name}}, we are incredibly excited to have you onboard and have sent you a verification email.",
"in" : "Halo {{user_name}}, kami sangat senang Anda bergabung dan mengirimkan email verifikasi."
},
"url" : "https://www.coffeebeans.io",
"android_accent_color" : "FFFF0000",
"huawei_accent_color" : "FFFF0000",
"android_led_color" : "FF0000FF",
"huawei_led_color" : "0000FF"
},
"sms_template" : null,
"is_enabled" : 1
});And, of course, feel free to submit pull requests with bug fixes/changes/feature additions. All contributions are always welcomed!
To get started: fork this repository to your own GitHub account and then clone it to your local device.
$ git clone git@github.com:[YOUR_USERNAME]/notif-engine.git && cd notif-engine && npm install$ np$ yarn publish
$ yarn info @coffeebeanslabs/notif-engine // for package infoThen add, commit, push to your repo and finally send a pull request
- MongoDB Node.JS Driver
- Nodemailer
- onesignal-node
- Sindre Sorhus for the amazing module np. This module has been of immense help, making
npm publisheasy and blazing fast.