Ghost/core/server/services/webhooks.js

58 lines
1.5 KiB
JavaScript
Raw Normal View History

var _ = require('lodash'),
common = require('../lib/common'),
api = require('../api'),
modelAttrs;
// TODO: this can be removed once all events pass a .toJSON object through
modelAttrs = {
subscriber: ['id', 'name', 'email']
};
// TODO: this works for basic models but we eventually want a full API response
// with embedded models (?include=tags) and so on
function generatePayload(event, model) {
var modelName = event.split('.')[0],
pluralModelName = modelName + 's',
action = event.split('.')[1],
payload = {},
data;
if (action === 'deleted') {
data = {};
modelAttrs[modelName].forEach(function (key) {
if (model._previousAttributes[key] !== undefined) {
data[key] = model._previousAttributes[key];
}
});
} else {
data = model.toJSON();
}
payload[pluralModelName] = [data];
return payload;
}
function listener(event, model, options) {
var payload = generatePayload(event, model);
// avoid triggering webhooks when importing
if (options && options.importing) {
return;
}
api.webhooks.trigger(event, payload, options);
}
// TODO: use a wildcard with the new event emitter or use the webhooks API to
// register listeners only for events that have webhooks
function listen() {
common.events.on('subscriber.added', _.partial(listener, 'subscriber.added'));
common.events.on('subscriber.deleted', _.partial(listener, 'subscriber.deleted'));
}
// Public API
module.exports = {
listen: listen
};