Недавно я придумал очень удобный компонент — 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 строкой запроса, поэтому в основном его можно использовать с любого языка и платформы.