n8n-nodes-livo
Version:
n8n Livo App integration with triggers and actions for orders, products, customers, and repairs
187 lines (186 loc) • 8.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.OrderNodeCredentials = exports.OrderNode = void 0;
const n8n_workflow_1 = require("n8n-workflow");
class OrderNode {
constructor() {
this.description = {
displayName: 'Đơn hàng',
name: 'orderNode',
icon: 'file:order.svg',
group: ['trigger'],
version: 1,
subtitle: '={{$parameter["event"]}}',
description: 'Trigger webhook events cho đơn hàng (tạo, cập nhật, hủy, ...)',
defaults: {
name: 'Đơn hàng',
},
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 đơn hàng',
value: 'order.list',
description: 'Trigger khi lấy danh sách đơn hàng',
},
{
name: 'Chi tiết đơn hàng',
value: 'order.detail',
description: 'Trigger khi xem chi tiết đơn hàng',
},
{
name: 'Tạo đơn hàng',
value: 'order.created',
description: 'Trigger khi tạo mới đơn hàng',
},
{
name: 'Cập nhật đơn hàng',
value: 'order.updated',
description: 'Trigger khi cập nhật đơn hàng',
},
{
name: 'Thanh toán đơn hàng',
value: 'order.paid',
description: 'Trigger khi thanh toán đơn hàng',
},
],
default: 'order.created',
required: true,
}
],
};
}
async webhook() {
var _a;
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 orderData = bodyData;
const receivedEvent = orderData.event || headers['x-event-type'];
if (receivedEvent !== expectedEvent) {
return {
noWebhookResponse: true,
};
}
if (advancedFilters.customerId && orderData.customer_id !== advancedFilters.customerId) {
return { noWebhookResponse: true };
}
if (advancedFilters.minAmount && (orderData.total_amount || 0) < advancedFilters.minAmount) {
return { noWebhookResponse: true };
}
if (advancedFilters.maxAmount && advancedFilters.maxAmount > 0 &&
(orderData.total_amount || 0) > advancedFilters.maxAmount) {
return { noWebhookResponse: true };
}
if (advancedFilters.shippingLocation &&
!((_a = orderData.shipping_address) === null || _a === void 0 ? void 0 : _a.includes(advancedFilters.shippingLocation))) {
return { noWebhookResponse: true };
}
if (advancedFilters.assignedStaff &&
orderData.assigned_staff !== advancedFilters.assignedStaff) {
return { noWebhookResponse: true };
}
const outputData = {
event: receivedEvent,
event_time: new Date().toISOString(),
event_category: receivedEvent.split('.')[0],
id: orderData.id || orderData.order_id || orderData.repair_id || orderData.return_id || orderData.customer_id,
code: orderData.code || orderData.order_code || orderData.repair_code || orderData.return_code,
customer_id: orderData.customer_id || orderData.ma_khach_hang,
customer_name: orderData.customer_name || orderData.ten_khach_hang,
customer_phone: orderData.customer_phone || orderData.so_dien_thoai,
customer_email: orderData.customer_email || orderData.email,
customer_address: orderData.customer_address || orderData.dia_chi_khach_hang,
total_amount: orderData.total_amount || orderData.tong_tien || orderData.gia_tri,
paid_amount: orderData.paid_amount || orderData.da_thanh_toan,
refund_amount: orderData.refund_amount || orderData.tien_hoan,
discount_amount: orderData.discount_amount || orderData.giam_gia,
items: orderData.items || orderData.san_pham || [],
quantity: orderData.quantity || orderData.so_luong,
description: orderData.description || orderData.mo_ta,
shipping_address: orderData.shipping_address || orderData.dia_chi_giao_hang,
shipping_method: orderData.shipping_method || orderData.phuong_thuc_giao_hang,
delivery_date: orderData.delivery_date || orderData.ngay_giao_hang,
device_info: orderData.device_info || orderData.thong_tin_thiet_bi,
issue_description: orderData.issue_description || orderData.mo_ta_su_co,
repair_status: orderData.repair_status || orderData.trang_thai_sua_chua,
technician: orderData.technician || orderData.ky_thuat_vien,
estimated_time: orderData.estimated_time || orderData.thoi_gian_du_kien,
repair_cost: orderData.repair_cost || orderData.chi_phi_sua_chua,
return_reason: orderData.return_reason || orderData.ly_do_tra_hang,
return_condition: orderData.return_condition || orderData.tinh_trang_hang_tra,
original_order_id: orderData.original_order_id || orderData.don_hang_goc,
status: orderData.status || orderData.trang_thai,
created_date: orderData.created_date || orderData.ngay_tao,
updated_date: orderData.updated_date || orderData.ngay_cap_nhat,
assigned_staff: orderData.assigned_staff || orderData.nhan_vien_phu_trach,
branch: orderData.branch || orderData.chi_nhanh,
notes: orderData.notes || orderData.ghi_chu,
raw_data: orderData,
headers: headers,
query: query,
webhook_url: req.url,
};
return {
workflowData: [
[
{
json: outputData,
},
],
],
};
}
}
exports.OrderNode = OrderNode;
class OrderNodeCredentials {
constructor() {
this.name = 'orderNodeApi';
this.displayName = 'Order Node API';
this.properties = [
{
displayName: 'API Key',
name: 'apiKey',
type: 'string',
typeOptions: {
password: true,
},
default: '',
},
{
displayName: 'Base URL',
name: 'baseUrl',
type: 'string',
default: 'https://api.yourstore.com',
},
];
}
}
exports.OrderNodeCredentials = OrderNodeCredentials;