Недавно я придумал очень удобный компонент — likeastore / notifier . Notifier прост в настройке электронной почты, SMS и сервера push-уведомлений. Это был открытый источник несколько месяцев, очень специфичный для потребностей Likeastore , но благодаря большому вкладу он стал очень общим и может использоваться в ваших проектах.
Как только вам нужно настроить инфраструктуру для уведомлений в вашем приложении, это будет действительно легко сделать. Он обеспечивает транспортировку push-уведомлений Mandrill , Twilio , Android и Apple .
Начинать
Проект уже имеет всеобъемлющий README, который объясняет начальные шаги. На данный момент сервер доступен в виде github-репозитория, который вам нужно клонировать и подготовить точку входа для него. Я думаю собрать вещи в один npm
модуль. Если вы видите, что это имеет смысл, пожалуйста, дайте мне знать.
Для начала вам нужно клонировать репо,
$ git clone https://github.com/likeastore/notifier.git
А потом создайте app.js
файл, там вся настройка notifer
проходит.
var notifier = require('./source/notifier'); // TODO: configuration // start the server notifier.start(process.env.PORT || 7000);
Давай перейдем прямо к configuration
части.
События, Акции и Исполнители
notifier
Является HTTP — сервер, который принимает event
и повороты , что события в соответствующие action
. Одно событие может создать столько действий, сколько необходимо. Действия это то, что позже будет executed
.
Базовая настройка состоит из 3 частей: получение события, разрешение события и его выполнение.
notifier .receive('incoming-event', function (event, actions, callback) { /* ... */ }) .resolve('created-action', function (action, actions, callback) { /* ... */ }) .execute('created-action', function (action, transport, callback) { /* ... */ });
Скажем, у нас есть user-registered
событие, которое нам нужно отправить приветственное письмо,
notifier .receive('user-registered', function (e, actions, callback) { actions.create('send-welcome', {user: e.user}, callback); }) .resolve('send-welcome', function (action, actions, callback) { db.users.findOne({email: action.user}, function (err, user) { if (err) { return callback(err); } if (!user) { return callback({message: 'user not found', email: action.email}); } var data = { email: action.user, user: _.pick(user, userPick) }; actions.resolved(action, data, callback); }); }) .execute('send-welcome', function (action, transport, callback) { var vars = [ {name: 'USERID', content: action.data.user._id}, {name: 'USER_NAME', content: action.data.user.displayName || action.data.user.name} ]; transport.mandrill('/messages/send-template', { template_name: 'welcome-email', template_content: [], message: { auto_html: null, to: [{email: action.data.email}], global_merge_vars: vars, preserve_recipients: false } }, callback); });
recieve
— получает событие извне и превращает событие в соответствующее действие.resolve
— шаг для расширения действия с дополнительными данными, адресом электронной почты, именем пользователя и т. Д.execute
— использует транспорт для передачи события
Транспорты
Mandrill обеспечивает поддержку из уведомлений по электронной почте,
.execute('send-welcome', function (action, transport, callback) { var vars = [ {name: 'USERID', content: action.data.user._id}, {name: 'USER_NAME', content: action.data.user.displayName || action.data.user.name} ]; transport.mandrill('/messages/send-template', { template_name: 'welcome-email', template_content: [], message: { auto_html: null, to: [{email: action.data.email}], global_merge_vars: vars, preserve_recipients: false } }, callback); });
Twilio используется из смс,
.execute('send-verify-sms', function (a, transport, callback) { transport.twilio.messages.create({ to: a.data.phone, from: '+12282201270', body: 'Verification code: 1111', }, callback); });
Для Android push-уведомлений,
.execute('send-android-push-notification', function (a, transport, callback) { var tokens = []; tokens.push(a.data.token); transport.android.push({ message: {key1: 'value1', key2: 'value2'}, tokens: tokens, retries: 3 }, callback); });
Для Apple push-уведомлений,
.execute('send-ios-push-notification', function (a, transport, callback) { var tokens = []; tokens.push(a.data.token); transport.ios.push({ production: false, // use specific gateway based on 'production' property. passphrase: 'secretPhrase', alert: { "body" : "Your turn!", "action-loc-key" : "Play" , "launch-image" : "mysplash.png"}, badge: 1, tokens: tokens }, callback); });
конфигурация
Перед запуском необходимо убедиться, что notifier
настроен правильно. Токены безопасности и строки подключения к MongoDB. Если вы используете Logentries, вы можете предоставить токен, и все журналы будут отправлены туда.
Это accessToken
общий секрет между сервером и клиентом для предотвращения несанкционированного доступа.
Конфигурации используют переменную ENV по производству и абсолютных значения для разработки и постановки.
клиенты
notifier
может использоваться любым HTTP-клиентом, в самом простом случае curl
,
$ echo '{"event": "incoming-event"}' | curl -H "Content-Type:application/json" -d @- http://notifier.likeastore.com/api/events?access_token=ACCESS_TOKEN
У нас уже есть Node.js-клиент DemocracyOS / notifier-client и мы планируем также иметь браузерный клиент. Но по сути это просто HTTP-сообщение с event
полезной нагрузкой и access_token
строкой запроса, поэтому в основном его можно использовать с любого языка и платформы.