UNPKG

n8n-nodes-easy-appointments

Version:
289 lines 13.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EasyAppointmentsTrigger = void 0; const n8n_workflow_1 = require("n8n-workflow"); const GenericFunctions_1 = require("./GenericFunctions"); class EasyAppointmentsTrigger { constructor() { this.description = { displayName: 'Easy!Appointments Trigger', name: 'easyAppointmentsTrigger', icon: 'file:icon.svg', group: ['trigger'], version: 1, subtitle: '={{$parameter["event"]}}', description: 'Handle Easy!Appointments webhook events', defaults: { name: 'Easy!Appointments Trigger', }, inputs: [], outputs: ['main'], credentials: [ { name: 'easyAppointmentsApi', required: true, }, ], webhooks: [ { name: 'default', httpMethod: 'POST', responseMode: 'onReceived', path: 'webhook', responseData: 'noData', }, ], properties: [ { displayName: 'Event', name: 'event', type: 'options', options: [ { name: 'Admin Created/Updated', value: 'admin_save', description: 'Triggered when an admin is created or updated', }, { name: 'Admin Deleted', value: 'admin_delete', description: 'Triggered when an admin is deleted', }, { name: 'Appointment Created/Updated', value: 'appointment_save', description: 'Triggered when an appointment is created or updated', }, { name: 'Appointment Deleted', value: 'appointment_delete', description: 'Triggered when an appointment is deleted', }, { name: 'Blocked Period Created/Updated', value: 'blocked_period_save', description: 'Triggered when a blocked period is created or updated', }, { name: 'Blocked Period Deleted', value: 'blocked_period_delete', description: 'Triggered when a blocked period is deleted', }, { name: 'Customer Created/Updated', value: 'customer_save', description: 'Triggered when a customer is created or updated', }, { name: 'Customer Deleted', value: 'customer_delete', description: 'Triggered when a customer is deleted', }, { name: 'Provider Created/Updated', value: 'provider_save', description: 'Triggered when a provider is created or updated', }, { name: 'Provider Deleted', value: 'provider_delete', description: 'Triggered when a provider is deleted', }, { name: 'Secretary Created/Updated', value: 'secretary_save', description: 'Triggered when a secretary is created or updated', }, { name: 'Secretary Deleted', value: 'secretary_delete', description: 'Triggered when a secretary is deleted', }, { name: 'Service Category Created/Updated', value: 'service_category_save', description: 'Triggered when a service category is created or updated', }, { name: 'Service Category Deleted', value: 'service_category_delete', description: 'Triggered when a service category is deleted', }, { name: 'Service Created/Updated', value: 'service_save', description: 'Triggered when a service is created or updated', }, { name: 'Service Deleted', value: 'service_delete', description: 'Triggered when a service is deleted', }, { name: 'Unavailability Created/Updated', value: 'unavailability_save', description: 'Triggered when an unavailability is created or updated', }, { name: 'Unavailability Deleted', value: 'unavailability_delete', description: 'Triggered when an unavailability is deleted', }, ], default: 'appointment_save', required: true, description: 'The event to listen to', }, { displayName: 'Webhook Name', name: 'webhookName', type: 'string', default: 'n8n-hook', required: true, description: 'The name of the webhook in Easy!Appointments', }, { displayName: 'Secret Token', name: 'secretToken', type: 'string', typeOptions: { password: true, }, default: '', description: 'The secret token to validate webhook requests', }, { displayName: 'Verify SSL', name: 'verifySSL', type: 'boolean', default: true, description: 'Whether to verify SSL certificates for the webhook URL', }, ], }; this.webhookMethods = { default: { async checkExists() { const webhookUrl = this.getNodeWebhookUrl('default'); const webhookName = this.getNodeParameter('webhookName'); this.logger.debug('Checking if Easy!Appointments webhook exists', { webhookName, webhookUrl, }); try { const webhooks = await GenericFunctions_1.easyAppointmentsApiRequestAllItems.call(this, 'GET', '/webhooks'); this.logger.debug('Retrieved existing webhooks', { count: webhooks.length, webhooks, }); for (const webhook of webhooks) { if (webhook.name === webhookName && webhook.url === webhookUrl) { const webhookData = this.getWorkflowStaticData('node'); webhookData.webhookId = webhook.id; this.logger.debug('Found existing webhook', { webhookId: webhook.id }); return true; } } this.logger.debug('No matching webhook found'); } catch (error) { this.logger.error('Error checking for existing webhooks', { error }); if (error.response && error.response.status === 404) { return false; } throw error; } return false; }, async create() { const webhookUrl = this.getNodeWebhookUrl('default'); const webhookName = this.getNodeParameter('webhookName'); const event = this.getNodeParameter('event'); const secretToken = this.getNodeParameter('secretToken'); const verifySSL = this.getNodeParameter('verifySSL'); const body = { name: webhookName + ' - ' + event, url: webhookUrl, actions: event, secretToken, isSslVerified: verifySSL, }; this.logger.debug('Creating Easy!Appointments webhook', { webhookName, webhookUrl, event, body, }); try { const webhook = await GenericFunctions_1.easyAppointmentsApiRequest.call(this, 'POST', '/webhooks', body); if (webhook.id === undefined) { this.logger.error('Webhook creation failed - no ID returned', { webhook }); throw new n8n_workflow_1.NodeApiError(this.getNode(), webhook, { message: 'Webhook creation failed - no ID returned', }); } const webhookData = this.getWorkflowStaticData('node'); webhookData.webhookId = webhook.id; this.logger.debug('Webhook created successfully', { webhookId: webhook.id }); return true; } catch (error) { this.logger.error('Error creating webhook', { error }); throw error; } }, async delete() { const webhookData = this.getWorkflowStaticData('node'); if (webhookData.webhookId !== undefined) { this.logger.debug('Deleting Easy!Appointments webhook', { webhookId: webhookData.webhookId }); try { await GenericFunctions_1.easyAppointmentsApiRequest.call(this, 'DELETE', `/webhooks/${webhookData.webhookId}`); this.logger.debug('Webhook deleted successfully'); } catch (error) { this.logger.error('Error deleting webhook', { error, webhookId: webhookData.webhookId }); return false; } delete webhookData.webhookId; } else { this.logger.debug('No webhook ID found to delete'); } return true; }, }, }; } async webhook() { const bodyData = this.getBodyData(); const headerData = this.getHeaderData(); const secretToken = this.getNodeParameter('secretToken'); this.logger.debug('Received webhook request', { headers: headerData, body: bodyData, }); if (secretToken && headerData['x-ea-token'] !== secretToken) { this.logger.warn('Webhook request rejected: Invalid signature', { expected: secretToken, received: headerData['x-ea-token'], }); return { workflowData: [ this.helpers.returnJsonArray({ message: 'Invalid signature', expected: secretToken, received: headerData['x-ea-token'], headerData, }), ], }; } this.logger.debug('Webhook request accepted'); return { workflowData: [this.helpers.returnJsonArray(bodyData)], webhookResponse: '', }; } } exports.EasyAppointmentsTrigger = EasyAppointmentsTrigger; //# sourceMappingURL=EasyAppointmentsTrigger.node.js.map