f489d7df72
no issue - changes xmlrcp & slack `init` function to be `listen` - update the code to use `listen` instead of `init` - changes the tests to make sure that event listeners are not wired up - adds 100% test coverage Since we added slack event listeners, the xmlrpc event tests have been throwing an error: > Unhandled rejection Error See: http://puu.sh/phvjZ.png This is because both xmlrpc & slack are listening to `post.published` events. xmlrpc didn't require any extra stubbing, but the slack listener did By turning the listeners off after the tests, we reset the environment to not impact the next event test We probably need to do more work like this to improve the systems around event handling and make them more robust
111 lines
3.0 KiB
JavaScript
111 lines
3.0 KiB
JavaScript
var https = require('https'),
|
|
errors = require('../../errors'),
|
|
url = require('url'),
|
|
Promise = require('bluebird'),
|
|
config = require('../../config'),
|
|
events = require('../../events'),
|
|
api = require('../../api/settings'),
|
|
i18n = require('../../i18n'),
|
|
schema = require('../schema').checks,
|
|
options,
|
|
req,
|
|
slackData = {};
|
|
|
|
function getSlackSettings() {
|
|
return api.read({context: {internal: true}, key: 'slack'}).then(function (response) {
|
|
var slackSetting = response.settings[0].value;
|
|
|
|
try {
|
|
slackSetting = JSON.parse(slackSetting);
|
|
} catch (e) {
|
|
return Promise.reject(e);
|
|
}
|
|
|
|
return slackSetting[0];
|
|
});
|
|
}
|
|
|
|
function makeRequest(reqOptions, reqPayload) {
|
|
req = https.request(reqOptions);
|
|
|
|
reqPayload = JSON.stringify(reqPayload);
|
|
|
|
req.write(reqPayload);
|
|
req.on('error', function (error) {
|
|
errors.logError(
|
|
error,
|
|
i18n.t('errors.data.xml.xmlrpc.pingUpdateFailed.error'),
|
|
i18n.t('errors.data.xml.xmlrpc.pingUpdateFailed.help', {url: 'http://support.ghost.org'})
|
|
);
|
|
});
|
|
|
|
req.end();
|
|
}
|
|
|
|
function ping(post) {
|
|
var message;
|
|
|
|
// If this is a post, we want to send the link of the post
|
|
if (schema.isPost(post)) {
|
|
message = config.urlFor('post', {post: post}, true);
|
|
} else {
|
|
message = post.message;
|
|
}
|
|
|
|
return getSlackSettings().then(function (slackSettings) {
|
|
// Quit here if slack integration is not activated
|
|
|
|
if (slackSettings.url && slackSettings.url !== '') {
|
|
// Only ping when not a page
|
|
if (post.page) {
|
|
return;
|
|
}
|
|
|
|
// Don't ping for the welcome to ghost post.
|
|
// This also handles the case where during ghost's first run
|
|
// models.init() inserts this post but permissions.init() hasn't
|
|
// (can't) run yet.
|
|
if (post.slug === 'welcome-to-ghost') {
|
|
return;
|
|
}
|
|
|
|
slackData = {
|
|
text: message,
|
|
unfurl_links: true,
|
|
icon_url: config.urlFor({relativeUrl: '/ghost/img/ghosticon.jpg'}, {}, true),
|
|
username: 'Ghost'
|
|
};
|
|
|
|
// fill the options for https request
|
|
options = url.parse(slackSettings.url);
|
|
options.method = 'POST';
|
|
options.headers = {'Content-type': 'application/json'};
|
|
|
|
// with all the data we have, we're doing the request now
|
|
makeRequest(options, slackData);
|
|
} else {
|
|
return;
|
|
}
|
|
});
|
|
}
|
|
|
|
function listener(model) {
|
|
ping(model.toJSON());
|
|
}
|
|
|
|
function testPing() {
|
|
ping({
|
|
message: 'Heya! This is a test notification from your Ghost blog :simple_smile:. Seems to work fine!'
|
|
});
|
|
}
|
|
|
|
function listen() {
|
|
events.on('post.published', listener);
|
|
events.on('slack.test', testPing);
|
|
}
|
|
|
|
// Public API
|
|
module.exports = {
|
|
listen: listen
|
|
};
|