mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-26 21:19:43 -08:00
2c72584b55
* ✨ 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>
109 lines
3.1 KiB
TypeScript
109 lines
3.1 KiB
TypeScript
import {
|
|
OptionsWithUri
|
|
} from 'request';
|
|
|
|
import {
|
|
IExecuteFunctions,
|
|
ILoadOptionsFunctions,
|
|
} from 'n8n-core';
|
|
|
|
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 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,
|
|
method,
|
|
qs,
|
|
body,
|
|
uri: uri || `https://${credentials?.subdomain}.service-now.com/api${resource}`,
|
|
json: true,
|
|
};
|
|
if (!Object.keys(body).length) {
|
|
delete options.body;
|
|
}
|
|
|
|
if (Object.keys(option).length !== 0) {
|
|
Object.assign(options, option);
|
|
}
|
|
|
|
if (options.qs.limit) {
|
|
delete options.qs.limit;
|
|
}
|
|
|
|
try {
|
|
const credentialType = authenticationMethod === 'oAuth2' ? 'serviceNowOAuth2Api' : 'serviceNowBasicApi';
|
|
return await this.helpers.requestWithAuthentication.call(this, credentialType, options);
|
|
|
|
} catch (error) {
|
|
throw new NodeApiError(this.getNode(), (error as JsonObject));
|
|
}
|
|
}
|
|
|
|
export async function serviceNowRequestAllItems(this: IExecuteFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, query: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
|
|
|
|
const returnData: IDataObject[] = [];
|
|
let responseData;
|
|
|
|
const page = 100;
|
|
|
|
query.sysparm_limit = page;
|
|
|
|
responseData = await serviceNowApiRequest.call(this, method, resource, body, query, undefined, { resolveWithFullResponse: true });
|
|
returnData.push.apply(returnData, responseData.body.result);
|
|
|
|
const quantity = responseData.headers['x-total-count'];
|
|
const iterations = Math.round(quantity / page) + (quantity % page ? 1 : 0);
|
|
|
|
for (let iteration = 1; iteration < iterations; iteration++) {
|
|
query.sysparm_limit = page;
|
|
query.sysparm_offset = iteration * page;
|
|
responseData = await serviceNowApiRequest.call(this, method, resource, body, query, undefined, { resolveWithFullResponse: true });
|
|
|
|
returnData.push.apply(returnData, responseData.body.result);
|
|
}
|
|
|
|
return returnData;
|
|
}
|
|
|
|
|
|
export const mapEndpoint = (resource: string, operation: string) => {
|
|
const resourceEndpoint = new Map([
|
|
['tableRecord', 'sys_dictionary'],
|
|
['businessService', 'cmdb_ci_service'],
|
|
['configurationItems', 'cmdb_ci'],
|
|
['department', 'cmn_department'],
|
|
['dictionary', 'sys_dictionary'],
|
|
['incident', 'incident'],
|
|
['user', 'sys_user'],
|
|
['userGroup', 'sys_user_group'],
|
|
['userRole', 'sys_user_role'],
|
|
]);
|
|
return resourceEndpoint.get(resource);
|
|
};
|
|
|
|
export const sortData = (returnData: INodePropertyOptions[]): INodePropertyOptions[] => {
|
|
returnData.sort((a, b) => {
|
|
if (a.name < b.name) { return -1; }
|
|
if (a.name > b.name) { return 1; }
|
|
return 0;
|
|
});
|
|
return returnData;
|
|
};
|