n8n-nodes-livo
Version:
n8n Livo App integration with triggers and actions for orders, products, customers, and repairs
178 lines (177 loc) • 7.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LivoOrderTrigger = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class LivoOrderTrigger {
constructor() {
this.description = {
displayName: 'Livo Order Trigger',
name: 'livoOrderTrigger',
icon: 'file:livo.svg',
group: ['trigger'],
version: 1,
subtitle: '={{$parameter["event"]}}',
description: 'Starts the workflow when Livo order events occur',
defaults: {
name: 'Livo Order Trigger',
},
inputs: [],
outputs: ['main'],
webhooks: [
{
name: 'default',
httpMethod: 'POST',
responseMode: 'onReceived',
path: 'webhook',
},
],
properties: [
{
displayName: 'Event',
name: 'event',
type: 'options',
options: [
{
name: 'Order Created',
displayName: 'Order Created',
value: 'order.created',
description: 'Triggered when a new order is created',
},
{
name: 'Order Updated',
displayName: 'Order Updated',
value: 'order.updated',
description: 'Triggered when an order is updated',
},
{
name: 'Order Paid',
displayName: 'Order Paid',
value: 'order.paid',
description: 'Triggered when an order is paid',
},
{
name: 'Order Cancelled',
displayName: 'Order Cancelled',
value: 'order.cancelled',
description: 'Triggered when an order is cancelled',
},
{
name: 'Order Delivered',
displayName: 'Order Delivered',
value: 'order.delivered',
description: 'Triggered when an order is delivered',
},
],
default: 'order.created',
required: true,
description: 'The order event that will trigger the webhook',
},
{
displayName: 'Additional Options',
name: 'additionalOptions',
type: 'collection',
placeholder: 'Add Option',
default: {},
options: [
{
displayName: 'Include Raw Data',
name: 'includeRawData',
type: 'boolean',
default: true,
description: 'Whether to include the raw webhook data in the output',
},
{
displayName: 'Webhook Secret',
name: 'webhookSecret',
type: 'string',
typeOptions: {
password: true,
},
default: '',
description: 'Optional secret for webhook verification',
},
{
displayName: 'Customer ID Filter',
name: 'customerIdFilter',
type: 'string',
default: '',
description: 'Only trigger for specific customer ID',
},
{
displayName: 'Min Amount Filter',
name: 'minAmountFilter',
type: 'number',
default: 0,
description: 'Only trigger for orders above this amount',
},
],
},
],
};
}
async webhook() {
const bodyData = this.getBodyData();
const headers = this.getHeaderData();
const expectedEvent = this.getNodeParameter('event');
const additionalOptions = this.getNodeParameter('additionalOptions', {});
if (!bodyData || typeof bodyData !== 'object') {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Invalid webhook data received');
}
const eventData = bodyData;
if (additionalOptions.webhookSecret) {
const receivedSecret = headers['x-livo-signature'] || headers['x-webhook-signature'];
if (!receivedSecret || receivedSecret !== additionalOptions.webhookSecret) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Webhook signature verification failed');
}
}
const receivedEvent = eventData.event || headers['x-event-type'];
if (receivedEvent !== expectedEvent) {
return {
noWebhookResponse: true,
};
}
if (additionalOptions.customerIdFilter &&
eventData.customer_id !== additionalOptions.customerIdFilter) {
return { noWebhookResponse: true };
}
if (additionalOptions.minAmountFilter &&
(eventData.total_amount || 0) < additionalOptions.minAmountFilter) {
return { noWebhookResponse: true };
}
const processedData = {
event: receivedEvent,
resource: 'orders',
timestamp: eventData.timestamp || new Date().toISOString(),
event_id: eventData.id || eventData.event_id,
order_id: eventData.order_id || eventData.id,
order_number: eventData.order_number || eventData.number,
customer_id: eventData.customer_id,
customer_name: eventData.customer_name,
customer_email: eventData.customer_email,
customer_phone: eventData.customer_phone,
total_amount: eventData.total_amount || eventData.total,
currency: eventData.currency || 'VND',
items: eventData.items || eventData.line_items || [],
shipping_address: eventData.shipping_address,
billing_address: eventData.billing_address,
payment_status: eventData.payment_status,
fulfillment_status: eventData.fulfillment_status,
status: eventData.status,
created_at: eventData.created_at,
updated_at: eventData.updated_at,
};
if (additionalOptions.includeRawData) {
processedData.raw_data = eventData;
}
return {
workflowData: [
[
{
json: processedData,
},
],
],
};
}
}
exports.LivoOrderTrigger = LivoOrderTrigger;