Add Issue Comment resource to Jira Node (#1261)

*  Add Issue Comment resource

* 🔨Fix Expand field description

*  Small fix

*  Minor improvements on Jira Node

Co-authored-by: Harshil <ghagrawal17@gmail.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
This commit is contained in:
Ricardo Espinoza 2020-12-29 05:33:13 -05:00 committed by GitHub
parent 9215558608
commit 2f0c48f8d9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 622 additions and 1 deletions

View file

@ -0,0 +1,488 @@
import {
INodeProperties,
} from 'n8n-workflow';
export const issueCommentOperations = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
displayOptions: {
show: {
resource: [
'issueComment',
],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add comment to issue',
},
{
name: 'Get',
value: 'get',
description: 'Get a comment',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all comments',
},
{
name: 'Remove',
value: 'remove',
description: 'Remove a comment',
},
{
name: 'Update',
value: 'update',
description: 'Update a comment',
},
],
default: 'add',
description: 'The operation to perform.',
},
] as INodeProperties[];
export const issueCommentFields = [
/* -------------------------------------------------------------------------- */
/* issueComment:add */
/* -------------------------------------------------------------------------- */
{
displayName: 'Issue Key',
name: 'issueKey',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'add',
],
},
},
default: '',
description: 'issueComment Key',
},
{
displayName: 'JSON Parameters',
name: 'jsonParameters',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'add',
],
},
},
},
{
displayName: 'Comment',
name: 'comment',
type: 'string',
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'add',
],
jsonParameters: [
false,
],
},
},
description: `Comment's text`,
},
{
displayName: 'Document Format (JSON)',
name: 'commentJson',
type: 'json',
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'add',
],
jsonParameters: [
true,
],
},
},
description: `The Atlassian Document Format (ADF). Online builder can be found <a href="https://developer.atlassian.com/cloud/jira/platform/apis/document/playground/" target="_blank">here</a>.`,
},
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'add',
],
},
},
options: [
{
displayName: 'Expand',
name: 'expand',
type: 'options',
options: [
{
name: 'Rendered Body',
value: 'renderedBody',
},
],
default: '',
description: 'Use expand to include additional information about comments<br />in the response. This parameter accepts Rendered Body, which<br />returns the comment body rendered in HTML.',
},
],
},
/* -------------------------------------------------------------------------- */
/* issueComment:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Issue Key',
name: 'issueKey',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'get',
],
},
},
default: '',
description: 'The ID or key of the issue.',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'get',
],
},
},
description: 'The ID of the comment',
},
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'get',
],
},
},
options: [
{
displayName: 'Expand',
name: 'expand',
type: 'options',
options: [
{
name: 'Rendered Body',
value: 'renderedBody',
},
],
default: '',
description: 'Use expand to include additional information about comments in<br />the response. This parameter accepts Rendered Body, which<br />returns the comment body rendered in HTML.',
},
],
},
/* -------------------------------------------------------------------------- */
/* issueComment:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Issue Key',
name: 'issueKey',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'getAll',
],
},
},
default: '',
description: 'The ID or key of the issue.',
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'getAll',
],
},
},
default: false,
description: 'If all results should be returned or only up to a given limit.',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'getAll',
],
returnAll: [
false,
],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'How many results to return.',
},
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'getAll',
],
},
},
options: [
{
displayName: 'Expand',
name: 'expand',
type: 'options',
options: [
{
name: 'Rendered Body',
value: 'renderedBody',
},
],
default: '',
description: 'Use expand to include additional information about comments in the<br />response. This parameter accepts Rendered Body, which returns the comment<br />body rendered in HTML.',
},
],
},
/* -------------------------------------------------------------------------- */
/* issueComment:remove */
/* -------------------------------------------------------------------------- */
{
displayName: 'Issue Key',
name: 'issueKey',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'remove',
],
},
},
default: '',
description: 'The ID or key of the issue.',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'remove',
],
},
},
description: 'The ID of the comment.',
},
/* -------------------------------------------------------------------------- */
/* issueComment:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Issue Key',
name: 'issueKey',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'update',
],
},
},
default: '',
description: 'The Issue Comment key.',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'update',
],
},
},
description: 'The ID of the comment.',
},
{
displayName: 'JSON Parameters',
name: 'jsonParameters',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'update',
],
},
},
},
{
displayName: 'Comment',
name: 'comment',
type: 'string',
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'update',
],
jsonParameters: [
false,
],
},
},
description: `Comment's text.`,
},
{
displayName: 'Document Format (JSON)',
name: 'commentJson',
type: 'json',
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'update',
],
jsonParameters: [
true,
],
},
},
description: `The Atlassian Document Format (ADF). Online builder can be found <a href="https://developer.atlassian.com/cloud/jira/platform/apis/document/playground/" target="_blank">here</a>.`,
},
{
displayName: 'Options',
name: 'options',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: [
'issueComment',
],
operation: [
'update',
],
},
},
options: [
{
displayName: 'Expand',
name: 'expand',
type: 'options',
options: [
{
name: 'Rendered Body',
value: 'renderedBody',
},
],
default: '',
description: 'Use expand to include additional information about comments in the response. This parameter accepts Rendered Body, which returns the comment body rendered in HTML.',
},
],
},
] as INodeProperties[];

View file

@ -1,4 +1,6 @@
import { INodeProperties } from "n8n-workflow";
import {
INodeProperties,
} from 'n8n-workflow';
export const issueOperations = [
{

View file

@ -17,6 +17,11 @@ import {
validateJSON,
} from './GenericFunctions';
import {
issueCommentFields,
issueCommentOperations,
} from './IssueCommentDescription';
import {
issueFields,
issueOperations,
@ -96,12 +101,19 @@ export class Jira implements INodeType {
value: 'issue',
description: 'Creates an issue or, where the option to create subtasks is enabled in Jira, a subtask',
},
{
name: 'Issue Comment',
value: 'issueComment',
description: 'Get, create, update, and delete a comment from an issue.',
},
],
default: 'issue',
description: 'Resource to consume.',
},
...issueOperations,
...issueFields,
...issueCommentOperations,
...issueCommentFields,
],
};
@ -642,6 +654,125 @@ export class Jira implements INodeType {
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/2/issue/${issueKey}`, 'DELETE', {}, qs);
}
}
if (resource === 'issueComment') {
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-post
if (operation === 'add') {
const jsonParameters = this.getNodeParameter('jsonParameters', 0) as boolean;
const issueKey = this.getNodeParameter('issueKey', i) as string;
const options = this.getNodeParameter('options', i) as IDataObject;
const body: IDataObject = {};
if (options.expand) {
qs.expand = options.expand as string;
delete options.expand;
}
Object.assign(body, options);
if (jsonParameters === false) {
const comment = this.getNodeParameter('comment', i) as string;
Object.assign(body, {
body: {
type: 'doc',
version: 1,
content: [
{
type: "paragraph",
content: [
{
type: 'text',
text: comment,
},
],
},
],
},
});
} else {
const commentJson = this.getNodeParameter('commentJson', i) as string;
const json = validateJSON(commentJson);
if (json === '') {
throw new Error('Document Format must be a valid JSON');
}
Object.assign(body, { body: json });
}
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/3/issue/${issueKey}/comment`, 'POST', body, qs);
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v2/#api-rest-api-2-issue-issueIdOrKey-get
if (operation === 'get') {
const issueKey = this.getNodeParameter('issueKey', i) as string;
const commentId = this.getNodeParameter('commentId', i) as string;
const options = this.getNodeParameter('options', i) as IDataObject;
Object.assign(qs, options);
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/3/issue/${issueKey}/comment/${commentId}`, 'GET', {}, qs);
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-get
if (operation === 'getAll') {
const issueKey = this.getNodeParameter('issueKey', i) as string;
const returnAll = this.getNodeParameter('returnAll', i) as boolean;
const options = this.getNodeParameter('options', i) as IDataObject;
const body: IDataObject = {};
Object.assign(qs, options);
if (returnAll) {
responseData = await jiraSoftwareCloudApiRequestAllItems.call(this, 'comments', `/api/3/issue/${issueKey}/comment`, 'GET', body, qs);
} else {
const limit = this.getNodeParameter('limit', i) as number;
body.maxResults = limit;
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/3/issue/${issueKey}/comment`, 'GET', body, qs);
responseData = responseData.comments;
}
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-id-delete
if (operation === 'remove') {
const issueKey = this.getNodeParameter('issueKey', i) as string;
const commentId = this.getNodeParameter('commentId', i) as string;
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/3/issue/${issueKey}/comment/${commentId}`, 'DELETE', {}, qs);
responseData = { success: true };
}
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-id-put
if (operation === 'update') {
const issueKey = this.getNodeParameter('issueKey', i) as string;
const commentId = this.getNodeParameter('commentId', i) as string;
const options = this.getNodeParameter('options', i) as IDataObject;
const jsonParameters = this.getNodeParameter('jsonParameters', 0) as boolean;
const body: IDataObject = {};
if (options.expand) {
qs.expand = options.expand as string;
delete options.expand;
}
Object.assign(qs, options);
if (jsonParameters === false) {
const comment = this.getNodeParameter('comment', i) as string;
Object.assign(body, {
body: {
type: 'doc',
version: 1,
content: [
{
type: "paragraph",
content: [
{
type: 'text',
text: comment,
},
],
},
],
},
});
} else {
const commentJson = this.getNodeParameter('commentJson', i) as string;
const json = validateJSON(commentJson);
if (json === '') {
throw new Error('Document Format must be a valid JSON');
}
Object.assign(body, { body: json });
}
responseData = await jiraSoftwareCloudApiRequest.call(this, `/api/3/issue/${issueKey}/comment/${commentId}`, 'PUT', body, qs);
}
}
if (Array.isArray(responseData)) {
returnData.push.apply(returnData, responseData as IDataObject[]);
} else {