n8n-nodes-livo
Version:
n8n Livo App integration with triggers and actions for orders, products, customers, and repairs
146 lines (145 loc) • 6.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProductNode = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class ProductNode {
constructor() {
this.description = {
displayName: 'Sản phẩm',
name: 'productNode',
icon: 'file:return.svg',
group: ['trigger'],
version: 1,
subtitle: '={{$parameter["event"]}}',
description: 'Trigger webhook events cho sản phẩm (tạo, nhận hàng, hoàn tiền, hủy)',
defaults: {
name: 'Sản phẩm',
},
inputs: [],
outputs: ['main'],
webhooks: [
{
name: 'default',
httpMethod: 'POST',
responseMode: 'onReceived',
path: 'webhook',
},
],
properties: [
{
displayName: 'Event',
name: 'event',
type: 'options',
options: [
{
name: 'Lấy danh sách sản phẩm',
value: 'product.list',
description: 'Trigger khi lấy danh sách sản phẩm',
},
{
name: 'Chi tiết sản phẩm',
value: 'product.detail',
description: 'Trigger khi xem chi tiết sản phẩm',
},
{
name: 'Tạo sản phẩm',
value: 'product.created',
description: 'Trigger khi tạo mới sản phẩm',
},
{
name: 'Cập nhật sản phẩm',
value: 'product.updated',
description: 'Trigger khi cập nhật sản phẩm',
},
{
name: 'Xóa sản phẩm',
value: 'product.deleted',
description: 'Trigger khi xóa sản phẩm',
},
],
default: 'product.created',
required: true,
}
],
};
}
async webhook() {
const bodyData = this.getBodyData();
const headers = this.getHeaderData();
const query = this.getQueryData();
const req = this.getRequestObject();
const expectedEvent = this.getNodeParameter('event');
const advancedFilters = this.getNodeParameter('advancedFilters', {});
const authentication = this.getNodeParameter('authentication', {});
if (authentication.secretToken) {
const headerName = authentication.headerName || 'X-Webhook-Secret';
const receivedToken = headers[headerName.toLowerCase()] || headers[headerName];
if (!receivedToken || receivedToken !== authentication.secretToken) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Xác thực webhook thất bại: Token không hợp lệ');
}
}
if (!bodyData || typeof bodyData !== 'object') {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Dữ liệu webhook không hợp lệ');
}
const returnData = bodyData;
const receivedEvent = returnData.event || headers['x-event-type'];
if (receivedEvent !== expectedEvent) {
return { noWebhookResponse: true };
}
if (advancedFilters.customerId && returnData.customer_id !== advancedFilters.customerId) {
return { noWebhookResponse: true };
}
if (advancedFilters.originalOrderId && returnData.original_order_id !== advancedFilters.originalOrderId) {
return { noWebhookResponse: true };
}
if (advancedFilters.minAmount && (returnData.return_amount || 0) < advancedFilters.minAmount) {
return { noWebhookResponse: true };
}
if (advancedFilters.returnReason && returnData.return_reason !== advancedFilters.returnReason) {
return { noWebhookResponse: true };
}
if (advancedFilters.assignedStaff && returnData.assigned_staff !== advancedFilters.assignedStaff) {
return { noWebhookResponse: true };
}
const outputData = {
event: receivedEvent,
event_time: new Date().toISOString(),
event_category: 'product',
return_id: returnData.return_id || returnData.ma_tra_hang,
return_code: returnData.return_code || returnData.ma_tra_hang,
original_order_id: returnData.original_order_id || returnData.don_hang_goc,
original_order_code: returnData.original_order_code || returnData.ma_don_hang_goc,
customer_id: returnData.customer_id || returnData.ma_khach_hang,
customer_name: returnData.customer_name || returnData.ten_khach_hang,
customer_phone: returnData.customer_phone || returnData.so_dien_thoai,
customer_email: returnData.customer_email || returnData.email,
return_amount: returnData.return_amount || returnData.gia_tri_tra,
refund_amount: returnData.refund_amount || returnData.tien_hoan,
refund_method: returnData.refund_method || returnData.phuong_thuc_hoan,
return_reason: returnData.return_reason || returnData.ly_do_tra_hang,
return_condition: returnData.return_condition || returnData.tinh_trang_hang_tra,
return_items: returnData.return_items || returnData.san_pham_tra || [],
return_quantity: returnData.return_quantity || returnData.so_luong_tra,
status: returnData.status || returnData.trang_thai,
created_date: returnData.created_date || returnData.ngay_tao,
processed_date: returnData.processed_date || returnData.ngay_xu_ly,
assigned_staff: returnData.assigned_staff || returnData.nhan_vien_xu_ly,
branch: returnData.branch || returnData.chi_nhanh,
notes: returnData.notes || returnData.ghi_chu,
raw_data: returnData,
headers: headers,
query: query,
webhook_url: req.url,
};
return {
workflowData: [
[
{
json: outputData,
},
],
],
};
}
}
exports.ProductNode = ProductNode;