Skip to content

Commit

Permalink
feat(ServiceNow Node): Add basicAuth support and fix getColumns loadO…
Browse files Browse the repository at this point in the history
…ptions (#2712)

* ✨ Support basic auth for ServiceNow

* 🐛 Support ServiceNow sysparm_fields as string

* ⚡ credential test for basic auth

* fix(Google Tasks Node): Fix "Show Completed" option and hide title field where not needed (#2741)

* 🐛 Google Tasks: Fix showCompleted

* ⚡ Improvements

Co-authored-by: ricardo <ricardoespinoza105@gmail.com>

* feat(Mocean Node): Add "Delivery Report URL" option and credential tests (#3075)

* add dlr url column

add dlr url(delivery report URl) column. Allow user set the
endpoint
to receive the report

* update

update delivery report url description

* ⚡ fixed nodelinter issues, added credential test, replaced icon

* ⚡ Improvements

Co-authored-by: d3no <d3no520@gmail.com>
Co-authored-by: Michael Kret <michael.k@radency.com>

* feat(Emelia Node): Add Campaign > Duplicate functionality (#3000)

* feat(Emelia Node): Add campaign duplication feature

* ⚡ small ui fixes, added credential test, fixed nodelinter issues

* ⚡ Improvements

* ⚡ Updated wording for Number operations on IF-Node (#3065)

* fix(Google Tasks Node): Fix "Show Completed" option and hide title field where not needed (#2741)

* 🐛 Google Tasks: Fix showCompleted

* ⚡ Improvements

Co-authored-by: ricardo <ricardoespinoza105@gmail.com>

* feat(Mocean Node): Add "Delivery Report URL" option and credential tests (#3075)

* add dlr url column

add dlr url(delivery report URl) column. Allow user set the
endpoint
to receive the report

* update

update delivery report url description

* ⚡ fixed nodelinter issues, added credential test, replaced icon

* ⚡ Improvements

Co-authored-by: d3no <d3no520@gmail.com>
Co-authored-by: Michael Kret <michael.k@radency.com>

* ⚡ Normalize name

Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: ricardo <ricardoespinoza105@gmail.com>
Co-authored-by: Jonathan Bennetts <jonathan.bennetts@gmail.com>
Co-authored-by: Tom <19203795+that-one-tom@users.noreply.github.com>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: d3no <d3no520@gmail.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>

* ⚡ fix nodelinter issues, added hint to field option

* fix(GraphQL Node)!: Correctly report errors returned by the API (#3071)

* upstream merge

* ⚡ graphql node will throw error when response has errors property

* 🔨 updated changelog

* ⚡ Improvements

* ⚡ Improvements

* ⚡ Add package-lock.json back

Co-authored-by: ricardo <ricardoespinoza105@gmail.com>

* feat(FTP Node): Add option to recursively create directories on rename (#3001)

* Recursively Make Directories on SFTP Rename

* Linting

* ⚡ Improvement

* ⚡ Rename "Move" to "Create Directories"

* Change "Create Directories" description

Co-authored-by: ricardo <ricardoespinoza105@gmail.com>

* feat(Microsoft Teams Node): Add chat message support (#2635)

* ✨ Add chat messages to MS Teams node

* Updated credentials to include missing scope

* ⚡ Small improvements

Co-authored-by: Jonathan Bennetts <jonathan.bennetts@gmail.com>
Co-authored-by: ricardo <ricardoespinoza105@gmail.com>

* feat(Mautic Node): Add credential test and allow trailing slash in host (#3080)

* Updated Mautic to stop trailing slashes from causing an issue

* Fixed oauth failing when there is a trailing slash in the mautic host

* Added credential test

* test: Fix randomly failing UM tests (#3061)

* ⚡ Declutter test logs

* 🐛 Fix random passwords length

* 🐛 Fix password hashing in test user creation

* 🐛 Hash leftover password

* ⚡ Improve error message for `compare`

* ⚡ Restore `randomInvalidPassword` contant

* ⚡ Mock Telemetry module to prevent `--forceExit`

* ⚡ Silence logger

* ⚡ Simplify condition

* ⚡ Unhash password in payload

* fix(NocoDB Node): Fix pagination (#3081)

* feat(Strava Node): Add "Get Streams" operation (#2582)

* Strava node: adding getStreams operation

* Changed the keys to use multiOptions

Co-authored-by: Jonathan Bennetts <jonathan.bennetts@gmail.com>

* ⚡ Improvements

* fix(core): Fix crash on webhook when last node did not return data

* fix(Salesforce Node): Fix issue that "status" did not get used for Case => Create & Update (#2212)

* bugfix for salesforce case create and update case not picking status

* 🐛 Fix issue with package-lock.json

Co-authored-by: ricardo <ricardoespinoza105@gmail.com>

* 🐛 Fix issue with credentials

* ⚡ Fix basicAuth

* ⚡ Reset default

Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: Tom <19203795+that-one-tom@users.noreply.github.com>
Co-authored-by: ricardo <ricardoespinoza105@gmail.com>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: d3no <d3no520@gmail.com>
Co-authored-by: Charles Lecalier <charles.lecalier@gmail.com>
Co-authored-by: Jonathan Bennetts <jonathan.bennetts@gmail.com>
Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: Rhys Williams <me@rhyswilliams.co.za>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Luis Cipriani <37157+lfcipriani@users.noreply.github.com>
Co-authored-by: Ketan Somvanshi <ketan.somvanshi@plivo.com>
  • Loading branch information
14 people committed Apr 2, 2022
1 parent 1018146 commit 2c72584
Show file tree
Hide file tree
Showing 14 changed files with 199 additions and 70 deletions.
35 changes: 35 additions & 0 deletions packages/nodes-base/credentials/ServiceNowBasicApi.credentials.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import {
IAuthenticateBasicAuth,
ICredentialType,
INodeProperties,
ICredentialTestRequest,
} from 'n8n-workflow';

export class ServiceNowBasicApi implements ICredentialType {
name = 'serviceNowBasicApi';
extends = [
'httpBasicAuth'
];
displayName = 'ServiceNow Basic Auth API';
documentationUrl = 'serviceNow';
properties: INodeProperties[] = [
{
displayName: 'Subdomain',
name: 'subdomain',
type: 'string',
default: '',
hint: 'The subdomain can be extracted from the URL. If the URL is: https://dev99890.service-now.com the subdomain is dev99890',
required: true,
},
];
authenticate: IAuthenticateBasicAuth = {
type: 'basicAuth',
properties: {},
};
test: ICredentialTestRequest = {
request: {
baseURL: '=https://{{$credentials?.subdomain}}.service-now.com',
url: '/api/now/table/sys_user_role',
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ export class ServiceNowOAuth2Api implements ICredentialType {
name: 'subdomain',
type: 'string',
default: '',
placeholder: 'n8n',
description: 'The subdomain of your ServiceNow environment',
hint: 'The subdomain can be extracted from the URL. If the URL is: https://dev99890.service-now.com the subdomain is dev99890',
required: true,
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const businessServiceOperations: INodeProperties[] = [
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
Expand Down Expand Up @@ -44,7 +45,7 @@ export const businessServiceFields: INodeProperties[] = [
},
},
default: false,
description: 'If all results should be returned or only up to a given limit',
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
Expand Down Expand Up @@ -99,17 +100,19 @@ export const businessServiceFields: INodeProperties[] = [
name: 'sysparm_fields',
type: 'multiOptions',
typeOptions: {
// nodelinter-ignore-next-line
loadOptionsMethod: 'getColumns',
},
default: '',
default: [],
description: 'A list of fields to return',
hint: 'String of comma separated values or an array of strings can be set in an expression',
},
{
displayName: 'Filter',
name: 'sysparm_query',
type: 'string',
default: '',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>.',
},
{
displayName: 'Return Values',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const configurationItemsOperations: INodeProperties[] = [
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
Expand Down Expand Up @@ -44,7 +45,7 @@ export const configurationItemsFields: INodeProperties[] = [
},
},
default: false,
description: 'If all results should be returned or only up to a given limit',
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
Expand All @@ -68,7 +69,7 @@ export const configurationItemsFields: INodeProperties[] = [
maxValue: 500,
},
default: 50,
description: 'The max number of results to return',
description: 'Max number of results to return',
},
{
displayName: 'Options',
Expand Down Expand Up @@ -99,17 +100,19 @@ export const configurationItemsFields: INodeProperties[] = [
name: 'sysparm_fields',
type: 'multiOptions',
typeOptions: {
// nodelinter-ignore-next-line
loadOptionsMethod: 'getColumns',
},
default: '',
default: [],
description: 'A list of fields to return',
hint: 'String of comma separated values or an array of strings can be set in an expression',
},
{
displayName: 'Filter',
name: 'sysparm_query',
type: 'string',
default: '',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>.',
},
{
displayName: 'Return Values',
Expand Down
9 changes: 6 additions & 3 deletions packages/nodes-base/nodes/ServiceNow/DepartmentDescription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const departmentOperations: INodeProperties[] = [
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
Expand Down Expand Up @@ -44,7 +45,7 @@ export const departmentFields: INodeProperties[] = [
},
},
default: false,
description: 'If all results should be returned or only up to a given limit',
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
Expand Down Expand Up @@ -99,17 +100,19 @@ export const departmentFields: INodeProperties[] = [
name: 'sysparm_fields',
type: 'multiOptions',
typeOptions: {
// nodelinter-ignore-next-line
loadOptionsMethod: 'getColumns',
},
default: '',
default: [],
description: 'A list of fields to return',
hint: 'String of comma separated values or an array of strings can be set in an expression',
},
{
displayName: 'Filter',
name: 'sysparm_query',
type: 'string',
default: '',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>.',
},
{
displayName: 'Return Values',
Expand Down
9 changes: 6 additions & 3 deletions packages/nodes-base/nodes/ServiceNow/DictionaryDescription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const dictionaryOperations: INodeProperties[] = [
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: [
Expand Down Expand Up @@ -44,7 +45,7 @@ export const dictionaryFields: INodeProperties[] = [
},
},
default: false,
description: 'If all results should be returned or only up to a given limit',
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
Expand Down Expand Up @@ -99,17 +100,19 @@ export const dictionaryFields: INodeProperties[] = [
name: 'sysparm_fields',
type: 'multiOptions',
typeOptions: {
// nodelinter-ignore-next-line
loadOptionsMethod: 'getColumns',
},
default: '',
default: [],
description: 'A list of fields to return',
hint: 'String of comma separated values or an array of strings can be set in an expression',
},
{
displayName: 'Filter',
name: 'sysparm_query',
type: 'string',
default: '',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>',
description: 'An encoded query string used to filter the results. <a href="https://developer.servicenow.com/dev.do#!/learn/learning-plans/quebec/servicenow_application_developer/app_store_learnv2_rest_quebec_more_about_query_parameters">More info</a>.',
},
{
displayName: 'Return Values',
Expand Down
20 changes: 15 additions & 5 deletions packages/nodes-base/nodes/ServiceNow/GenericFunctions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,25 @@ import {
import {
IDataObject,
INodePropertyOptions,
JsonObject,
NodeApiError,
} from 'n8n-workflow';

export async function serviceNowApiRequest(this: IExecuteFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any

const credentials = await this.getCredentials('serviceNowOAuth2Api');
const headers = {} as IDataObject;
const authenticationMethod = this.getNodeParameter('authentication', 0, 'oAuth2') as string;

let credentials;

if (authenticationMethod === 'basicAuth') {
credentials = await this.getCredentials('serviceNowBasicApi');
} else {
credentials = await this.getCredentials('serviceNowOAuth2Api');
}

const options: OptionsWithUri = {
headers: {},
headers,
method,
qs,
body,
Expand All @@ -38,11 +48,11 @@ export async function serviceNowApiRequest(this: IExecuteFunctions | ILoadOption
}

try {

return await this.helpers.requestOAuth2!.call(this, 'serviceNowOAuth2Api', options);
const credentialType = authenticationMethod === 'oAuth2' ? 'serviceNowOAuth2Api' : 'serviceNowBasicApi';
return await this.helpers.requestWithAuthentication.call(this, credentialType, options);

} catch (error) {
throw new NodeApiError(this.getNode(), error);
throw new NodeApiError(this.getNode(), (error as JsonObject));
}
}

Expand Down
Loading

0 comments on commit 2c72584

Please sign in to comment.