UNPKG

n8n-nodes-docuseal

Version:

Manage DocuSeal documents, templates, and submissions within n8n workflows.

599 lines 34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DocusealApi = void 0; const n8n_workflow_1 = require("n8n-workflow"); const GenericFunctions_1 = require("./GenericFunctions"); const TemplateDescription_1 = require("./TemplateDescription"); const SubmissionDescription_1 = require("./SubmissionDescription"); const SubmitterDescription_1 = require("./SubmitterDescription"); const FormDescription_1 = require("./FormDescription"); const AiToolDescription_1 = require("./AiToolDescription"); class DocusealApi { constructor() { Object.defineProperty(this, "description", { enumerable: true, configurable: true, writable: true, value: { displayName: 'DocuSeal', name: 'docusealApi', icon: 'file:docuseal.svg', group: ['transform'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Create documents, manage templates, and handle submissions with DocuSeal', defaults: { name: 'DocuSeal', }, inputs: [{ type: 'main' }], outputs: [{ type: 'main' }], usableAsTool: true, credentials: [ { name: 'docusealApi', required: true, }, ], properties: [ { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'AI Tool', value: 'aiTool', description: 'Generate documents using AI', }, { name: 'Form', value: 'form', description: 'Work with form events', }, { name: 'Submission', value: 'submission', description: 'Create and manage document submissions', }, { name: 'Submitter', value: 'submitter', description: 'Manage submitters and their data', }, { name: 'Template', value: 'template', description: 'Create and manage document templates', }, ], default: 'submission', }, ...AiToolDescription_1.aiToolOperations, ...AiToolDescription_1.aiToolFields, ...TemplateDescription_1.templateOperations, ...TemplateDescription_1.templateFields, ...SubmissionDescription_1.submissionOperations, ...SubmissionDescription_1.submissionFields, ...SubmitterDescription_1.submitterOperations, ...SubmitterDescription_1.submitterFields, ...FormDescription_1.formOperations, ...FormDescription_1.formFields, ], } }); Object.defineProperty(this, "methods", { enumerable: true, configurable: true, writable: true, value: { loadOptions: { async getTemplates() { try { return await GenericFunctions_1.getTemplates.call(this); } catch (error) { return []; } }, }, } }); } async execute() { const items = this.getInputData(); const returnData = []; let responseData; for (let i = 0; i < items.length; i++) { try { const resource = this.getNodeParameter('resource', i); const operation = this.getNodeParameter('operation', i); if (resource === 'aiTool') { if (operation === 'generateDocument') { const documentType = this.getNodeParameter('documentType', i); const description = this.getNodeParameter('description', i); const additionalOptions = this.getNodeParameter('additionalOptions', i, {}); const body = { type: documentType, description, }; if (additionalOptions.language) { body.language = additionalOptions.language; } if (additionalOptions.style) { body.style = additionalOptions.style; } if (additionalOptions.fields) { const fieldsString = additionalOptions.fields; if (fieldsString.trim()) { body.fields = fieldsString .split(',') .map((field) => field.trim()) .filter((field) => field.length > 0); } } try { responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/ai/documents', body); } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to generate document with AI: ${error.message}`, { itemIndex: i }); } } } if (resource === 'template') { if (operation === 'get') { const templateId = this.getNodeParameter('templateId', i); responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', `/templates/${templateId}`); } else if (operation === 'getMany') { const filters = this.getNodeParameter('filters', i, {}); const limit = this.getNodeParameter('limit', i); filters.limit = limit; try { responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', '/templates', {}, filters); if (responseData && typeof responseData === 'object' && 'data' in responseData && Array.isArray(responseData.data)) { responseData = responseData.data; } else if (!Array.isArray(responseData)) { responseData = []; } if (!Array.isArray(responseData)) { responseData = []; } } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to retrieve templates: ${error.message}`, { itemIndex: i }); } } else if (operation === 'createFromPdf') { const name = this.getNodeParameter('name', i); const pdfSource = this.getNodeParameter('pdfSource', i); const additionalFields = this.getNodeParameter('additionalFields', i, {}); const formData = { name, }; if (pdfSource === 'binary') { const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i); const binaryData = await GenericFunctions_1.prepareBinaryData.call(this, binaryPropertyName, i); formData.document = binaryData; } else { const fileUrl = this.getNodeParameter('fileUrl', i); const urlValidation = (0, GenericFunctions_1.validateUrl)(fileUrl); if (!urlValidation.isValid) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid file URL: ${urlValidation.message}`, { itemIndex: i, }); } formData.document_url = fileUrl; } if (additionalFields.external_id) { formData.external_id = additionalFields.external_id; } if (additionalFields.folder_name) { formData.folder_name = additionalFields.folder_name; } if (additionalFields.fields) { const fieldsData = additionalFields.fields; if (fieldsData.field) { formData.fields = fieldsData.field; } } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/templates/pdf', {}, {}, { formData }); } else if (operation === 'createFromDocx') { const name = this.getNodeParameter('name', i); const docxSource = this.getNodeParameter('docxSource', i); const additionalFields = this.getNodeParameter('additionalFields', i, {}); const formData = { name, }; if (docxSource === 'binary') { const binaryPropertyName = this.getNodeParameter('binaryPropertyNameDocx', i); const binaryData = await GenericFunctions_1.prepareBinaryData.call(this, binaryPropertyName, i); formData.document = binaryData; } else { const fileUrl = this.getNodeParameter('fileUrlDocx', i); const urlValidation = (0, GenericFunctions_1.validateUrl)(fileUrl); if (!urlValidation.isValid) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid file URL: ${urlValidation.message}`, { itemIndex: i, }); } formData.document_url = fileUrl; } if (additionalFields.external_id) { formData.external_id = additionalFields.external_id; } if (additionalFields.folder_name) { formData.folder_name = additionalFields.folder_name; } if (additionalFields.fields) { const fieldsData = additionalFields.fields; if (fieldsData.field) { formData.fields = fieldsData.field; } } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/templates/docx', {}, {}, { formData }); } else if (operation === 'createFromHtml') { const name = this.getNodeParameter('name', i); const htmlContent = this.getNodeParameter('htmlContent', i); const additionalFields = this.getNodeParameter('additionalFields', i, {}); const body = { name, html: htmlContent, }; if (additionalFields.external_id) { body.external_id = additionalFields.external_id; } if (additionalFields.folder_name) { body.folder_name = additionalFields.folder_name; } if (additionalFields.fields) { const fieldsData = additionalFields.fields; if (fieldsData.field) { body.fields = fieldsData.field; } } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/templates/html', body); } else if (operation === 'clone') { const templateId = this.getNodeParameter('templateId', i); const name = this.getNodeParameter('name', i); const additionalFields = this.getNodeParameter('additionalFields', i, {}); const body = { name, }; if (additionalFields.external_id) { body.external_id = additionalFields.external_id; } if (additionalFields.folder_name) { body.folder_name = additionalFields.folder_name; } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', `/templates/${templateId}/clone`, body); } else if (operation === 'merge') { const templateIds = this.getNodeParameter('templateIds', i) .split(',') .map((id) => parseInt(id.trim())) .filter((id) => !isNaN(id)); const name = this.getNodeParameter('mergedName', i); const body = { template_ids: templateIds, name, }; responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/templates/merge', body); } else if (operation === 'update') { const templateId = this.getNodeParameter('templateId', i); const updateFields = this.getNodeParameter('updateFields', i, {}); if (Object.keys(updateFields).length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'At least one field must be updated', { itemIndex: i, }); } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'PUT', `/templates/${templateId}`, updateFields); } else if (operation === 'updateDocuments') { const templateId = this.getNodeParameter('templateId', i); const documentsSource = this.getNodeParameter('documentsSource', i); const formData = {}; if (documentsSource === 'binary') { const binaryProperties = this.getNodeParameter('binaryProperties', i) .split(',') .map((prop) => prop.trim()); for (const [index, propertyName] of binaryProperties.entries()) { const binaryData = await GenericFunctions_1.prepareBinaryData.call(this, propertyName, i); formData[`documents[${index}]`] = binaryData; } } else { const fileUrls = this.getNodeParameter('fileUrls', i) .split(',') .map((url) => url.trim()) .filter((url) => url.length > 0); for (const url of fileUrls) { const urlValidation = (0, GenericFunctions_1.validateUrl)(url); if (!urlValidation.isValid) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid file URL '${url}': ${urlValidation.message}`, { itemIndex: i, }); } } fileUrls.forEach((url, index) => { formData[`document_urls[${index}]`] = url; }); } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'PUT', `/templates/${templateId}/documents`, {}, {}, { formData }); } else if (operation === 'archive') { const templateId = this.getNodeParameter('templateId', i); responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'DELETE', `/templates/${templateId}`); } } else if (resource === 'submission') { if (operation === 'get') { const submissionId = this.getNodeParameter('submissionId', i); responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', `/submissions/${submissionId}`); } else if (operation === 'getDocuments') { const submissionId = this.getNodeParameter('submissionId', i); responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', `/submissions/${submissionId}/documents`); } else if (operation === 'getMany') { const filters = this.getNodeParameter('filters', i, {}); if (filters.status && Array.isArray(filters.status)) { filters.status = filters.status.join(','); } const limit = this.getNodeParameter('limit', i); filters.limit = limit; try { responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', '/submissions', {}, filters); if (responseData && typeof responseData === 'object' && 'data' in responseData && Array.isArray(responseData.data)) { responseData = responseData.data; } else if (!Array.isArray(responseData)) { responseData = []; } } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to retrieve submissions: ${error.message}`, { itemIndex: i }); } } else if (operation === 'create') { const templateId = this.getNodeParameter('templateId', i); const submittersData = this.getNodeParameter('submitters', i); const additionalOptions = this.getNodeParameter('additionalOptions', i, {}); const submitters = (0, GenericFunctions_1.buildSubmittersArray)(submittersData); if (submitters.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'At least one submitter is required', { itemIndex: i, }); } let values = {}; try { const fieldValuesMode = this.getNodeParameter('fieldValuesMode', i, 'individual'); const fieldValues = this.getNodeParameter('fieldValues', i, {}); const fieldValuesJson = this.getNodeParameter('fieldValuesJson', i, '{}'); const fieldParams = { fieldValuesMode, fieldValues, fieldValuesJson, }; values = (0, GenericFunctions_1.buildFieldValues)(fieldParams); } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to build field values: ${error.message}`, { itemIndex: i }); } const body = { template_id: templateId, submitters, }; if (Object.keys(values).length > 0) { body.values = values; } const preferences = {}; if (additionalOptions.bcc_completed) { preferences.bcc_completed = additionalOptions.bcc_completed; } if (additionalOptions.reply_to) { preferences.reply_to = additionalOptions.reply_to; } if (Object.keys(preferences).length > 0) { body.preferences = preferences; } if (additionalOptions.completed_redirect_url) { body.completed_redirect_url = additionalOptions.completed_redirect_url; } if (additionalOptions.expire_at) { body.expire_at = (0, GenericFunctions_1.formatDate)(additionalOptions.expire_at); } if (additionalOptions.external_id) { body.external_id = additionalOptions.external_id; } if (additionalOptions.message) { const messageData = additionalOptions.message; if (messageData.messageFields) { body.message = messageData.messageFields; } } if (additionalOptions.metadata) { body.metadata = (0, GenericFunctions_1.parseJsonInput)(additionalOptions.metadata); } if (additionalOptions.order) { body.order = additionalOptions.order; } if (additionalOptions.send_email !== undefined) { body.send_email = additionalOptions.send_email; } if (additionalOptions.send_sms !== undefined) { body.send_sms = additionalOptions.send_sms; } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/submissions', body); } else if (operation === 'createFromPdf') { const pdfSource = this.getNodeParameter('pdfSource', i); const submittersData = this.getNodeParameter('submitters', i); const additionalOptions = this.getNodeParameter('additionalOptions', i, {}); const submitters = (0, GenericFunctions_1.buildSubmittersArray)(submittersData); if (submitters.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'At least one submitter is required', { itemIndex: i, }); } const formData = { submitters: JSON.stringify(submitters), }; if (pdfSource === 'binary') { const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i); const binaryData = await GenericFunctions_1.prepareBinaryData.call(this, binaryPropertyName, i); formData.document = binaryData; } else { const fileUrl = this.getNodeParameter('fileUrl', i); const urlValidation = (0, GenericFunctions_1.validateUrl)(fileUrl); if (!urlValidation.isValid) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid file URL: ${urlValidation.message}`, { itemIndex: i, }); } formData.document_url = fileUrl; } if (additionalOptions.external_id) { formData.external_id = additionalOptions.external_id; } if (additionalOptions.send_email !== undefined && additionalOptions.send_email !== null) { formData.send_email = additionalOptions.send_email.toString(); } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/submissions/pdf', {}, {}, { formData }); } else if (operation === 'createFromHtml') { const htmlContent = this.getNodeParameter('htmlContent', i); const submittersData = this.getNodeParameter('submitters', i); const additionalOptions = this.getNodeParameter('additionalOptions', i, {}); const submitters = (0, GenericFunctions_1.buildSubmittersArray)(submittersData); if (submitters.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'At least one submitter is required', { itemIndex: i, }); } const body = { html: htmlContent, submitters, }; if (additionalOptions.external_id) { body.external_id = additionalOptions.external_id; } if (additionalOptions.send_email !== undefined) { body.send_email = additionalOptions.send_email; } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'POST', '/submissions/html', body); } else if (operation === 'archive') { const submissionId = this.getNodeParameter('submissionId', i); responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'DELETE', `/submissions/${submissionId}`); } } else if (resource === 'submitter') { if (operation === 'get') { const submitterId = this.getNodeParameter('submitterId', i); responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', `/submitters/${submitterId}`); } else if (operation === 'getMany') { const filters = this.getNodeParameter('filters', i, {}); if (filters.completed_after) { filters.completed_after = (0, GenericFunctions_1.formatDate)(filters.completed_after); } if (filters.completed_before) { filters.completed_before = (0, GenericFunctions_1.formatDate)(filters.completed_before); } const limit = this.getNodeParameter('limit', i); filters.limit = limit; try { responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', '/submitters', {}, filters); if (responseData && typeof responseData === 'object' && 'data' in responseData && Array.isArray(responseData.data)) { responseData = responseData.data; } else if (!Array.isArray(responseData)) { responseData = []; } } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to retrieve submitters: ${error.message}`, { itemIndex: i }); } } else if (operation === 'update') { const submitterId = this.getNodeParameter('submitterId', i); const updateFields = this.getNodeParameter('updateFields', i, {}); const fieldsData = this.getNodeParameter('fields', i, {}); const valuesData = this.getNodeParameter('values', i, {}); const body = {}; Object.assign(body, updateFields); if (body.message && typeof body.message === 'object') { const messageData = body.message; if (messageData.messageFields) { body.message = messageData.messageFields; } } if (fieldsData.field) { body.fields = fieldsData.field; } if (valuesData.value) { const values = {}; const valueItems = Array.isArray(valuesData.value) ? valuesData.value : [valuesData.value]; valueItems.forEach((item) => { if (item.name && item.value !== undefined) { values[item.name] = item.value; } }); body.values = values; } if (Object.keys(body).length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'At least one field must be updated', { itemIndex: i, }); } responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'PUT', `/submitters/${submitterId}`, body); } } else if (resource === 'form') { const submitterId = this.getNodeParameter('submitterId', i); if (operation === 'getStarted') { responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', `/submitters/${submitterId}/form_started`); } else if (operation === 'getViewed') { responseData = await GenericFunctions_1.docusealApiRequest.call(this, 'GET', `/submitters/${submitterId}/form_viewed`); } } 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 instanceof Error ? error.message : String(error) }, }); continue; } throw error; } } return [returnData]; } } exports.DocusealApi = DocusealApi; //# sourceMappingURL=DocusealApi.node.js.map