resque-slack
Version:
Trigger Slack notifications on job events.
88 lines (74 loc) • 2.19 kB
JavaScript
var got = require('got');
module.exports = ResqueSlack;
function ResqueSlack(worker, func, queue, job, args, options) {
this.name = 'resqueSlack';
this.worker = worker;
this.queue = queue;
this.func = func;
this.job = job;
this.args = args;
this.options = options || {};
this.messages = {
before_enqueue: {
success: 'About to queue job:',
error: 'Job could not be queued:'
},
after_enqueue: {
success: 'Hot dang! Job queued:',
error: 'Bummer! Job failed after being queued:'
},
before_perform: {
success: 'About to perform job:',
error: 'Job could not be performed:'
},
after_perform: {
success: 'Hot dang! Job done successfully:',
error: 'Bummer! Job failed after being performed:'
}
};
};
ResqueSlack.prototype.runHook = function(hook, done) {
if (!this.options[hook]) return done();
var message = this.messages[hook];
if (this.worker.error) this.notify(message.error, done);
else this.notify(message.success, done);
};
ResqueSlack.prototype.notify = function(message, done) {
var notification = {
username: 'Resque SlackBot',
icon_emoji: ':robot_face:',
text: message + ' ' + this.func,
attachments: [{
color: this.worker.error ? 'danger' : 'good',
fields: this.args.map(function(arg, index) {
return {
title: 'Argument ' + index,
value: arg,
short: false
}
})
}],
};
if (this.worker.error) notification.text += this.worker.error;
got.post(this.options.webhook, {
body: JSON.stringify(notification),
})
.then(function(response) {
return done(null, response.body);
})
.catch(function(error) {
return done(new Error(error));
});
};
ResqueSlack.prototype.before_enqueue = function(done) {
return this.runHook('before_enqueue', done);
};
ResqueSlack.prototype.after_enqueue = function(done) {
return this.runHook('after_enqueue', done);
};
ResqueSlack.prototype.before_perform = function(done) {
return this.runHook('before_perform', done);
};
ResqueSlack.prototype.after_perform = function(done) {
return this.runHook('after_perform', done);
};