1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/lib/addons/jira-comment.js
2021-02-05 15:20:00 +01:00

117 lines
3.6 KiB
JavaScript

'use strict';
const Addon = require('./addon');
const definition = require('./jira-comment-definition');
const {
FEATURE_CREATED,
FEATURE_UPDATED,
FEATURE_REVIVED,
FEATURE_ARCHIVED,
} = require('../event-type');
class JiraAddon extends Addon {
constructor(args) {
super(definition, args);
this.unleashUrl = args.unleashUrl;
}
async handleEvent(event, parameters) {
const { type: eventName } = event;
const { baseUrl, user, apiKey } = parameters;
const issuesToPostTo = this.findJiraTag(event);
const action = this.getAction(eventName);
const body = this.formatBody(event, action);
const requests = issuesToPostTo.map(async issueTag => {
const issue = issueTag.value;
const issueUrl = `${baseUrl}/rest/api/3/issue/${issue}/comment`;
const requestOpts = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization: this.buildAuthHeader(user, apiKey),
},
body,
};
return this.fetchRetry(issueUrl, requestOpts);
});
const results = await Promise.all(requests);
const codes = results.map(res => res.status).join(', ');
this.logger.info(`Handled event ${event.type}. Status codes=${codes}`);
}
getAction(eventName) {
switch (eventName) {
case FEATURE_CREATED:
return 'created';
case FEATURE_UPDATED:
return 'updated';
case FEATURE_ARCHIVED:
return 'archived';
case FEATURE_REVIVED:
return 'revived';
default:
return 'unknown';
}
}
encode(str) {
return Buffer.from(str, 'utf-8').toString('base64');
}
formatBody(event, action) {
const featureName = event.data.name;
const { createdBy } = event;
return JSON.stringify({
body: {
type: 'doc',
version: 1,
content: [
{
type: 'paragraph',
content: [
{
type: 'text',
text: `Feature toggle "${featureName}" was ${action} by ${createdBy}`,
},
],
},
{
type: 'paragraph',
content: [
{
type: 'text',
text: `To see what happened visit Unleash`,
marks: [
{
type: 'link',
attrs: {
href: `${this.unleashUrl}/#/features/strategies/${featureName}`,
title: 'Visit Unleash Admin UI',
},
},
],
},
],
},
],
},
});
}
buildAuthHeader(userName, apiKey) {
const base64 = this.encode(`${userName}:${apiKey}`);
return `Basic ${base64}`;
}
findJiraTag({ tags }) {
return tags.filter(tag => tag.type === 'jira');
}
}
module.exports = JiraAddon;