UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

354 lines 14.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleDatesPresend = handleDatesPresend; exports.addUpdateMaskPresend = addUpdateMaskPresend; exports.handlePagination = handlePagination; exports.handleErrorsDeletePost = handleErrorsDeletePost; exports.handleErrorsGetPost = handleErrorsGetPost; exports.handleErrorsUpdatePost = handleErrorsUpdatePost; exports.handleErrorsDeleteReply = handleErrorsDeleteReply; exports.handleErrorsGetReview = handleErrorsGetReview; exports.handleErrorsReplyToReview = handleErrorsReplyToReview; exports.googleApiRequest = googleApiRequest; exports.searchAccounts = searchAccounts; exports.searchLocations = searchLocations; exports.searchReviews = searchReviews; exports.searchPosts = searchPosts; const n8n_workflow_1 = require("n8n-workflow"); const addOptName = 'additionalOptions'; const possibleRootProperties = ['localPosts', 'reviews']; const getAllParams = (execFns) => { const params = execFns.getNode().parameters; const additionalOptions = execFns.getNodeParameter(addOptName, {}); // Merge standard parameters with additional options from the node parameters return { ...params, ...additionalOptions }; }; /* Helper function to adjust date-time parameters for API requests */ async function handleDatesPresend(opts) { const params = getAllParams(this); const body = Object.assign({}, opts.body); const event = body.event ?? {}; if (!params.startDateTime && !params.startDate && !params.endDateTime && !params.endDate) { return opts; } const createDateTimeObject = (dateString) => { const date = new Date(dateString); return { date: { year: date.getUTCFullYear(), month: date.getUTCMonth() + 1, day: date.getUTCDate(), }, time: dateString.includes('T') ? { hours: date.getUTCHours(), minutes: date.getUTCMinutes(), seconds: date.getUTCSeconds(), nanos: 0, } : undefined, }; }; // Convert start and end date-time parameters if provided const startDateTime = params.startDateTime || params.startDate ? createDateTimeObject((params.startDateTime || params.startDate)) : null; const endDateTime = params.endDateTime || params.endDate ? createDateTimeObject((params.endDateTime || params.endDate)) : null; const schedule = { startDate: startDateTime?.date, endDate: endDateTime?.date, startTime: startDateTime?.time, endTime: endDateTime?.time, }; event.schedule = schedule; Object.assign(body, { event }); opts.body = body; return opts; } /* Helper function adding update mask to the request */ async function addUpdateMaskPresend(opts) { const additionalOptions = this.getNodeParameter('additionalOptions'); const propertyMapping = { postType: 'topicType', actionType: 'actionType', callToActionType: 'callToAction.actionType', url: 'callToAction.url', startDateTime: 'event.schedule.startDate,event.schedule.startTime', endDateTime: 'event.schedule.endDate,event.schedule.endTime', title: 'event.title', startDate: 'event.schedule.startDate', endDate: 'event.schedule.endDate', couponCode: 'offer.couponCode', redeemOnlineUrl: 'offer.redeemOnlineUrl', termsAndConditions: 'offer.termsAndConditions', }; if (Object.keys(additionalOptions).length) { const updateMask = Object.keys(additionalOptions) .map((key) => propertyMapping[key] || key) .join(','); opts.qs = { ...opts.qs, updateMask, }; } return opts; } /* Helper function to handle pagination */ async function handlePagination(resultOptions) { const aggregatedResult = []; let nextPageToken; const returnAll = this.getNodeParameter('returnAll'); let limit = 100; if (!returnAll) { limit = this.getNodeParameter('limit'); resultOptions.maxResults = limit; } resultOptions.paginate = true; do { if (nextPageToken) { resultOptions.options.qs = { ...resultOptions.options.qs, pageToken: nextPageToken }; } const responseData = await this.makeRoutingRequest(resultOptions); for (const page of responseData) { for (const prop of possibleRootProperties) { if (page.json[prop]) { const currentData = page.json[prop]; aggregatedResult.push(...currentData); } } if (!returnAll && aggregatedResult.length >= limit) { return aggregatedResult.slice(0, limit).map((item) => ({ json: item })); } nextPageToken = page.json.nextPageToken; } } while (nextPageToken); return aggregatedResult.map((item) => ({ json: item })); } /* Helper functions to handle errors */ async function handleErrorsDeletePost(data, response) { if (response.statusCode < 200 || response.statusCode >= 300) { const post = this.getNodeParameter('post', undefined); // Provide a better error message if (post && response.statusCode === 404) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The post you are deleting could not be found. Adjust the "post" parameter setting to delete the post correctly.'); } throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, { message: response.statusMessage, httpCode: response.statusCode.toString(), }); } return data; } async function handleErrorsGetPost(data, response) { if (response.statusCode < 200 || response.statusCode >= 300) { const post = this.getNodeParameter('post', undefined); // Provide a better error message if (post && response.statusCode === 404) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The post you are requesting could not be found. Adjust the "post" parameter setting to retrieve the post correctly.'); } throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, { message: response.statusMessage, httpCode: response.statusCode.toString(), }); } return data; } async function handleErrorsUpdatePost(data, response) { if (response.statusCode < 200 || response.statusCode >= 300) { const post = this.getNodeParameter('post'); const additionalOptions = this.getNodeParameter('additionalOptions'); // Provide a better error message if (post && response.statusCode === 404) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The post you are updating could not be found. Adjust the "post" parameter setting to update the post correctly.'); } // Do not throw an error if the user didn't set additional options (a hint will be shown) if (response.statusCode === 400 && Object.keys(additionalOptions).length === 0) { return [{ json: { success: true } }]; } throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, { message: response.statusMessage, httpCode: response.statusCode.toString(), }); } return data; } async function handleErrorsDeleteReply(data, response) { if (response.statusCode < 200 || response.statusCode >= 300) { const review = this.getNodeParameter('review', undefined); // Provide a better error message if (review && response.statusCode === 404) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The review you are deleting could not be found. Adjust the "review" parameter setting to update the review correctly.'); } throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, { message: response.statusMessage, httpCode: response.statusCode.toString(), }); } return data; } async function handleErrorsGetReview(data, response) { if (response.statusCode < 200 || response.statusCode >= 300) { const review = this.getNodeParameter('review', undefined); // Provide a better error message if (review && response.statusCode === 404) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The review you are requesting could not be found. Adjust the "review" parameter setting to update the review correctly.'); } throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, { message: response.statusMessage, httpCode: response.statusCode.toString(), }); } return data; } async function handleErrorsReplyToReview(data, response) { if (response.statusCode < 200 || response.statusCode >= 300) { const review = this.getNodeParameter('review', undefined); // Provide a better error message if (review && response.statusCode === 404) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The review you are replying to could not be found. Adjust the "review" parameter setting to reply to the review correctly.'); } throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, { message: response.statusMessage, httpCode: response.statusCode.toString(), }); } return data; } /* Helper function used in listSearch methods */ async function googleApiRequest(method, resource, body = {}, qs = {}, url) { const options = { headers: { 'Content-Type': 'application/json', }, method, body, qs, url: url ?? `https://mybusiness.googleapis.com/v4${resource}`, json: true, }; try { if (Object.keys(body).length === 0) { delete options.body; } return (await this.helpers.httpRequestWithAuthentication.call(this, 'googleBusinessProfileOAuth2Api', options)); } catch (error) { throw new n8n_workflow_1.NodeApiError(this.getNode(), error); } } /* listSearch methods */ async function searchAccounts(filter, paginationToken) { // Docs for this API call can be found here: // https://developers.google.com/my-business/reference/accountmanagement/rest/v1/accounts/list const query = {}; if (paginationToken) { query.pageToken = paginationToken; } const responseData = await googleApiRequest.call(this, 'GET', '', {}, { pageSize: 20, ...query, }, 'https://mybusinessaccountmanagement.googleapis.com/v1/accounts'); const accounts = responseData.accounts; const results = accounts .map((a) => ({ name: a.accountName, value: a.name, })) .filter((a) => !filter || a.name.toLowerCase().includes(filter.toLowerCase()) || a.value.toLowerCase().includes(filter.toLowerCase())) .sort((a, b) => { if (a.name.toLowerCase() < b.name.toLowerCase()) return -1; if (a.name.toLowerCase() > b.name.toLowerCase()) return 1; return 0; }); return { results, paginationToken: responseData.nextPageToken }; } async function searchLocations(filter, paginationToken) { // Docs for this API call can be found here: // https://developers.google.com/my-business/reference/businessinformation/rest/v1/accounts.locations/list const query = {}; if (paginationToken) { query.pageToken = paginationToken; } const account = this.getNodeParameter('account').value; const responseData = await googleApiRequest.call(this, 'GET', '', {}, { readMask: 'name', pageSize: 100, ...query, }, `https://mybusinessbusinessinformation.googleapis.com/v1/${account}/locations`); const locations = responseData.locations; const results = locations .map((a) => ({ name: a.name, value: a.name, })) .filter((a) => !filter || a.name.toLowerCase().includes(filter.toLowerCase())) .sort((a, b) => { if (a.name.toLowerCase() < b.name.toLowerCase()) return -1; if (a.name.toLowerCase() > b.name.toLowerCase()) return 1; return 0; }); return { results, paginationToken: responseData.nextPageToken }; } async function searchReviews(filter, paginationToken) { const query = {}; if (paginationToken) { query.pageToken = paginationToken; } const account = this.getNodeParameter('account').value; const location = this.getNodeParameter('location').value; const responseData = await googleApiRequest.call(this, 'GET', `/${account}/${location}/reviews`, {}, { pageSize: 50, ...query, }); const reviews = responseData.reviews; const results = reviews .map((a) => ({ name: a.comment, value: a.name, })) .filter((a) => !filter || a.name.toLowerCase().includes(filter.toLowerCase())) .sort((a, b) => { if (a.name.toLowerCase() < b.name.toLowerCase()) return -1; if (a.name.toLowerCase() > b.name.toLowerCase()) return 1; return 0; }); return { results, paginationToken: responseData.nextPageToken }; } async function searchPosts(filter, paginationToken) { const query = {}; if (paginationToken) { query.pageToken = paginationToken; } const account = this.getNodeParameter('account').value; const location = this.getNodeParameter('location').value; const responseData = await googleApiRequest.call(this, 'GET', `/${account}/${location}/localPosts`, {}, { pageSize: 100, ...query, }); const localPosts = responseData.localPosts; const results = localPosts .map((a) => ({ name: a.summary, value: a.name, })) .filter((a) => !filter || a.name.toLowerCase().includes(filter.toLowerCase())) .sort((a, b) => { if (a.name.toLowerCase() < b.name.toLowerCase()) return -1; if (a.name.toLowerCase() > b.name.toLowerCase()) return 1; return 0; }); return { results, paginationToken: responseData.nextPageToken }; } //# sourceMappingURL=GenericFunctions.js.map