Skip to content

Instantly share code, notes, and snippets.

@nghinv-exo-tqa
Forked from malko/jira-rocketchat-hook.js
Created April 24, 2017 18:12
Show Gist options
  • Select an option

  • Save nghinv-exo-tqa/226d31d18fd2de4c3cac636b55cd7b27 to your computer and use it in GitHub Desktop.

Select an option

Save nghinv-exo-tqa/226d31d18fd2de4c3cac636b55cd7b27 to your computer and use it in GitHub Desktop.

Revisions

  1. @malko malko created this gist May 10, 2016.
    78 changes: 78 additions & 0 deletions jira-rocketchat-hook.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,78 @@
    /*jshint esnext:true*/
    const DESC_MAX_LENGTH = 140;
    const JIRA_LOGO = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACRElEQVRYhbWXsUscQRTGf4iIyHHIISIWIsHisMgfkNIiBJFwiKQIkipVqpA/wEZEggSxEkmZwiKI5A84REKKkIMQrINYBQmHBDmEHJdNMW+42dk3d3O76wcDu2/e973vZvfN7EF+PAfaMjYL6AzFJFBRYh0gkdEBpryciuQVwjPgFugCu068CvQcAz1g2pnfEc6taOTGL6dIAjxw5nad+FsnvuhxrosYuPbElrz5Rc8Ucu9yfhcxsAncYZZ4fwTeO+HcUcILWgFqOXg1si9vFBrAXB7iEMySfYQZzGCeWxdoAq+Bh8BYjoJjwn0jWrYrqsOIbdIvUQLseTmPgHXgiYx1ibnYU3RuYpyfKMQ/mNWx+KzkfHHmZ4Tj55zGGNhQiAlw5OQ8VeYbzvxRQCNqUxoHLgMCa07eRyd+4sTXAtwrYCLGAJje1URugLrkVIHvMuyLVZccjfsitrhFMyD0k36bTtA/cOZkTuOckaOTFtA7IgEuSG9ONeBHILctWrnwGNO/mvA3zAk4LddaThfTpoXwKiBuVyL0yxPhloLtAUVCY7us4hb7IxQ/KLu4xWFE8cP7Kg6mld4PKH5BvoNrZBMfBphohKnFMAusyvU48ClgoA3M34eBUynwUu6ngK8BE1Gn3ihYccR79Jd5nuyXsx0rZRo498Q7mK8dMDudZuC8rOLLgQI7Ts5xIGe5DANbinCP9AfmEul/SnZslWHgTBFuKnna8a3lpRCzadSVWMiAj6GPIMbAX+/+H9BS8loyN4ibwX9j/jIXDkk+pgAAAABJRU5ErkJggg==';
    function stripDesc(str) {
    return str.length > DESC_MAX_LENGTH ? str.slice(0, DESC_MAX_LENGTH - 3) + '...' : str;
    }

    function prepareAttachment({issue, user}, text) {
    let issueType = issue.fields.issuetype;
    let res = {
    author_name: user.displayName
    , author_icon: user.avatarUrls['24x24']
    , thumb_url: issueType.iconUrl
    };
    if (text) {
    text = text.replace(/\{\{(user|issue)\.([^a-z_0-9]+)\}\}/g, (m, type, key) => (type==='user' ? user : issue)[key]);
    res.text = text;
    }
    return res;
    }
    class Script {
    process_incoming_request({request}) {
    const data = request.content;
    try {
    if (!data.issue || (data.user && data.user.name === 'gitlab')) {
    return;
    }
    let issue = data.issue;
    let baseJiraUrl = issue.self.replace(/\/rest\/.*$/, '');
    let user = data.user;
    let assignedTo = (issue.fields.assigned && issue.fields.assigned.name !== user.name) ? `, assigned to ${issue.fields.assigned.name}` : '';
    let issueSummary = `[${issue.key}](${baseJiraUrl}/browse/${issue.key}) ${issue.fields.summary} _(${issue.fields.priority.name.replace(/^\s*\d*\.\s*/, '')}${assignedTo})_`;
    let message = {
    icon_url: (issue.fields.project && issue.fields.project.avatarUrls && issue.fields.project.avatarUrls['48x48']) || JIRA_LOGO
    , attachments: []
    };

    if (data.webhookEvent === 'jira:issue_created') {
    message.attachments.push(prepareAttachment(data, `*Created* ${issueSummary}:\n${stripDesc(issue.fields.description)}`));
    } else if (data.webhookEvent === 'jira:issue_deleted') {
    message.attachments.push(prepareAttachment(data, `*Deleted* ${issueSummary}`));
    } else if (data.webhookEvent === 'jira:issue_updated') {
    if (data.changelog && data.changelog.items) { // field update
    let logs = [];
    data.changelog.items.forEach((change) => {
    if (!change.field.match('status|resolution|comment|priority') ) {
    return;
    }
    if (change.field==='description') {
    logs.push(`Changed *description* to:\n${stripDesc(change.toString)}`);
    } else {
    logs.push(`*${change.field}* changed from ${change.fromString} to *${change.toString}*`);
    }
    });
    logs.length && message.attachments.push(prepareAttachment(data, `*Updated* ${issueSummary}:\n - ${logs.join('\n - ')}`));
    }

    if (data.comment) { // comment update
    let comment = data.comment;
    let action = comment.created !== comment.updated ? 'Updated comment' : 'Commented';
    message.attachments.push(prepareAttachment(data, `*${action}* on ${issueSummary}:\n${stripDesc(comment.body)}`));
    }
    }

    if (message.text || message.attachments.length) {
    return {content:message};
    }
    } catch(e) {
    console.log('jiraevent error', e);
    return {
    error: {
    success: false,
    message: `${e.message || e} ${JSON.stringify(data)}`
    }
    };
    }
    }
    }