mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-25 20:54:07 -08:00
7ce7285f7a
* Changes to types so that credentials can be always loaded from DB This first commit changes all return types from the execute functions and calls to get credentials to be async so we can use await. This is a first step as previously credentials were loaded in memory and always available. We will now be loading them from the DB which requires turning the whole call chain async. * Fix updated files * Removed unnecessary credential loading to improve performance * Fix typo * ⚡ Fix issue * Updated new nodes to load credentials async * ⚡ Remove not needed comment Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
171 lines
5.2 KiB
TypeScript
171 lines
5.2 KiB
TypeScript
import {
|
|
OptionsWithUrl,
|
|
} from 'request';
|
|
|
|
import {
|
|
IExecuteFunctions,
|
|
IExecuteSingleFunctions,
|
|
IHookFunctions,
|
|
ILoadOptionsFunctions,
|
|
} from 'n8n-core';
|
|
|
|
import {
|
|
IDataObject, NodeApiError, NodeOperationError,
|
|
} from 'n8n-workflow';
|
|
|
|
export async function mailchimpApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, endpoint: string, method: string, body: any = {}, qs: IDataObject = {} ,headers?: object): Promise<any> { // tslint:disable-line:no-any
|
|
const authenticationMethod = this.getNodeParameter('authentication', 0) as string;
|
|
|
|
const host = 'api.mailchimp.com/3.0';
|
|
|
|
const options: OptionsWithUrl = {
|
|
headers: {
|
|
'Accept': 'application/json',
|
|
},
|
|
method,
|
|
qs,
|
|
body,
|
|
url: ``,
|
|
json: true,
|
|
};
|
|
|
|
if (Object.keys(body).length === 0) {
|
|
delete options.body;
|
|
}
|
|
|
|
try {
|
|
if (authenticationMethod === 'apiKey') {
|
|
const credentials = await this.getCredentials('mailchimpApi');
|
|
|
|
if (credentials === undefined) {
|
|
throw new NodeOperationError(this.getNode(), 'No credentials got returned!');
|
|
}
|
|
|
|
options.headers = Object.assign({}, headers, { Authorization: `apikey ${credentials.apiKey}` });
|
|
|
|
if (!(credentials.apiKey as string).includes('-')) {
|
|
throw new NodeOperationError(this.getNode(), 'The API key is not valid!');
|
|
}
|
|
|
|
const datacenter = (credentials.apiKey as string).split('-').pop();
|
|
options.url = `https://${datacenter}.${host}${endpoint}`;
|
|
|
|
return await this.helpers.request!(options);
|
|
} else {
|
|
const credentials = await this.getCredentials('mailchimpOAuth2Api') as IDataObject;
|
|
|
|
const { api_endpoint } = await getMetadata.call(this, credentials.oauthTokenData as IDataObject);
|
|
|
|
options.url = `${api_endpoint}/3.0${endpoint}`;
|
|
//@ts-ignore
|
|
return await this.helpers.requestOAuth2!.call(this, 'mailchimpOAuth2Api', options, { tokenType: 'Bearer' });
|
|
}
|
|
} catch (error) {
|
|
throw new NodeApiError(this.getNode(), error);
|
|
}
|
|
}
|
|
|
|
export async function mailchimpApiRequestAllItems(this: IExecuteFunctions | ILoadOptionsFunctions, endpoint: string, method: string, propertyName: string, body: any = {}, query: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
|
|
|
|
const returnData: IDataObject[] = [];
|
|
|
|
let responseData;
|
|
|
|
query.offset = 0;
|
|
query.count = 500;
|
|
|
|
do {
|
|
responseData = await mailchimpApiRequest.call(this, endpoint, method, body, query);
|
|
returnData.push.apply(returnData, responseData[propertyName]);
|
|
query.offset += query.count;
|
|
} while (
|
|
responseData[propertyName] && responseData[propertyName].length !== 0
|
|
);
|
|
|
|
return returnData;
|
|
}
|
|
|
|
export function validateJSON(json: string | undefined): any { // tslint:disable-line:no-any
|
|
let result;
|
|
try {
|
|
result = JSON.parse(json!);
|
|
} catch (exception) {
|
|
result = '';
|
|
}
|
|
return result;
|
|
}
|
|
|
|
async function getMetadata(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, oauthTokenData: IDataObject) {
|
|
const credentials = await this.getCredentials('mailchimpOAuth2Api') as IDataObject;
|
|
const options: OptionsWithUrl = {
|
|
headers: {
|
|
'Accept': 'application/json',
|
|
'Authorization': `OAuth ${oauthTokenData.access_token}`,
|
|
},
|
|
method: 'GET',
|
|
url: credentials.metadataUrl as string,
|
|
json: true,
|
|
};
|
|
return this.helpers.request!(options);
|
|
}
|
|
|
|
export const campaignFieldsMetadata = [
|
|
'*',
|
|
'campaigns.id',
|
|
'campaigns.web_id',
|
|
'campaigns.type',
|
|
'campaigns.create_time',
|
|
'campaigns.archive_url',
|
|
'campaigns.long_archive_url',
|
|
'campaigns.status',
|
|
'campaigns.emails_sent',
|
|
'campaigns.send_time',
|
|
'campaigns.content_type',
|
|
'campaigns.needs_block_refresh',
|
|
'campaigns.resendable',
|
|
'campaigns.recipients',
|
|
'campaigns.recipients.list_id',
|
|
'campaigns.recipients.list_is_active',
|
|
'campaigns.recipients.list_name',
|
|
'campaigns.recipients.segment_text',
|
|
'campaigns.recipients.recipient_count',
|
|
'campaigns.settings',
|
|
'campaigns.settings.subject_line',
|
|
'campaigns.settings.preview_text',
|
|
'campaigns.settings.title',
|
|
'campaigns.settings.from_name',
|
|
'campaigns.settings.reply_to',
|
|
'campaigns.settings.use_conversation',
|
|
'campaigns.settings.to_name',
|
|
'campaigns.settings.folder_id',
|
|
'campaigns.settings.authenticate',
|
|
'campaigns.settings.auto_footer',
|
|
'campaigns.settings.inline_css',
|
|
'campaigns.settings.auto_tweet',
|
|
'campaigns.settings.fb_comments',
|
|
'campaigns.settings.timewarp',
|
|
'campaigns.settings.template_id',
|
|
'campaigns.settings.drag_and_drop',
|
|
'campaigns.tracking',
|
|
'campaigns.tracking.opens',
|
|
'campaigns.tracking.html_clicks',
|
|
'campaigns.tracking.text_clicks',
|
|
'campaigns.tracking.goal_tracking',
|
|
'campaigns.tracking.ecomm360',
|
|
'campaigns.tracking.google_analytics',
|
|
'campaigns.tracking.clicktale',
|
|
'campaigns.report_summary',
|
|
'campaigns.report_summary.opens',
|
|
'campaigns.report_summary.unique_opens',
|
|
'campaigns.report_summary.open_rate',
|
|
'campaigns.report_summary.clicks',
|
|
'campaigns.report_summary.subscriber_clicks',
|
|
'campaigns.report_summary.click_rate',
|
|
'campaigns.report_summary.click_rate.ecommerce',
|
|
'campaigns.report_summary.click_rate.ecommerce.total_orders',
|
|
'campaigns.report_summary.click_rate.ecommerce.total_spent',
|
|
'campaigns.report_summary.click_rate.ecommerce.total_revenue',
|
|
'campaigns.report_summary.delivery_status.enabled',
|
|
'campaigns._links',
|
|
];
|