n8n-nodes-base
Version:
Base nodes of n8n
934 lines (933 loc) • 72.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Jira = void 0;
const mergeWith_1 = __importDefault(require("lodash/mergeWith"));
const n8n_workflow_1 = require("n8n-workflow");
const GenericFunctions_1 = require("./GenericFunctions");
const IssueAttachmentDescription_1 = require("./IssueAttachmentDescription");
const IssueCommentDescription_1 = require("./IssueCommentDescription");
const IssueDescription_1 = require("./IssueDescription");
const UserDescription_1 = require("./UserDescription");
class Jira {
description = {
displayName: 'Jira Software',
name: 'jira',
icon: 'file:jira.svg',
group: ['output'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Consume Jira Software API',
defaults: {
name: 'Jira Software',
},
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
usableAsTool: true,
credentials: [
{
name: 'jiraSoftwareCloudApi',
required: true,
displayOptions: {
show: {
jiraVersion: ['cloud'],
},
},
},
{
name: 'jiraSoftwareServerApi',
required: true,
displayOptions: {
show: {
jiraVersion: ['server'],
},
},
},
{
name: 'jiraSoftwareServerPatApi',
required: true,
displayOptions: {
show: {
jiraVersion: ['serverPat'],
},
},
},
],
properties: [
{
displayName: 'Jira Version',
name: 'jiraVersion',
type: 'options',
options: [
{
name: 'Cloud',
value: 'cloud',
},
{
name: 'Server (Self Hosted)',
value: 'server',
},
{
name: 'Server Pat (Self Hosted)',
value: 'serverPat',
},
],
default: 'cloud',
},
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Issue',
value: 'issue',
description: 'Creates an issue or, where the option to create subtasks is enabled in Jira, a subtask',
},
{
name: 'Issue Attachment',
value: 'issueAttachment',
description: 'Add, remove, and get an attachment from an issue',
},
{
name: 'Issue Comment',
value: 'issueComment',
description: 'Get, create, update, and delete a comment from an issue',
},
{
name: 'User',
value: 'user',
description: 'Get, create and delete a user',
},
],
default: 'issue',
},
...IssueDescription_1.issueOperations,
...IssueDescription_1.issueFields,
...IssueAttachmentDescription_1.issueAttachmentOperations,
...IssueAttachmentDescription_1.issueAttachmentFields,
...IssueCommentDescription_1.issueCommentOperations,
...IssueCommentDescription_1.issueCommentFields,
...UserDescription_1.userOperations,
...UserDescription_1.userFields,
],
};
methods = {
listSearch: {
// Get all the projects to display them to user so that they can
// select them easily
async getProjects(filter) {
const returnData = [];
const jiraVersion = this.getCurrentNodeParameter('jiraVersion');
let endpoint = '';
let projects;
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
endpoint = '/api/2/project';
projects = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, endpoint, 'GET');
}
else {
endpoint = '/api/2/project/search';
projects = await GenericFunctions_1.jiraSoftwareCloudApiRequestAllItems.call(this, 'values', endpoint, 'GET');
}
if (projects.values && Array.isArray(projects.values)) {
projects = projects.values;
}
for (const project of projects) {
const projectName = project.name;
const projectId = project.id;
returnData.push({
name: projectName,
value: projectId,
});
}
return { results: (0, GenericFunctions_1.filterSortSearchListItems)(returnData, filter) };
},
// Get all the issue types to display them to user so that they can
// select them easily
async getIssueTypes() {
const projectId = this.getCurrentNodeParameter('project', { extractValue: true });
const returnData = [];
const { issueTypes } = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/project/${projectId}`, 'GET');
if (!issueTypes)
return { results: [] };
for (const issueType of issueTypes) {
const issueTypeName = issueType.name;
const issueTypeId = issueType.id;
returnData.push({
name: issueTypeName,
value: issueTypeId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return { results: returnData };
},
// Get all the users to display them to user so that they can
// select them easily
async getUsers(filter) {
const users = await GenericFunctions_1.getUsers.call(this);
return { results: (0, GenericFunctions_1.filterSortSearchListItems)(users, filter) };
},
// Get all the priorities to display them to user so that they can
// select them easily
async getPriorities() {
const returnData = [];
const priorities = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/priority', 'GET');
for (const priority of priorities) {
const priorityName = priority.name;
const priorityId = priority.id;
returnData.push({
name: priorityName,
value: priorityId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return { results: returnData };
},
// Get all the transitions (status) to display them to user so that they can
// select them easily
async getTransitions() {
const returnData = [];
const issueKey = this.getCurrentNodeParameter('issueKey');
const transitions = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}/transitions`, 'GET');
for (const transition of transitions.transitions) {
returnData.push({
name: transition.name,
value: transition.id,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return { results: returnData };
},
// Get all the custom fields to display them to user so that they can
// select them easily
async getCustomFields() {
const returnData = [];
const operation = this.getCurrentNodeParameter('operation');
const jiraVersion = this.getNodeParameter('jiraVersion', 0);
let projectId;
let issueTypeId;
let issueId = ''; // /editmeta endpoint requires issueId
if (operation === 'create') {
projectId = this.getCurrentNodeParameter('project', { extractValue: true });
issueTypeId = this.getCurrentNodeParameter('issueType', { extractValue: true });
}
else {
const issueKey = this.getCurrentNodeParameter('issueKey');
const res = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}`, 'GET', {}, {});
projectId = res.fields.project.id;
issueTypeId = res.fields.issuetype.id;
issueId = res.id;
}
if (jiraVersion === 'server' && operation === 'update' && issueId) {
// https://developer.atlassian.com/server/jira/platform/jira-rest-api-example-edit-issues-6291632/?utm_source=chatgpt.com
const { fields } = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueId}/editmeta`, 'GET');
for (const field of Object.keys(fields || {})) {
if (field.startsWith('customfield_')) {
returnData.push({
name: fields[field].name,
value: field,
});
}
}
return { results: returnData };
}
const res = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/createmeta?projectIds=${projectId}&issueTypeIds=${issueTypeId}&expand=projects.issuetypes.fields`, 'GET');
const fields = res.projects
.find((o) => o.id === projectId)
.issuetypes.find((o) => o.id === issueTypeId).fields;
for (const key of Object.keys(fields)) {
const field = fields[key];
if (field.schema && Object.keys(field.schema).includes('customId')) {
returnData.push({
name: field.name,
value: field.key || field.fieldId,
});
}
}
return { results: returnData };
},
},
loadOptions: {
// Get all the labels to display them to user so that they can
// select them easily
async getLabels() {
const returnData = [];
const labels = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/label', 'GET');
for (const label of labels.values) {
const labelName = label;
const labelId = label;
returnData.push({
name: labelName,
value: labelId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return returnData;
},
// Get all the users to display them to user so that they can
// select them easily
async getUsers() {
return await GenericFunctions_1.getUsers.call(this);
},
// Get all the groups to display them to user so that they can
// select them easily
async getGroups() {
const returnData = [];
const groups = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/groups/picker', 'GET');
for (const group of groups.groups) {
const groupName = group.name;
const groupId = group.name;
returnData.push({
name: groupName,
value: groupId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return returnData;
},
// Get all the components to display them to user so that they can
// select them easily
async getProjectComponents() {
const returnData = [];
const project = this.getCurrentNodeParameter('project', { extractValue: true });
const { values: components } = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/project/${project}/component`, 'GET');
for (const component of components) {
returnData.push({
name: component.name,
value: component.id,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
});
return returnData;
},
},
};
async execute() {
const items = this.getInputData();
const returnData = [];
const length = items.length;
let responseData;
const qs = {};
const resource = this.getNodeParameter('resource', 0);
const operation = this.getNodeParameter('operation', 0);
const jiraVersion = this.getNodeParameter('jiraVersion', 0);
if (resource === 'issue') {
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-post
if (operation === 'create') {
for (let i = 0; i < length; i++) {
try {
const summary = this.getNodeParameter('summary', i);
const projectId = this.getNodeParameter('project', i, '', {
extractValue: true,
});
const issueTypeId = this.getNodeParameter('issueType', i, '', {
extractValue: true,
});
const additionalFields = this.getNodeParameter('additionalFields', i);
const assignee = this.getNodeParameter('additionalFields.assignee', i, '', {
extractValue: true,
});
if (assignee)
additionalFields.assignee = assignee;
const reporter = this.getNodeParameter('additionalFields.reporter', i, '', {
extractValue: true,
});
if (reporter)
additionalFields.reporter = reporter;
const priority = this.getNodeParameter('additionalFields.priority', i, '', {
extractValue: true,
});
if (priority)
additionalFields.priority = priority;
const body = {};
const fields = {
summary,
project: {
id: projectId,
},
issuetype: {
id: issueTypeId,
},
};
if (additionalFields.labels) {
fields.labels = additionalFields.labels;
}
if (additionalFields.serverLabels) {
fields.labels = additionalFields.serverLabels;
}
if (additionalFields.priority) {
fields.priority = {
id: additionalFields.priority,
};
}
if (additionalFields.assignee) {
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
fields.assignee = {
name: additionalFields.assignee,
};
}
else {
fields.assignee = {
id: additionalFields.assignee,
};
}
}
if (additionalFields.reporter) {
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
fields.reporter = {
name: additionalFields.reporter,
};
}
else {
fields.reporter = {
id: additionalFields.reporter,
};
}
}
if (additionalFields.description) {
fields.description = additionalFields.description;
}
if (additionalFields.updateHistory) {
qs.updateHistory = additionalFields.updateHistory;
}
if (additionalFields.componentIds) {
fields.components = additionalFields.componentIds.map((id) => ({ id }));
}
if (additionalFields.customFieldsUi) {
const customFields = additionalFields.customFieldsUi
.customFieldsValues;
if (customFields) {
// resolve resource locator fieldId value
customFields.forEach((cf) => {
if (typeof cf.fieldId !== 'string') {
cf.fieldId = cf.fieldId.value.trim();
}
});
const data = customFields.reduce((obj, value) => Object.assign(obj, { [`${value.fieldId}`]: value.fieldValue }), {});
Object.assign(fields, data);
}
}
const issueTypes = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/issuetype', 'GET', {}, qs);
const subtaskIssues = [];
for (const issueType of issueTypes) {
if (issueType.subtask) {
subtaskIssues.push(issueType.id);
}
}
if (!additionalFields.parentIssueKey && subtaskIssues.includes(issueTypeId)) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'You must define a Parent Issue Key when Issue type is sub-task', { itemIndex: i });
}
else if (additionalFields.parentIssueKey && subtaskIssues.includes(issueTypeId)) {
fields.parent = {
key: additionalFields.parentIssueKey.toUpperCase(),
};
}
body.fields = fields;
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/issue', 'POST', body);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-put
if (operation === 'update') {
for (let i = 0; i < length; i++) {
try {
const issueKey = this.getNodeParameter('issueKey', i);
const updateFields = this.getNodeParameter('updateFields', i);
const assignee = this.getNodeParameter('updateFields.assignee', i, '', {
extractValue: true,
});
if (assignee)
updateFields.assignee = assignee;
const reporter = this.getNodeParameter('updateFields.reporter', i, '', {
extractValue: true,
});
if (reporter)
updateFields.reporter = reporter;
const priority = this.getNodeParameter('updateFields.priority', i, '', {
extractValue: true,
});
if (priority)
updateFields.priority = priority;
const statusId = this.getNodeParameter('updateFields.statusId', i, '', {
extractValue: true,
});
if (statusId)
updateFields.statusId = statusId;
const body = {};
const fields = {};
if (updateFields.summary) {
fields.summary = updateFields.summary;
}
if (updateFields.issueType) {
fields.issuetype = {
id: updateFields.issueType,
};
}
if (updateFields.labels) {
fields.labels = updateFields.labels;
}
if (updateFields.serverLabels) {
fields.labels = updateFields.serverLabels;
}
if (updateFields.priority) {
fields.priority = {
id: updateFields.priority,
};
}
if (updateFields.assignee) {
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
fields.assignee = {
name: updateFields.assignee,
};
}
else {
fields.assignee = {
id: updateFields.assignee,
};
}
}
if (updateFields.reporter) {
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
fields.reporter = {
name: updateFields.reporter,
};
}
else {
fields.reporter = {
id: updateFields.reporter,
};
}
}
if (updateFields.description) {
fields.description = updateFields.description;
}
if (updateFields.customFieldsUi) {
const customFields = updateFields.customFieldsUi
.customFieldsValues;
if (customFields) {
// resolve resource locator fieldId value
customFields.forEach((cf) => {
if (typeof cf.fieldId !== 'string') {
cf.fieldId = cf.fieldId.value.trim();
}
});
const data = customFields.reduce((obj, value) => Object.assign(obj, { [`${value.fieldId}`]: value.fieldValue }), {});
Object.assign(fields, data);
}
}
const issueTypes = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/issuetype', 'GET');
const subtaskIssues = [];
for (const issueType of issueTypes) {
if (issueType.subtask) {
subtaskIssues.push(issueType.id);
}
}
if (!updateFields.parentIssueKey && subtaskIssues.includes(updateFields.issueType)) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'You must define a Parent Issue Key when Issue type is sub-task', { itemIndex: i });
}
else if (updateFields.parentIssueKey &&
subtaskIssues.includes(updateFields.issueType)) {
fields.parent = {
key: updateFields.parentIssueKey.toUpperCase(),
};
}
body.fields = fields;
if (updateFields.statusId) {
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}/transitions`, 'POST', { transition: { id: updateFields.statusId } });
}
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}`, 'PUT', body);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ success: true }), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-get
if (operation === 'get') {
for (let i = 0; i < length; i++) {
try {
const issueKey = this.getNodeParameter('issueKey', i);
const simplifyOutput = this.getNodeParameter('simplifyOutput', i);
const additionalFields = this.getNodeParameter('additionalFields', i);
if (additionalFields.fields) {
qs.fields = additionalFields.fields;
}
if (additionalFields.fieldsByKey) {
qs.fieldsByKey = additionalFields.fieldsByKey;
}
if (additionalFields.expand) {
qs.expand = additionalFields.expand;
}
if (simplifyOutput) {
qs.expand = `${qs.expand || ''},names`;
}
if (additionalFields.properties) {
qs.properties = additionalFields.properties;
}
if (additionalFields.updateHistory) {
qs.updateHistory = additionalFields.updateHistory;
}
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}`, 'GET', {}, qs);
if (simplifyOutput) {
// Use rendered fields if requested and available
qs.expand = qs.expand || '';
if (qs.expand.toLowerCase().indexOf('renderedfields') !== -1 &&
responseData.renderedFields &&
Object.keys(responseData.renderedFields).length) {
responseData.fields = (0, mergeWith_1.default)(responseData.fields, responseData.renderedFields, (a, b) => (b === null ? a : b));
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray((0, GenericFunctions_1.simplifyIssueOutput)(responseData)), { itemData: { item: i } });
returnData.push(...executionData);
}
else {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-search-post
if (operation === 'getAll') {
for (let i = 0; i < length; i++) {
try {
const returnAll = this.getNodeParameter('returnAll', i);
const options = this.getNodeParameter('options', i);
const body = {};
if (!options.fields) {
// By default, the new endpoint returns only the ids, before it used to return `*navigable` fields
options.fields = '*navigable';
}
body.fields = options.fields.split(',');
if (!options.jql) {
// Jira API returns an error if the JQL query is unbounded (i.e. does not include any filters)
options.jql = 'created >= "1970-01-01"';
}
body.jql = options.jql;
if (options.expand) {
if (typeof options.expand === 'string') {
body.expand = options.expand.split(',');
}
else {
body.expand = options.expand;
}
}
if (returnAll) {
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequestAllItems.call(this, 'issues', '/api/2/search', 'POST', body);
}
else {
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequestAllItems.call(this, 'issues', '/api/2/search/jql', 'POST', body, {}, 'token');
}
}
else {
const limit = this.getNodeParameter('limit', i);
body.maxResults = limit;
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/search', 'POST', body);
}
else {
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, '/api/2/search/jql', 'POST', body);
}
responseData = responseData.issues;
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-changelog-get
if (operation === 'changelog') {
for (let i = 0; i < length; i++) {
try {
const issueKey = this.getNodeParameter('issueKey', i);
const returnAll = this.getNodeParameter('returnAll', i);
if (returnAll) {
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequestAllItems.call(this, 'values', `/api/2/issue/${issueKey}/changelog`, 'GET');
}
else {
qs.maxResults = this.getNodeParameter('limit', i);
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}/changelog`, 'GET', {}, qs);
responseData = responseData.values;
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-notify-post
if (operation === 'notify') {
for (let i = 0; i < length; i++) {
try {
const issueKey = this.getNodeParameter('issueKey', i);
const additionalFields = this.getNodeParameter('additionalFields', i);
const jsonActive = this.getNodeParameter('jsonParameters', 0);
const body = {};
if (additionalFields.textBody) {
body.textBody = additionalFields.textBody;
}
if (additionalFields.htmlBody) {
body.htmlBody = additionalFields.htmlBody;
}
if (!jsonActive) {
const notificationRecipientsValues = this.getNodeParameter('notificationRecipientsUi', i).notificationRecipientsValues;
const notificationRecipients = {};
if (notificationRecipientsValues) {
if (notificationRecipientsValues.reporter) {
notificationRecipients.reporter =
notificationRecipientsValues.reporter;
}
if (notificationRecipientsValues.assignee) {
notificationRecipients.assignee =
notificationRecipientsValues.assignee;
}
if (notificationRecipientsValues.assignee) {
notificationRecipients.watchers =
notificationRecipientsValues.watchers;
}
if (notificationRecipientsValues.voters) {
notificationRecipients.watchers = notificationRecipientsValues.voters;
}
if ((notificationRecipientsValues.users || []).length > 0) {
notificationRecipients.users = notificationRecipientsValues.users.map((user) => {
return {
accountId: user,
};
});
}
if ((notificationRecipientsValues.groups || []).length > 0) {
notificationRecipients.groups = notificationRecipientsValues.groups.map((group) => {
return {
name: group,
};
});
}
}
body.to = notificationRecipients;
const notificationRecipientsRestrictionsValues = this.getNodeParameter('notificationRecipientsRestrictionsUi', i).notificationRecipientsRestrictionsValues;
const notificationRecipientsRestrictions = {};
if (notificationRecipientsRestrictionsValues) {
if ((notificationRecipientsRestrictionsValues.groups || [])
.length > 0) {
notificationRecipientsRestrictions.groups = notificationRecipientsRestrictionsValues.groups.map((group) => {
return {
name: group,
};
});
}
}
body.restrict = notificationRecipientsRestrictions;
}
else {
const notificationRecipientsJson = (0, GenericFunctions_1.validateJSON)(this.getNodeParameter('notificationRecipientsJson', i));
if (notificationRecipientsJson) {
body.to = notificationRecipientsJson;
}
const notificationRecipientsRestrictionsJson = (0, GenericFunctions_1.validateJSON)(this.getNodeParameter('notificationRecipientsRestrictionsJson', i));
if (notificationRecipientsRestrictionsJson) {
body.restrict = notificationRecipientsRestrictionsJson;
}
}
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}/notify`, 'POST', body, qs);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ success: true }), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-transitions-get
if (operation === 'transitions') {
for (let i = 0; i < length; i++) {
try {
const issueKey = this.getNodeParameter('issueKey', i);
const additionalFields = this.getNodeParameter('additionalFields', i);
if (additionalFields.transitionId) {
qs.transitionId = additionalFields.transitionId;
}
if (additionalFields.expand) {
qs.expand = additionalFields.expand;
}
if (additionalFields.skipRemoteOnlyCondition) {
qs.skipRemoteOnlyCondition = additionalFields.skipRemoteOnlyCondition;
}
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}/transitions`, 'GET', {}, qs);
responseData = responseData.transitions;
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-delete
if (operation === 'delete') {
for (let i = 0; i < length; i++) {
try {
const issueKey = this.getNodeParameter('issueKey', i);
const deleteSubtasks = this.getNodeParameter('deleteSubtasks', i);
qs.deleteSubtasks = deleteSubtasks;
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}`, 'DELETE', {}, qs);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ success: true }), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
}
if (resource === 'issueAttachment') {
const apiVersion = jiraVersion === 'server' || jiraVersion === 'serverPat' ? '2' : '3';
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-attachments/#api-rest-api-3-issue-issueidorkey-attachments-post
if (operation === 'add') {
for (let i = 0; i < length; i++) {
try {
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i);
const issueKey = this.getNodeParameter('issueKey', i);
const binaryData = this.helpers.assertBinaryData(i, binaryPropertyName);
let uploadData;
if (binaryData.id) {
uploadData = await this.helpers.getBinaryStream(binaryData.id);
}
else {
uploadData = Buffer.from(binaryData.data, n8n_workflow_1.BINARY_ENCODING);
}
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/${apiVersion}/issue/${issueKey}/attachments`, 'POST', {}, {}, undefined, {
formData: {
file: {
value: uploadData,
options: {
filename: binaryData.fileName,
},
},
},
});
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } });
returnData.push(...executionData);
continue;
}
throw error;
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-attachments/#api-rest-api-3-attachment-id-delete
if (operation === 'remove') {
for (let i = 0; i < length; i++) {
try {
const attachmentId = this.getNodeParameter('attachmentId', i);
responseData = await GenericFunctions_1.jiraSoftwareCloudApiRequest.call(this, `/api/${apiVersion}/attachment/${attachmentId}`, 'DELETE', {}, qs);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ success: true }), { itemData: { item: i } });