|
|
@@ -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)}` |
|
|
} |
|
|
}; |
|
|
} |
|
|
} |
|
|
} |