UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

605 lines 32.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GmailV1 = void 0; const isEmpty_1 = __importDefault(require("lodash/isEmpty")); const n8n_workflow_1 = require("n8n-workflow"); const descriptions_1 = require("../../../../utils/descriptions"); const DraftDescription_1 = require("./DraftDescription"); const LabelDescription_1 = require("./LabelDescription"); const loadOptions_1 = require("./loadOptions"); const MessageDescription_1 = require("./MessageDescription"); const MessageLabelDescription_1 = require("./MessageLabelDescription"); const GenericFunctions_1 = require("../GenericFunctions"); const versionDescription = { displayName: 'Gmail', name: 'gmail', icon: 'file:gmail.svg', group: ['transform'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Consume the Gmail API', defaults: { name: 'Gmail', }, inputs: [n8n_workflow_1.NodeConnectionTypes.Main], outputs: [n8n_workflow_1.NodeConnectionTypes.Main], credentials: [ { name: 'googleApi', required: true, displayOptions: { show: { authentication: ['serviceAccount'], }, }, }, { name: 'gmailOAuth2', required: true, displayOptions: { show: { authentication: ['oAuth2'], }, }, }, ], properties: [ descriptions_1.oldVersionNotice, { displayName: 'Authentication', name: 'authentication', type: 'options', options: [ { // eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased name: 'OAuth2 (recommended)', value: 'oAuth2', }, { name: 'Service Account', value: 'serviceAccount', }, ], default: 'oAuth2', }, { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Draft', value: 'draft', }, { name: 'Label', value: 'label', }, { name: 'Message', value: 'message', }, { name: 'Message Label', value: 'messageLabel', }, ], default: 'draft', }, //------------------------------- // Draft Operations //------------------------------- ...DraftDescription_1.draftOperations, ...DraftDescription_1.draftFields, //------------------------------- // Label Operations //------------------------------- ...LabelDescription_1.labelOperations, ...LabelDescription_1.labelFields, //------------------------------- // Message Operations //------------------------------- ...MessageDescription_1.messageOperations, ...MessageDescription_1.messageFields, //------------------------------- // MessageLabel Operations //------------------------------- ...MessageLabelDescription_1.messageLabelOperations, ...MessageLabelDescription_1.messageLabelFields, //------------------------------- ], }; class GmailV1 { description; constructor(baseDescription) { this.description = { ...baseDescription, ...versionDescription, }; } methods = { loadOptions: { getLabels: loadOptions_1.getLabels, }, }; async execute() { const items = this.getInputData(); const returnData = []; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); let method = 'GET'; let body = {}; let qs = {}; let endpoint = ''; let responseData; for (let i = 0; i < items.length; i++) { try { if (resource === 'label') { if (operation === 'create') { //https://developers.google.com/gmail/api/v1/reference/users/labels/create const labelName = this.getNodeParameter('name', i); const labelListVisibility = this.getNodeParameter('labelListVisibility', i); const messageListVisibility = this.getNodeParameter('messageListVisibility', i); method = 'POST'; endpoint = '/gmail/v1/users/me/labels'; body = { labelListVisibility, messageListVisibility, name: labelName, }; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } if (operation === 'delete') { //https://developers.google.com/gmail/api/v1/reference/users/labels/delete const labelId = this.getNodeParameter('labelId', i); method = 'DELETE'; endpoint = `/gmail/v1/users/me/labels/${labelId}`; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); responseData = { success: true }; } if (operation === 'get') { // https://developers.google.com/gmail/api/v1/reference/users/labels/get const labelId = this.getNodeParameter('labelId', i); method = 'GET'; endpoint = `/gmail/v1/users/me/labels/${labelId}`; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); responseData = await GenericFunctions_1.googleApiRequest.call(this, 'GET', '/gmail/v1/users/me/labels', {}, qs); responseData = responseData.labels; if (!returnAll) { const limit = this.getNodeParameter('limit', i); responseData = responseData.splice(0, limit); } } } if (resource === 'messageLabel') { if (operation === 'remove') { //https://developers.google.com/gmail/api/v1/reference/users/messages/modify const messageID = this.getNodeParameter('messageId', i); const labelIds = this.getNodeParameter('labelIds', i); method = 'POST'; endpoint = `/gmail/v1/users/me/messages/${messageID}/modify`; body = { removeLabelIds: labelIds, }; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } if (operation === 'add') { // https://developers.google.com/gmail/api/v1/reference/users/messages/modify const messageID = this.getNodeParameter('messageId', i); const labelIds = this.getNodeParameter('labelIds', i); method = 'POST'; endpoint = `/gmail/v1/users/me/messages/${messageID}/modify`; body = { addLabelIds: labelIds, }; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } } if (resource === 'message') { if (operation === 'send') { // https://developers.google.com/gmail/api/v1/reference/users/messages/send const additionalFields = this.getNodeParameter('additionalFields', i); let toStr = ''; let ccStr = ''; let bccStr = ''; let attachmentsList = []; const toList = this.getNodeParameter('toList', i); toList.forEach((email) => { toStr += `<${email}>, `; }); if (additionalFields.ccList) { const ccList = additionalFields.ccList; ccList.forEach((email) => { ccStr += `<${email}>, `; }); } if (additionalFields.bccList) { const bccList = additionalFields.bccList; bccList.forEach((email) => { bccStr += `<${email}>, `; }); } if (additionalFields.attachmentsUi) { const attachmentsUi = additionalFields.attachmentsUi; const attachmentsBinary = []; if (!(0, isEmpty_1.default)(attachmentsUi)) { if (attachmentsUi.hasOwnProperty('attachmentsBinary') && !(0, isEmpty_1.default)(attachmentsUi.attachmentsBinary) && items[i].binary) { for (const { property } of attachmentsUi.attachmentsBinary) { for (const binaryProperty of property.split(',')) { const binaryData = this.helpers.assertBinaryData(i, binaryProperty); const binaryDataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); attachmentsBinary.push({ name: binaryData.fileName || 'unknown', content: binaryDataBuffer, type: binaryData.mimeType, }); } } } qs = { userId: 'me', uploadType: 'media', }; attachmentsList = attachmentsBinary; } } const email = { from: additionalFields.senderName || '', to: toStr, cc: ccStr, bcc: bccStr, subject: this.getNodeParameter('subject', i), body: this.getNodeParameter('message', i), attachments: attachmentsList, }; if (this.getNodeParameter('includeHtml', i, false)) { email.htmlBody = this.getNodeParameter('htmlMessage', i); } endpoint = '/gmail/v1/users/me/messages/send'; method = 'POST'; body = { raw: await (0, GenericFunctions_1.encodeEmail)(email), }; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } if (operation === 'reply') { const id = this.getNodeParameter('messageId', i); const additionalFields = this.getNodeParameter('additionalFields', i); let toStr = ''; let ccStr = ''; let bccStr = ''; let attachmentsList = []; const toList = this.getNodeParameter('toList', i); toList.forEach((email) => { toStr += `<${email}>, `; }); if (additionalFields.ccList) { const ccList = additionalFields.ccList; ccList.forEach((email) => { ccStr += `<${email}>, `; }); } if (additionalFields.bccList) { const bccList = additionalFields.bccList; bccList.forEach((email) => { bccStr += `<${email}>, `; }); } if (additionalFields.attachmentsUi) { const attachmentsUi = additionalFields.attachmentsUi; const attachmentsBinary = []; if (!(0, isEmpty_1.default)(attachmentsUi)) { if (attachmentsUi.hasOwnProperty('attachmentsBinary') && !(0, isEmpty_1.default)(attachmentsUi.attachmentsBinary) && items[i].binary) { for (const { property } of attachmentsUi.attachmentsBinary) { for (const binaryProperty of property.split(',')) { const binaryData = this.helpers.assertBinaryData(i, binaryProperty); const binaryDataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); attachmentsBinary.push({ name: binaryData.fileName || 'unknown', content: binaryDataBuffer, type: binaryData.mimeType, }); } } } qs = { userId: 'me', uploadType: 'media', }; attachmentsList = attachmentsBinary; } } endpoint = `/gmail/v1/users/me/messages/${id}`; qs.format = 'metadata'; const { payload } = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); if (toStr === '') { for (const header of payload.headers) { if (header.name === 'From') { toStr = `<${(0, GenericFunctions_1.extractEmail)(header.value)}>,`; break; } } } const subject = payload.headers.filter((data) => data.name === 'Subject')[0]?.value || ''; const references = payload.headers.filter((data) => data.name === 'References')[0]?.value || ''; const email = { from: additionalFields.senderName || '', to: toStr, cc: ccStr, bcc: bccStr, subject, body: this.getNodeParameter('message', i), attachments: attachmentsList, }; if (this.getNodeParameter('includeHtml', i, false)) { email.htmlBody = this.getNodeParameter('htmlMessage', i); } endpoint = '/gmail/v1/users/me/messages/send'; method = 'POST'; email.inReplyTo = id; email.reference = references; body = { raw: await (0, GenericFunctions_1.encodeEmail)(email), threadId: this.getNodeParameter('threadId', i), }; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } if (operation === 'get') { //https://developers.google.com/gmail/api/v1/reference/users/messages/get method = 'GET'; const id = this.getNodeParameter('messageId', i); const additionalFields = this.getNodeParameter('additionalFields', i); const format = additionalFields.format || 'resolved'; if (format === 'resolved') { qs.format = 'raw'; } else { qs.format = format; } endpoint = `/gmail/v1/users/me/messages/${id}`; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); let nodeExecutionData; if (format === 'resolved') { const dataPropertyNameDownload = additionalFields.dataPropertyAttachmentsPrefixName || 'attachment_'; nodeExecutionData = await GenericFunctions_1.parseRawEmail.call(this, responseData, dataPropertyNameDownload); } else { nodeExecutionData = { json: responseData, }; } responseData = nodeExecutionData; } if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); const additionalFields = this.getNodeParameter('additionalFields', i); Object.assign(qs, additionalFields); if (qs.labelIds) { if (qs.labelIds == '') { delete qs.labelIds; } else { qs.labelIds = qs.labelIds; } } if (returnAll) { responseData = await GenericFunctions_1.googleApiRequestAllItems.call(this, 'messages', 'GET', '/gmail/v1/users/me/messages', {}, qs); } else { qs.maxResults = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.googleApiRequest.call(this, 'GET', '/gmail/v1/users/me/messages', {}, qs); responseData = responseData.messages; } if (responseData === undefined) { responseData = []; } const format = additionalFields.format || 'resolved'; if (format !== 'ids') { if (format === 'resolved') { qs.format = 'raw'; } else { qs.format = format; } for (let index = 0; index < responseData.length; index++) { responseData[index] = await GenericFunctions_1.googleApiRequest.call(this, 'GET', `/gmail/v1/users/me/messages/${responseData[index].id}`, body, qs); if (format === 'resolved') { const dataPropertyNameDownload = additionalFields.dataPropertyAttachmentsPrefixName || 'attachment_'; responseData[index] = await GenericFunctions_1.parseRawEmail.call(this, responseData[index], dataPropertyNameDownload); } } } if (format !== 'resolved') { responseData = this.helpers.returnJsonArray(responseData); } } if (operation === 'delete') { // https://developers.google.com/gmail/api/v1/reference/users/messages/delete method = 'DELETE'; const id = this.getNodeParameter('messageId', i); endpoint = `/gmail/v1/users/me/messages/${id}`; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); responseData = { success: true }; } } if (resource === 'draft') { if (operation === 'create') { // https://developers.google.com/gmail/api/v1/reference/users/drafts/create const additionalFields = this.getNodeParameter('additionalFields', i); let toStr = ''; let ccStr = ''; let bccStr = ''; let attachmentsList = []; if (additionalFields.toList) { const toList = additionalFields.toList; toList.forEach((email) => { toStr += `<${email}>, `; }); } if (additionalFields.ccList) { const ccList = additionalFields.ccList; ccList.forEach((email) => { ccStr += `<${email}>, `; }); } if (additionalFields.bccList) { const bccList = additionalFields.bccList; bccList.forEach((email) => { bccStr += `<${email}>, `; }); } if (additionalFields.attachmentsUi) { const attachmentsUi = additionalFields.attachmentsUi; const attachmentsBinary = []; if (!(0, isEmpty_1.default)(attachmentsUi)) { if (!(0, isEmpty_1.default)(attachmentsUi)) { if (attachmentsUi.hasOwnProperty('attachmentsBinary') && !(0, isEmpty_1.default)(attachmentsUi.attachmentsBinary) && items[i].binary) { for (const { property } of attachmentsUi.attachmentsBinary) { for (const binaryProperty of property.split(',')) { const binaryData = this.helpers.assertBinaryData(i, binaryProperty); const binaryDataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryProperty); attachmentsBinary.push({ name: binaryData.fileName || 'unknown', content: binaryDataBuffer, type: binaryData.mimeType, }); } } } } qs = { userId: 'me', uploadType: 'media', }; attachmentsList = attachmentsBinary; } } const email = { from: additionalFields.senderName || '', to: toStr, cc: ccStr, bcc: bccStr, subject: this.getNodeParameter('subject', i), body: this.getNodeParameter('message', i), attachments: attachmentsList, }; if (this.getNodeParameter('includeHtml', i, false)) { email.htmlBody = this.getNodeParameter('htmlMessage', i); } endpoint = '/gmail/v1/users/me/drafts'; method = 'POST'; body = { message: { raw: await (0, GenericFunctions_1.encodeEmail)(email), }, }; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); } if (operation === 'get') { // https://developers.google.com/gmail/api/v1/reference/users/drafts/get method = 'GET'; const id = this.getNodeParameter('messageId', i); const additionalFields = this.getNodeParameter('additionalFields', i); const format = additionalFields.format || 'resolved'; if (format === 'resolved') { qs.format = 'raw'; } else { qs.format = format; } endpoint = `/gmail/v1/users/me/drafts/${id}`; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); const binaryData = {}; let nodeExecutionData; if (format === 'resolved') { const dataPropertyNameDownload = additionalFields.dataPropertyAttachmentsPrefixName || 'attachment_'; nodeExecutionData = await GenericFunctions_1.parseRawEmail.call(this, responseData.message, dataPropertyNameDownload); // Add the draft-id nodeExecutionData.json.messageId = nodeExecutionData.json.id; nodeExecutionData.json.id = responseData.id; } else { nodeExecutionData = { json: responseData, binary: Object.keys(binaryData).length ? binaryData : undefined, }; } responseData = nodeExecutionData; } if (operation === 'delete') { // https://developers.google.com/gmail/api/v1/reference/users/drafts/delete method = 'DELETE'; const id = this.getNodeParameter('messageId', i); endpoint = `/gmail/v1/users/me/drafts/${id}`; responseData = await GenericFunctions_1.googleApiRequest.call(this, method, endpoint, body, qs); responseData = { success: true }; } if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i); const additionalFields = this.getNodeParameter('additionalFields', i); Object.assign(qs, additionalFields); if (returnAll) { responseData = await GenericFunctions_1.googleApiRequestAllItems.call(this, 'drafts', 'GET', '/gmail/v1/users/me/drafts', {}, qs); } else { qs.maxResults = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.googleApiRequest.call(this, 'GET', '/gmail/v1/users/me/drafts', {}, qs); responseData = responseData.drafts; } if (responseData === undefined) { responseData = []; } const format = additionalFields.format || 'resolved'; if (format !== 'ids') { if (format === 'resolved') { qs.format = 'raw'; } else { qs.format = format; } for (let index = 0; index < responseData.length; index++) { responseData[index] = await GenericFunctions_1.googleApiRequest.call(this, 'GET', `/gmail/v1/users/me/drafts/${responseData[index].id}`, body, qs); if (format === 'resolved') { const dataPropertyNameDownload = additionalFields.dataPropertyAttachmentsPrefixName || 'attachment_'; const id = responseData[index].id; responseData[index] = await GenericFunctions_1.parseRawEmail.call(this, responseData[index].message, dataPropertyNameDownload); // Add the draft-id responseData[index].json.messageId = responseData[index].json.id; responseData[index].json.id = id; } } } if (format !== 'resolved') { responseData = this.helpers.returnJsonArray(responseData); } } } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { returnData.push({ json: { error: error.message } }); continue; } throw error; } } return [returnData]; } } exports.GmailV1 = GmailV1; //# sourceMappingURL=GmailV1.node.js.map