mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-11 00:08:30 +01:00
117 lines
3.6 KiB
JavaScript
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;
|