feat(Jira Node): Add Simplify Output option to Issue > Get (#2408)

*  Add option to use Jira field display names

* 🚸 Make mapped fields more deterministic

* ♻️ Refactor Jira user loadOptions

* Moved and renamed the option as well as only returning the fields to

* Tweaked Friendly Fields to make it "Simplify Output" following similar patterns to other nodes

*  Improvements

Co-authored-by: Jonathan Bennetts <jonathan.bennetts@gmail.com>
Co-authored-by: ricardo <ricardoespinoza105@gmail.com>
This commit is contained in:
pemontto
2022-03-27 10:49:47 +01:00
committed by GitHub
parent 5ba4c27d8c
commit 016aeaaa79
3 changed files with 98 additions and 41 deletions

View File

@@ -18,12 +18,14 @@ import {
INodePropertyOptions,
INodeType,
INodeTypeDescription,
JsonObject,
NodeOperationError,
} from 'n8n-workflow';
import {
jiraSoftwareCloudApiRequest,
jiraSoftwareCloudApiRequestAllItems,
simplifyIssueOutput,
validateJSON,
} from './GenericFunctions';
@@ -178,7 +180,7 @@ export class Jira implements INodeType {
} catch (err) {
return {
status: 'Error',
message: `Connection details not valid: ${err.message}`,
message: `Connection details not valid: ${(err as JsonObject).message}`,
};
}
return {
@@ -303,45 +305,29 @@ export class Jira implements INodeType {
// Get all the users to display them to user so that he can
// select them easily
async getUsers(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
const jiraVersion = this.getCurrentNodeParameter('jiraVersion') as string;
const query: IDataObject = {};
let endpoint = '/api/2/users/search';
if (jiraVersion === 'server') {
// the interface call must bring username
const users = await jiraSoftwareCloudApiRequest.call(this, '/api/2/user/search', 'GET', {},
{
username: '\'',
},
);
for (const user of users) {
const userName = user.displayName;
const userId = user.name;
returnData.push({
name: userName,
value: userId,
});
}
} else {
const users = await jiraSoftwareCloudApiRequest.call(this, '/api/2/users/search', 'GET');
for (const user of users) {
const userName = user.displayName;
const userId = user.accountId;
returnData.push({
name: userName,
value: userId,
});
}
endpoint = '/api/2/user/search';
query.username = '\'';
}
returnData.sort((a, b) => {
if (a.name < b.name) { return -1; }
if (a.name > b.name) { return 1; }
return 0;
const users = await jiraSoftwareCloudApiRequest.call(this, endpoint, 'GET', {}, query);
return users.reduce((activeUsers: INodePropertyOptions[], user: IDataObject) => {
if (user.active) {
activeUsers.push({
name: user.displayName as string,
value: (user.accountId || user.name) as string,
});
}
return activeUsers;
}, []).sort((a: INodePropertyOptions, b: INodePropertyOptions) => {
return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
});
return returnData;
},
// Get all the groups to display them to user so that he can
@@ -418,10 +404,10 @@ export class Jira implements INodeType {
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,
});
returnData.push({
name: field.name,
value: field.key || field.fieldId,
});
}
}
return returnData;
@@ -642,6 +628,7 @@ export class Jira implements INodeType {
if (operation === 'get') {
for (let i = 0; i < length; i++) {
const issueKey = this.getNodeParameter('issueKey', i) as string;
const simplifyOutput = this.getNodeParameter('simplifyOutput', i) as boolean;
const additionalFields = this.getNodeParameter('additionalFields', i) as IDataObject;
if (additionalFields.fields) {
qs.fields = additionalFields.fields as string;
@@ -652,6 +639,9 @@ export class Jira implements INodeType {
if (additionalFields.expand) {
qs.expand = additionalFields.expand as string;
}
if (simplifyOutput) {
qs.expand = `${qs.expand || ''},names`;
}
if (additionalFields.properties) {
qs.properties = additionalFields.properties as string;
}
@@ -659,7 +649,12 @@ export class Jira implements INodeType {
qs.updateHistory = additionalFields.updateHistory as string;
}
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}`, 'GET', {}, qs);
returnData.push(responseData);
if (simplifyOutput) {
returnData.push(simplifyIssueOutput(responseData));
} else {
returnData.push(responseData);
}
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-search-post
@@ -689,7 +684,7 @@ export class Jira implements INodeType {
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/2/search`, 'POST', body);
responseData = responseData.issues;
}
returnData.push.apply(returnData, responseData);
returnData.push(...responseData);
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-changelog-get