mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
feat(Jira Software Node): Personal Access Token credential type (#11038)
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
import type {
|
||||||
|
IAuthenticateGeneric,
|
||||||
|
ICredentialTestRequest,
|
||||||
|
ICredentialType,
|
||||||
|
INodeProperties,
|
||||||
|
} from 'n8n-workflow';
|
||||||
|
|
||||||
|
export class JiraSoftwareServerPatApi implements ICredentialType {
|
||||||
|
name = 'jiraSoftwareServerPatApi';
|
||||||
|
|
||||||
|
displayName = 'Jira SW Server (PAT) API';
|
||||||
|
|
||||||
|
documentationUrl = 'jira';
|
||||||
|
|
||||||
|
properties: INodeProperties[] = [
|
||||||
|
{
|
||||||
|
displayName: 'Personal Access Token',
|
||||||
|
name: 'personalAccessToken',
|
||||||
|
typeOptions: { password: true },
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Domain',
|
||||||
|
name: 'domain',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
placeholder: 'https://example.com',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
authenticate: IAuthenticateGeneric = {
|
||||||
|
type: 'generic',
|
||||||
|
properties: {
|
||||||
|
headers: {
|
||||||
|
Authorization: '=Bearer {{$credentials.personalAccessToken}}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
test: ICredentialTestRequest = {
|
||||||
|
request: {
|
||||||
|
baseURL: '={{$credentials?.domain}}',
|
||||||
|
url: '/rest/api/2/project',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -28,6 +28,9 @@ export async function jiraSoftwareCloudApiRequest(
|
|||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server') {
|
||||||
domain = (await this.getCredentials('jiraSoftwareServerApi')).domain as string;
|
domain = (await this.getCredentials('jiraSoftwareServerApi')).domain as string;
|
||||||
credentialType = 'jiraSoftwareServerApi';
|
credentialType = 'jiraSoftwareServerApi';
|
||||||
|
} else if (jiraVersion === 'serverPat') {
|
||||||
|
domain = (await this.getCredentials('jiraSoftwareServerPatApi')).domain as string;
|
||||||
|
credentialType = 'jiraSoftwareServerPatApi';
|
||||||
} else {
|
} else {
|
||||||
domain = (await this.getCredentials('jiraSoftwareCloudApi')).domain as string;
|
domain = (await this.getCredentials('jiraSoftwareCloudApi')).domain as string;
|
||||||
credentialType = 'jiraSoftwareCloudApi';
|
credentialType = 'jiraSoftwareCloudApi';
|
||||||
@@ -233,7 +236,7 @@ export async function getUsers(this: ILoadOptionsFunctions): Promise<INodeProper
|
|||||||
const query: IDataObject = { maxResults };
|
const query: IDataObject = { maxResults };
|
||||||
let endpoint = '/api/2/users/search';
|
let endpoint = '/api/2/users/search';
|
||||||
|
|
||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
|
||||||
endpoint = '/api/2/user/search';
|
endpoint = '/api/2/user/search';
|
||||||
query.username = "'";
|
query.username = "'";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,15 @@ export class Jira implements INodeType {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'jiraSoftwareServerPatApi',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
jiraVersion: ['serverPat'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
properties: [
|
properties: [
|
||||||
{
|
{
|
||||||
@@ -82,6 +91,10 @@ export class Jira implements INodeType {
|
|||||||
name: 'Server (Self Hosted)',
|
name: 'Server (Self Hosted)',
|
||||||
value: 'server',
|
value: 'server',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Server Pat (Self Hosted)',
|
||||||
|
value: 'serverPat',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
default: 'cloud',
|
default: 'cloud',
|
||||||
},
|
},
|
||||||
@@ -139,7 +152,7 @@ export class Jira implements INodeType {
|
|||||||
let endpoint = '';
|
let endpoint = '';
|
||||||
let projects;
|
let projects;
|
||||||
|
|
||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
|
||||||
endpoint = '/api/2/project';
|
endpoint = '/api/2/project';
|
||||||
projects = await jiraSoftwareCloudApiRequest.call(this, endpoint, 'GET');
|
projects = await jiraSoftwareCloudApiRequest.call(this, endpoint, 'GET');
|
||||||
} else {
|
} else {
|
||||||
@@ -502,7 +515,7 @@ export class Jira implements INodeType {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (additionalFields.assignee) {
|
if (additionalFields.assignee) {
|
||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
|
||||||
fields.assignee = {
|
fields.assignee = {
|
||||||
name: additionalFields.assignee as string,
|
name: additionalFields.assignee as string,
|
||||||
};
|
};
|
||||||
@@ -513,7 +526,7 @@ export class Jira implements INodeType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (additionalFields.reporter) {
|
if (additionalFields.reporter) {
|
||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
|
||||||
fields.reporter = {
|
fields.reporter = {
|
||||||
name: additionalFields.reporter as string,
|
name: additionalFields.reporter as string,
|
||||||
};
|
};
|
||||||
@@ -632,7 +645,7 @@ export class Jira implements INodeType {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (updateFields.assignee) {
|
if (updateFields.assignee) {
|
||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
|
||||||
fields.assignee = {
|
fields.assignee = {
|
||||||
name: updateFields.assignee as string,
|
name: updateFields.assignee as string,
|
||||||
};
|
};
|
||||||
@@ -643,7 +656,7 @@ export class Jira implements INodeType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (updateFields.reporter) {
|
if (updateFields.reporter) {
|
||||||
if (jiraVersion === 'server') {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat') {
|
||||||
fields.reporter = {
|
fields.reporter = {
|
||||||
name: updateFields.reporter as string,
|
name: updateFields.reporter as string,
|
||||||
};
|
};
|
||||||
@@ -1025,7 +1038,8 @@ export class Jira implements INodeType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (resource === 'issueAttachment') {
|
if (resource === 'issueAttachment') {
|
||||||
const apiVersion = jiraVersion === 'server' ? '2' : ('3' as string);
|
const apiVersion =
|
||||||
|
jiraVersion === 'server' || jiraVersion === 'serverPat' ? '2' : ('3' as string);
|
||||||
|
|
||||||
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-attachments/#api-rest-api-3-issue-issueidorkey-attachments-post
|
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-attachments/#api-rest-api-3-issue-issueidorkey-attachments-post
|
||||||
if (operation === 'add') {
|
if (operation === 'add') {
|
||||||
@@ -1183,7 +1197,8 @@ export class Jira implements INodeType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (resource === 'issueComment') {
|
if (resource === 'issueComment') {
|
||||||
let apiVersion = jiraVersion === 'server' ? '2' : ('3' as string);
|
let apiVersion =
|
||||||
|
jiraVersion === 'server' || jiraVersion === 'serverPat' ? '2' : ('3' as string);
|
||||||
|
|
||||||
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-post
|
//https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-comments/#api-rest-api-3-issue-issueidorkey-comment-post
|
||||||
if (operation === 'add') {
|
if (operation === 'add') {
|
||||||
@@ -1205,7 +1220,7 @@ export class Jira implements INodeType {
|
|||||||
Object.assign(body, options);
|
Object.assign(body, options);
|
||||||
if (!jsonParameters) {
|
if (!jsonParameters) {
|
||||||
const comment = this.getNodeParameter('comment', i) as string;
|
const comment = this.getNodeParameter('comment', i) as string;
|
||||||
if (jiraVersion === 'server' || options.wikiMarkup) {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat' || options.wikiMarkup) {
|
||||||
Object.assign(body, { body: comment });
|
Object.assign(body, { body: comment });
|
||||||
} else {
|
} else {
|
||||||
Object.assign(body, {
|
Object.assign(body, {
|
||||||
@@ -1356,7 +1371,7 @@ export class Jira implements INodeType {
|
|||||||
Object.assign(qs, options);
|
Object.assign(qs, options);
|
||||||
if (!jsonParameters) {
|
if (!jsonParameters) {
|
||||||
const comment = this.getNodeParameter('comment', i) as string;
|
const comment = this.getNodeParameter('comment', i) as string;
|
||||||
if (jiraVersion === 'server' || options.wikiMarkup) {
|
if (jiraVersion === 'server' || jiraVersion === 'serverPat' || options.wikiMarkup) {
|
||||||
Object.assign(body, { body: comment });
|
Object.assign(body, { body: comment });
|
||||||
} else {
|
} else {
|
||||||
Object.assign(body, {
|
Object.assign(body, {
|
||||||
@@ -1407,7 +1422,8 @@ export class Jira implements INodeType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (resource === 'user') {
|
if (resource === 'user') {
|
||||||
const apiVersion = jiraVersion === 'server' ? '2' : ('3' as string);
|
const apiVersion =
|
||||||
|
jiraVersion === 'server' || jiraVersion === 'serverPat' ? '2' : ('3' as string);
|
||||||
|
|
||||||
if (operation === 'create') {
|
if (operation === 'create') {
|
||||||
// https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-users/#api-rest-api-3-user-post
|
// https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-users/#api-rest-api-3-user-post
|
||||||
|
|||||||
@@ -45,6 +45,16 @@ export class JiraTrigger implements INodeType {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Credentials to Connect to Jira',
|
||||||
|
name: 'jiraSoftwareServerPatApi',
|
||||||
|
required: true,
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
jiraVersion: ['serverPat'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// eslint-disable-next-line n8n-nodes-base/node-class-description-credentials-name-unsuffixed
|
// eslint-disable-next-line n8n-nodes-base/node-class-description-credentials-name-unsuffixed
|
||||||
name: 'httpQueryAuth',
|
name: 'httpQueryAuth',
|
||||||
@@ -87,6 +97,10 @@ export class JiraTrigger implements INodeType {
|
|||||||
name: 'Server (Self Hosted)',
|
name: 'Server (Self Hosted)',
|
||||||
value: 'server',
|
value: 'server',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Server (Pat) (Self Hosted)',
|
||||||
|
value: 'serverPat',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
default: 'cloud',
|
default: 'cloud',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -181,6 +181,7 @@
|
|||||||
"dist/credentials/JenkinsApi.credentials.js",
|
"dist/credentials/JenkinsApi.credentials.js",
|
||||||
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
|
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
|
||||||
"dist/credentials/JiraSoftwareServerApi.credentials.js",
|
"dist/credentials/JiraSoftwareServerApi.credentials.js",
|
||||||
|
"dist/credentials/JiraSoftwareServerPatApi.credentials.js",
|
||||||
"dist/credentials/JotFormApi.credentials.js",
|
"dist/credentials/JotFormApi.credentials.js",
|
||||||
"dist/credentials/JwtAuth.credentials.js",
|
"dist/credentials/JwtAuth.credentials.js",
|
||||||
"dist/credentials/Kafka.credentials.js",
|
"dist/credentials/Kafka.credentials.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user