UNPKG

slack-gitlab-mr-reminder

Version:

Send reminders about gitlab merge requests to slack

67 lines (59 loc) 1.96 kB
var moment = require('moment'); var slack = require('@slack/client'); var GitLab = require('./gitlab'); const SLACK_LOGO_URL = 'https://about.gitlab.com/images/press/logo/logo.png'; class SlackGitlabMRReminder { constructor(options) { this.options = options; this.options.gitlab.external_url = this.options.gitlab.external_url || 'https://gitlab.com'; this.options.slack.name = this.options.slack.name || 'GitLab Reminder'; this.options.slack.message = this.options.slack.message || 'Merge requests are overdue:'; this.gitlab = new GitLab(this.options.gitlab.external_url, this.options.gitlab.access_token, this.options.gitlab.group); this.webhook = new slack.IncomingWebhook(this.options.slack.webhook_url, { username: this.options.slack.name, iconUrl: SLACK_LOGO_URL, channel: this.options.slack.channel }); } createSlackMessage(merge_requests) { const attachments = merge_requests.map((mr) => { return { color: '#FC6D26', author_name: mr.author.name, title: mr.title, title_link: mr.web_url, text: mr.description, }; }); return { text: this.options.slack.message, attachments }; } remind() { return this.gitlab.getGroupMergeRequests() .then((merge_requests) => { return merge_requests.filter((mr) => { return moment().diff(moment(mr.updated_at), 'days') > 0; }); }) .then((merge_requests) => { if(merge_requests.length > 0) { return this.createSlackMessage(merge_requests); } else { throw 'No reminders to send' } }) .then((message) => { return new Promise((resolve, reject) => { this.webhook.send(message, (err, res) => { err ? reject(err) : resolve('Reminder sent'); }); }); }, (message) => { return Promise.resolve(message); }); } } module.exports = SlackGitlabMRReminder;