@progtechbr/n8n-nodes-rdsme
Version:
Send events through API to RD Station Marketing para Ecommerce
547 lines • 24.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RdsmEcommerce = void 0;
const IdentifierFields_1 = require("./Fields/IdentifierFields");
const LineItemsFields_1 = require("./Fields/LineItemsFields");
const ShippingFields_1 = require("./Fields/ShippingFields");
const TrackingFields_1 = require("./Fields/TrackingFields");
const AddicionalFields_1 = require("./Fields/AddicionalFields");
const PayloadBuilders_1 = require("./Utils/PayloadBuilders");
const Validations_1 = require("./Utils/Validations");
const validator_1 = require("validator");
const GenericFunctions_1 = require("./Utils/GenericFunctions");
const GenericConstants_1 = require("./Utils/GenericConstants");
class RdsmEcommerce {
constructor() {
this.description = {
name: 'rdsmEcommerce',
displayName: 'RD Station Marketing para Ecommerce',
icon: 'file:RdsmEcommerce.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Insert ecommerce events to RD Station Marketing through API',
defaults: {
name: 'RD Station Marketing para Ecommerce',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: 'rdsmEcommerceOAuth2Api',
required: true,
}
],
properties: [
{
displayName: 'Resource',
name: 'resource',
type: 'options',
options: [
{
name: 'Ecommerce Event',
value: 'ecommerceEvents',
}
],
default: 'ecommerceEvents',
description: 'Create a new ecommerce event',
noDataExpression: true,
required: true,
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
displayOptions: {
show: {
resource: ['ecommerceEvents'],
},
},
options: [
{
name: 'New Ecommerce Event',
value: 'newEcommerceEvent',
description: 'Register a new ecommerce event',
action: 'Register a new ecommerce event',
},
],
default: 'newEcommerceEvent',
noDataExpression: true,
},
{
displayName: 'Ecommerce Event Type',
name: 'eventType',
type: 'options',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
},
options: [
{
name: 'Cart Abandoned',
value: 'ecommerceCartAbandoned',
description: 'Cart abandoned event',
},
{
name: 'Checkout Started',
value: 'ecommerceCheckoutStarted',
description: 'Checkout started event',
},
{
name: 'Order Cancelled',
value: 'ecommerceOrderCancelled',
description: 'Order cancelled event',
},
{
name: 'Order Fulfilled',
value: 'ecommerceOrderFulfilled',
description: 'Order fulfilled event',
},
{
name: 'Order Paid',
value: 'ecommerceOrderPaid',
description: 'Order paid event',
},
{
name: 'Order Placed',
value: 'ecommerceOrderPlaced',
description: 'Order placed event',
},
{
name: 'Order Refunded',
value: 'ecommerceOrderRefunded',
description: 'Order refunded event',
},
{
name: 'Shipment Delivered',
value: 'ecommerceShipmentDelivered',
description: 'Shipment delivered event',
},
],
default: 'ecommerceCartAbandoned',
description: 'Ecommerce event type for lead conversion',
noDataExpression: true,
required: true,
},
...IdentifierFields_1.ecommerceIdentifiers,
{
displayName: 'Lead Email',
name: 'email',
type: 'string',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
},
default: '',
placeholder: 'lead@email.com',
description: 'Primary email for the lead',
required: true,
},
{
displayName: 'Lead Name',
name: 'name',
type: 'string',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
},
default: '',
description: 'Lead\'s fullname',
},
{
displayName: 'Lead Mobile Phone',
name: 'mobilePhone',
type: 'string',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
},
default: '',
description: 'Lead\'s mobile phone',
},
{
displayName: 'Lead Personal Phone',
name: 'personalPhone',
type: 'string',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
},
default: '',
description: 'Lead\'s personal phone',
},
{
displayName: 'Checkout URL',
name: 'checkoutUrl',
type: 'string',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
eventType: ['ecommerceCheckoutStarted', 'ecommerceCartAbandoned'],
},
},
default: '',
description: 'Checkout URL - HTTP or HTTPS address',
required: true,
},
{
displayName: 'Order URL',
name: 'orderUrl',
type: 'string',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
eventType: ['ecommerceOrderPlaced', 'ecommerceOrderPaid'],
},
},
default: '',
description: 'Order URL - HTTP or HTTPS address',
},
...IdentifierFields_1.orderPlacedIdentifiers,
...IdentifierFields_1.orderExplicitIdentifiers,
{
displayName: 'Cancel Reason',
name: 'cancelReason',
type: 'options',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
eventType: ['ecommerceOrderCancelled'],
},
},
options: [
{
name: 'Customer changed or cancelled the order',
value: 'customer',
},
{
name: 'Fraud order',
value: 'fraud',
},
{
name: 'Other reason',
value: 'other',
},
{
name: 'Refused payment',
value: 'declined',
},
{
name: 'Unavailable items',
value: 'inventory',
},
],
default: 'other',
description: 'Cancellation reason for order cancelled event',
},
{
displayName: 'Currency',
name: 'currency',
type: 'options',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
hide: {
eventType: [
'ecommerceOrderCancelled',
'ecommerceOrderFulfilled',
'ecommerceShipmentDelivered',
],
},
},
options: [
{
name: 'ARS',
value: 'ARS',
description: 'Argentine Peso',
},
{
name: 'BRL',
value: 'BRL',
description: 'Brazilian Real',
},
{
name: 'CAD',
value: 'CAD',
description: 'Canadian Dollar',
},
{
name: 'CLP',
value: 'CLP',
description: 'Chilean Peso',
},
{
name: 'COP',
value: 'COP',
description: 'Colombian Peso',
},
{
name: 'EUR',
value: 'EUR',
description: 'Euro',
},
{
name: 'MXN',
value: 'MXN',
description: 'Mexican Peso',
},
{
name: 'PEN',
value: 'PEN',
description: 'Peruvian Nuevo Sol',
},
{
name: 'USD',
value: 'USD',
description: 'United States Dollar',
},
{
name: 'UYU',
value: 'UYU',
description: 'Uruguayan Peso',
},
],
default: 'BRL',
description: 'Currency of the store',
noDataExpression: true,
required: true,
},
{
displayName: 'Price',
name: 'price',
type: 'number',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
hide: {
eventType: [
'ecommerceOrderCancelled',
'ecommerceOrderFulfilled',
'ecommerceShipmentDelivered',
],
},
},
default: 0,
typeOptions: {
minValue: 0,
},
description: 'Price of the checkout/order',
required: true,
},
...ShippingFields_1.ecommerceShippingFields,
...TrackingFields_1.ecommerceTrackingFields,
{
displayName: 'Total Items',
name: 'totalItems',
type: 'number',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
hide: {
eventType: [
'ecommerceOrderCancelled',
'ecommerceOrderFulfilled',
'ecommerceShipmentDelivered',
],
},
},
default: 0,
typeOptions: {
minValue: 0,
},
description: 'Total items of products in the checkout',
required: true,
},
...LineItemsFields_1.ecommerceLineItems,
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
displayOptions: {
show: {
operation: ['newEcommerceEvent'],
resource: ['ecommerceEvents'],
},
},
default: {},
options: [
{
...AddicionalFields_1.appendLegalBaseOption,
description: 'Whether to include the phrase “This message was sent automatically with n8n” to the end of the message',
},
],
},
],
};
}
async execute() {
const returnData = [];
let responseData;
const resource = this.getNodeParameter('resource', 0);
const operation = this.getNodeParameter('operation', 0);
if (resource == 'ecommerceEvents' && operation == 'newEcommerceEvent') {
const eventType = this.getNodeParameter('eventType', 0);
const eventFamily = GenericConstants_1.EVENT_FAMILY;
const event = GenericConstants_1.ECOMMERCE_EVENT_TYPE_MAP[eventType];
const additionalFields = this.getNodeParameter('additionalFields', 0);
const appendLegalBase = additionalFields.apppendLegalBase;
const leadEmail = (0, Validations_1.validateEmail)(this, this.getNodeParameter('email', 0), 'Lead Email');
const leadName = this.getNodeParameter('name', 0).trim();
const mobilePhone = this.getNodeParameter('mobilePhone', 0).trim();
const personalPhone = this.getNodeParameter('personalPhone', 0).trim();
const legalBases = GenericConstants_1.LEGAL_BASES_OBJECT;
let identifier;
let specificPayload = {};
const isCartAbandoned = eventType == 'ecommerceCartAbandoned';
const isCheckoutStarted = eventType == 'ecommerceCheckoutStarted';
const isOrderPlaced = eventType == 'ecommerceOrderPlaced';
const isOrderPaid = eventType == 'ecommerceOrderPaid';
const isOrderRefunded = eventType == 'ecommerceOrderRefunded';
const isOrderCancelled = eventType == 'ecommerceOrderCancelled';
const isOrderFulfilled = eventType == 'ecommerceOrderFulfilled';
const isShipmentDelivered = eventType == 'ecommerceShipmentDelivered';
const basePayload = {
email: leadEmail,
...(!(0, validator_1.isEmpty)(leadName) && { name: leadName }),
...(!(0, validator_1.isEmpty)(mobilePhone) && { mobile_phone: mobilePhone }),
...(!(0, validator_1.isEmpty)(personalPhone) && { personal_phone: personalPhone }),
...(appendLegalBase && { legal_bases: legalBases }),
};
if (isCartAbandoned ||
isCheckoutStarted ||
isOrderPlaced ||
isOrderPaid ||
isOrderRefunded) {
let lineItems;
let lineItemsBuilded;
const currency = this.getNodeParameter('currency', 0).trim();
const price = this.getNodeParameter('price', 0);
const totalItems = this.getNodeParameter('totalItems', 0);
if (!isOrderRefunded) {
lineItems = this.getNodeParameter('lineItemsUi', 0);
lineItemsBuilded = (0, PayloadBuilders_1.buildLineItems)(lineItems);
}
if (isCartAbandoned || isCheckoutStarted) {
const checkoutUrl = this.getNodeParameter('checkoutUrl', 0).trim();
specificPayload = {
checkout_url: checkoutUrl,
currency: currency,
price: price,
total_items: totalItems,
line_items: lineItemsBuilded,
};
if (isCartAbandoned) {
identifier = this.getNodeParameter('identifierCartAbandoned', 0).trim();
}
else if (isCheckoutStarted) {
identifier = this.getNodeParameter('identifierCheckoutStarted', 0).trim();
}
specificPayload.identifier = identifier;
}
if (isOrderPlaced || isOrderPaid || isOrderRefunded) {
identifier = this.getNodeParameter('identifierOrder', 0).trim();
specificPayload = {
currency: currency,
price: price,
total_items: totalItems,
...(!isOrderRefunded && { line_items: lineItemsBuilded }),
};
if (isOrderPlaced || isOrderPaid) {
const orderUrl = this.getNodeParameter('orderUrl', 0).trim();
const shippingPrice = this.getNodeParameter('shippingPrice', 0);
const shippingCity = this.getNodeParameter('shippingCity', 0).trim();
const shippingState = this.getNodeParameter('shippingState', 0).trim();
const shippingCountry = this.getNodeParameter('shippingCountry', 0).trim();
if (!(0, validator_1.isEmpty)(orderUrl)) {
specificPayload.order_url = orderUrl;
}
if (shippingPrice > 0) {
specificPayload.shipping_price = shippingPrice;
}
if (!(0, validator_1.isEmpty)(shippingCity)) {
specificPayload.shipping_city = shippingCity;
}
if (!(0, validator_1.isEmpty)(shippingState)) {
specificPayload.shipping_state = shippingState;
}
if (!(0, validator_1.isEmpty)(shippingCountry)) {
specificPayload.shipping_country = shippingCountry;
}
}
if (isOrderPlaced) {
const cartIdentifier = this.getNodeParameter('cartIdentifier', 0).trim();
const checkoutIdentifier = this.getNodeParameter('checkoutIdentifier', 0).trim();
if (!(0, validator_1.isEmpty)(cartIdentifier)) {
specificPayload.cart_identifier = cartIdentifier;
}
if (!(0, validator_1.isEmpty)(checkoutIdentifier)) {
specificPayload.checkout_identifier = checkoutIdentifier;
}
}
specificPayload.identifier = identifier;
}
}
if (isOrderCancelled) {
identifier = this.getNodeParameter('identifierOrder', 0).trim();
const cancelReason = this.getNodeParameter('cancelReason', 0).trim();
specificPayload = {
identifier,
...(!(0, validator_1.isEmpty)(cancelReason) && { cancel_reason: cancelReason }),
};
}
if (isOrderFulfilled || isShipmentDelivered) {
identifier = this.getNodeParameter('identifierShipment', 0).trim();
const orderIdentifier = this.getNodeParameter('orderIdentifierExplicit', 0).trim();
if (isOrderFulfilled) {
const trackingCompany = this.getNodeParameter('trackingCompany', 0).trim();
const trackingCode = this.getNodeParameter('trackingCode', 0).trim();
const trackingUrl = this.getNodeParameter('trackingUrl', 0).trim();
specificPayload = {
...(!(0, validator_1.isEmpty)(trackingCompany) && { tracking_company: trackingCompany }),
...(!(0, validator_1.isEmpty)(trackingCode) && { tracking_code: trackingCode }),
...(!(0, validator_1.isEmpty)(trackingUrl) && { tracking_url: trackingUrl }),
};
}
specificPayload.identifier = identifier;
specificPayload.order_identifier = orderIdentifier;
}
const payload = {
...basePayload,
...specificPayload
};
const body = {
event_type: event,
event_family: eventFamily,
payload: payload,
};
responseData = await GenericFunctions_1.rdStationApiRequest.call(this, 'POST', `/events?event_type=${event}`, body);
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: 0 } });
returnData.push(...executionData);
}
return this.prepareOutputData(returnData);
}
;
}
exports.RdsmEcommerce = RdsmEcommerce;
;
//# sourceMappingURL=RdsmEcommerce.node.js.map