n8n-nodes-salla
Version:
n8n node for Salla.sa e-commerce platform integration with OAuth2.0
1,176 lines (1,175 loc) • 142 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Salla = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const GenericFunctions_1 = require("./GenericFunctions");
// Import will be added back once SallaFields.ts is created
class Salla {
constructor() {
this.description = {
displayName: 'Salla',
name: 'salla',
icon: 'file:salla.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Interact with Salla.sa e-commerce platform API',
defaults: {
name: 'Salla',
},
inputs: ["main" /* NodeConnectionType.Main */],
outputs: ["main" /* NodeConnectionType.Main */],
credentials: [
{
name: 'sallaOAuth2Api',
required: true,
},
],
properties: [
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Order',
value: 'order',
},
{
name: 'Product',
value: 'product',
},
{
name: 'Customer',
value: 'customer',
},
{
name: 'Address',
value: 'address',
},
{
name: 'Special Offer',
value: 'specialOffer',
},
{
name: 'Coupon',
value: 'coupon',
},
{
name: 'Shipment',
value: 'shipment',
},
{
name: 'Digital Product',
value: 'digitalProduct',
},
{
name: 'Product Image',
value: 'productImage',
},
{
name: 'Product Video',
value: 'productVideo',
},
{
name: 'Store Info',
value: 'storeInfo',
},
{
name: 'User Info',
value: 'userInfo',
},
],
default: 'order',
description: 'Resource to consume',
},
// Order Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['order'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get an order',
action: 'Get an order',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all orders',
action: 'Get all orders',
},
{
name: 'Update Status',
value: 'updateStatus',
description: 'Update an order status',
action: 'Update an order status',
},
{
name: 'Cancel',
value: 'cancel',
description: 'Cancel an order',
action: 'Cancel an order',
},
],
default: 'get',
},
// Product Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['product'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a product',
action: 'Create a product',
},
{
name: 'Get',
value: 'get',
description: 'Get a product',
action: 'Get a product',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all products',
action: 'Get all products',
},
{
name: 'Update',
value: 'update',
description: 'Update a product',
action: 'Update a product',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a product',
action: 'Delete a product',
},
],
default: 'get',
},
// Customer Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['customer'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a customer',
action: 'Create a customer',
},
{
name: 'Get',
value: 'get',
description: 'Get a customer',
action: 'Get a customer',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all customers',
action: 'Get all customers',
},
{
name: 'Update',
value: 'update',
description: 'Update a customer',
action: 'Update a customer',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a customer',
action: 'Delete a customer',
},
],
default: 'get',
},
// Address Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['address'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get an address',
action: 'Get an address',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all addresses',
action: 'Get all addresses',
},
{
name: 'Create',
value: 'create',
description: 'Create an address',
action: 'Create an address',
},
{
name: 'Update',
value: 'update',
description: 'Update an address',
action: 'Update an address',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete an address',
action: 'Delete an address',
},
],
default: 'get',
},
// Special Offer Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['specialOffer'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get a special offer',
action: 'Get a special offer',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all special offers',
action: 'Get all special offers',
},
{
name: 'Create',
value: 'create',
description: 'Create a special offer',
action: 'Create a special offer',
},
{
name: 'Update',
value: 'update',
description: 'Update a special offer',
action: 'Update a special offer',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a special offer',
action: 'Delete a special offer',
},
],
default: 'get',
},
// Coupon Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['coupon'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get a coupon',
action: 'Get a coupon',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all coupons',
action: 'Get all coupons',
},
{
name: 'Create',
value: 'create',
description: 'Create a coupon',
action: 'Create a coupon',
},
{
name: 'Update',
value: 'update',
description: 'Update a coupon',
action: 'Update a coupon',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a coupon',
action: 'Delete a coupon',
},
],
default: 'get',
},
// Shipment Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['shipment'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get a shipment',
action: 'Get a shipment',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all shipments',
action: 'Get all shipments',
},
{
name: 'Create',
value: 'create',
description: 'Create a shipment',
action: 'Create a shipment',
},
{
name: 'Update',
value: 'update',
description: 'Update a shipment',
action: 'Update a shipment',
},
{
name: 'Track',
value: 'track',
description: 'Track a shipment',
action: 'Track a shipment',
},
],
default: 'get',
},
// Digital Product Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['digitalProduct'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get a digital product',
action: 'Get a digital product',
},
{
name: 'Get All',
value: 'getAll',
description: 'Get all digital products',
action: 'Get all digital products',
},
{
name: 'Create',
value: 'create',
description: 'Create a digital product',
action: 'Create a digital product',
},
{
name: 'Update',
value: 'update',
description: 'Update a digital product',
action: 'Update a digital product',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a digital product',
action: 'Delete a digital product',
},
],
default: 'get',
},
// Product Image Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['productImage'],
},
},
options: [
{
name: 'Upload',
value: 'upload',
description: 'Upload an image to a product',
action: 'Upload an image to a product',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a product image',
action: 'Delete a product image',
},
],
default: 'upload',
},
// Product Video Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['productVideo'],
},
},
options: [
{
name: 'Upload',
value: 'upload',
description: 'Add a YouTube video to a product',
action: 'Add a YouTube video to a product',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a product video',
action: 'Delete a product video',
},
],
default: 'upload',
},
// Store Info Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['storeInfo'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get store information',
action: 'Get store information',
},
],
default: 'get',
},
// User Info Operations
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['userInfo'],
},
},
options: [
{
name: 'Get',
value: 'get',
description: 'Get user information',
action: 'Get user information',
},
],
default: 'get',
},
// Common Fields
{
displayName: 'ID',
name: 'id',
type: 'string',
required: true,
displayOptions: {
show: {
operation: ['get', 'update', 'delete', 'cancel', 'track', 'updateStatus'],
},
hide: {
resource: ['storeInfo', 'userInfo'],
},
},
default: '',
description: 'The ID of the resource',
},
// Pagination
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
// ============================================
// PRODUCT FIELDS
// ============================================
// Product: Required fields for Create
{
displayName: 'Product Name',
name: 'productName',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['product'],
operation: ['create'],
},
},
default: '',
description: 'Name of the product',
},
{
displayName: 'Price',
name: 'price',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['product'],
operation: ['create'],
},
},
default: 0,
description: 'Product price',
},
{
displayName: 'Product Type',
name: 'productType',
type: 'options',
required: true,
displayOptions: {
show: {
resource: ['product'],
operation: ['create'],
},
},
options: [
{ name: 'Product', value: 'product' },
{ name: 'Service', value: 'service' },
{ name: 'Group Products', value: 'group_products' },
{ name: 'Codes', value: 'codes' },
{ name: 'Digital', value: 'digital' },
{ name: 'Food', value: 'food' },
{ name: 'Booking', value: 'booking' },
{ name: 'Donating', value: 'donating' },
],
default: 'product',
description: 'Type of the product (cannot be changed after creation)',
},
// Product: Additional Fields for Create/Update
{
displayName: 'Additional Fields',
name: 'productAdditionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['product'],
operation: ['create', 'update'],
},
},
options: [
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{ name: 'On Sale', value: 'sale' },
{ name: 'Out of Stock', value: 'out' },
{ name: 'Hidden', value: 'hidden' },
{ name: 'Deleted', value: 'deleted' },
],
default: 'sale',
description: 'Product availability status',
},
{
displayName: 'Quantity',
name: 'quantity',
type: 'number',
default: 0,
description: 'Stock count available for sale',
},
{
displayName: 'Unlimited Quantity',
name: 'unlimited_quantity',
type: 'boolean',
default: false,
description: 'Whether the product has unlimited stock',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
rows: 4,
},
default: '',
description: 'Detailed product description',
},
{
displayName: 'Subtitle',
name: 'subtitle',
type: 'string',
default: '',
description: 'Secondary label displayed under product name',
},
{
displayName: 'SKU',
name: 'sku',
type: 'string',
default: '',
description: 'Stock Keeping Unit identifier',
},
{
displayName: 'MPN',
name: 'mpn',
type: 'string',
default: '',
description: 'Manufacturer Part Number',
},
{
displayName: 'GTIN',
name: 'gtin',
type: 'string',
default: '',
description: 'Global Trade Item Number (8, 12, 13, or 14 digits)',
},
{
displayName: 'Sale Price',
name: 'sale_price',
type: 'number',
default: 0,
description: 'Discounted price during promotions',
},
{
displayName: 'Cost Price',
name: 'cost_price',
type: 'number',
default: 0,
description: 'Amount paid to acquire or manufacture the product',
},
{
displayName: 'Sale Start Date',
name: 'sale_start',
type: 'dateTime',
default: '',
description: 'Promotion start date',
},
{
displayName: 'Sale End Date',
name: 'sale_end',
type: 'dateTime',
default: '',
description: 'Date when promotional sale expires',
},
{
displayName: 'Maximum Quantity Per Order',
name: 'maximum_quantity_per_order',
type: 'number',
default: 0,
description: 'Purchase limit per transaction (0 = unlimited)',
},
{
displayName: 'Weight',
name: 'weight',
type: 'number',
default: 0,
description: 'Product weight in numerical form',
},
{
displayName: 'Weight Type',
name: 'weight_type',
type: 'options',
options: [
{ name: 'Kilogram', value: 'kg' },
{ name: 'Gram', value: 'g' },
{ name: 'Pound', value: 'lb' },
{ name: 'Ounce', value: 'oz' },
],
default: 'kg',
description: 'Weight measurement unit',
},
{
displayName: 'Require Shipping',
name: 'require_shipping',
type: 'boolean',
default: true,
description: 'Whether the product requires physical delivery',
},
{
displayName: 'With Tax',
name: 'with_tax',
type: 'boolean',
default: true,
description: 'Whether tax applies to this product',
},
{
displayName: 'Hide Quantity',
name: 'hide_quantity',
type: 'boolean',
default: false,
description: 'Whether to conceal stock information from customers',
},
{
displayName: 'Pinned',
name: 'pinned',
type: 'boolean',
default: false,
description: 'Whether to feature the product in category pages',
},
{
displayName: 'Enable Customer Image Upload',
name: 'enable_upload_image',
type: 'boolean',
default: false,
description: 'Whether to allow customer image uploads',
},
{
displayName: 'Enable Customer Note',
name: 'enable_note',
type: 'boolean',
default: false,
description: 'Whether to allow customer notes at checkout',
},
{
displayName: 'Promotion Title',
name: 'promotion_title',
type: 'string',
default: '',
description: 'Label displayed on main product image',
},
{
displayName: 'Metadata Title',
name: 'metadata_title',
type: 'string',
default: '',
description: 'SEO title for search engine results',
},
{
displayName: 'Metadata Description',
name: 'metadata_description',
type: 'string',
default: '',
description: 'SEO description for search engine optimization',
},
{
displayName: 'Brand ID',
name: 'brand_id',
type: 'number',
default: 0,
description: 'Brand identifier',
},
{
displayName: 'Category IDs',
name: 'categories',
type: 'string',
default: '',
description: 'Comma-separated category IDs to associate',
},
{
displayName: 'Tag IDs',
name: 'tags',
type: 'string',
default: '',
description: 'Comma-separated tag IDs for categorization',
},
{
displayName: 'Calories',
name: 'calories',
type: 'string',
default: '',
description: 'Calorie information (applicable for food products)',
},
{
displayName: 'Min Donation Amount',
name: 'min_amount_donating',
type: 'number',
default: 0,
description: 'Minimum donation amount (for donating products)',
},
{
displayName: 'Max Donation Amount',
name: 'max_amount_donating',
type: 'number',
default: 0,
description: 'Maximum donation amount (for donating products)',
},
],
},
// ============================================
// ORDER FILTERS
// ============================================
{
displayName: 'Filters',
name: 'orderFilters',
type: 'collection',
placeholder: 'Add Filter',
default: {},
displayOptions: {
show: {
resource: ['order'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Keyword',
name: 'keyword',
type: 'string',
default: '',
description: 'Search by tag name, shipping number, or other keywords',
},
{
displayName: 'Status IDs',
name: 'status',
type: 'string',
default: '',
description: 'Comma-separated status IDs to filter orders',
},
{
displayName: 'From Date',
name: 'from_date',
type: 'dateTime',
default: '',
description: 'Find orders created after this date (YYYY-MM-DD)',
},
{
displayName: 'To Date',
name: 'to_date',
type: 'dateTime',
default: '',
description: 'Find orders created before this date (YYYY-MM-DD)',
},
{
displayName: 'Customer ID',
name: 'customer_id',
type: 'number',
default: 0,
description: 'Filter orders by customer ID',
},
{
displayName: 'Product Name',
name: 'product',
type: 'string',
default: '',
description: 'Filter orders containing a specific product name',
},
{
displayName: 'City',
name: 'city',
type: 'string',
default: '',
description: 'Filter orders by city',
},
{
displayName: 'Country ID',
name: 'country',
type: 'number',
default: 0,
description: 'Filter orders by country ID',
},
{
displayName: 'Coupon Code',
name: 'coupon',
type: 'string',
default: '',
description: 'Filter orders using a specific coupon code',
},
{
displayName: 'Payment Method',
name: 'payment_method',
type: 'string',
default: '',
description: 'Comma-separated payment methods to filter',
},
{
displayName: 'Unread Only',
name: 'unread',
type: 'boolean',
default: false,
description: 'Whether to find only unread orders',
},
{
displayName: 'Sort By',
name: 'sort_by',
type: 'options',
options: [
{ name: 'ID', value: 'id' },
{ name: 'Total', value: 'total' },
{ name: 'Updated At', value: 'updated_at' },
{ name: 'Created At', value: 'created_at' },
],
default: 'created_at',
description: 'Field to sort results by',
},
{
displayName: 'Selling Channel',
name: 'selling_channel',
type: 'multiOptions',
options: [
{ name: 'Mobile', value: 'mobile' },
{ name: 'Mobile App', value: 'mobile-app' },
{ name: 'Desktop', value: 'desktop' },
{ name: 'Affiliate', value: 'affiliate' },
{ name: 'Mahly App', value: 'mahly-app' },
],
default: [],
description: 'Filter by selling channel',
},
],
},
// ============================================
// ORDER STATUS UPDATE FIELDS
// ============================================
{
displayName: 'Status Slug',
name: 'orderStatusSlug',
type: 'options',
displayOptions: {
show: {
resource: ['order'],
operation: ['updateStatus'],
},
},
options: [
{ name: 'In Progress', value: 'in_progress' },
{ name: 'In Review', value: 'in_review' },
{ name: 'Preparing', value: 'preparing' },
{ name: 'In Transit', value: 'in_transit' },
{ name: 'Shipped', value: 'shipped' },
{ name: 'Delivered', value: 'delivered' },
{ name: 'Restoring', value: 'restoring' },
{ name: 'Restored', value: 'restored' },
{ name: 'Completed', value: 'completed' },
{ name: 'Custom Status (Use Status ID)', value: 'custom' },
],
default: 'in_progress',
description: 'Predefined order status slug. Select "Custom Status" to use a custom status_id instead.',
},
{
displayName: 'Custom Status ID',
name: 'orderStatusId',
type: 'number',
displayOptions: {
show: {
resource: ['order'],
operation: ['updateStatus'],
orderStatusSlug: ['custom'],
},
},
default: 0,
description: 'Custom sub-status ID for the order. Use this when the predefined status slugs are not applicable.',
},
{
displayName: 'Restore Items',
name: 'orderRestoreItems',
type: 'boolean',
displayOptions: {
show: {
resource: ['order'],
operation: ['updateStatus'],
},
},
default: false,
description: 'Whether to restore items to inventory when updating status (typically used with restoring/restored statuses)',
},
// ============================================
// PRODUCT FILTERS
// ============================================
{
displayName: 'Filters',
name: 'productFilters',
type: 'collection',
placeholder: 'Add Filter',
default: {},
displayOptions: {
show: {
resource: ['product'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Keyword',
name: 'keyword',
type: 'string',
default: '',
description: 'Filter products matching a specific name or SKU',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{ name: 'On Sale', value: 'sale' },
{ name: 'Out of Stock', value: 'out' },
{ name: 'Hidden', value: 'hidden' },
],
default: 'sale',
description: 'Filter by product status',
},
{
displayName: 'Category ID',
name: 'category',
type: 'string',
default: '',
description: 'Filter products by category ID',
},
{
displayName: 'Response Format',
name: 'format',
type: 'options',
options: [
{ name: 'Full', value: 'full' },
{ name: 'Light (Reduced Data)', value: 'light' },
],
default: 'full',
description: 'Response data format',
},
],
},
// ============================================
// CUSTOMER FIELDS
// ============================================
// Customer: Add Create operation
{
displayName: 'Additional Fields',
name: 'customerFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['customer'],
operation: ['create', 'update'],
},
},
options: [
{
displayName: 'First Name',
name: 'first_name',
type: 'string',
default: '',
description: 'Customer given name',
},
{
displayName: 'Last Name',
name: 'last_name',
type: 'string',
default: '',
description: 'Customer family name',
},
{
displayName: 'Mobile',
name: 'mobile',
type: 'string',
default: '',
description: 'Mobile number (excluding country code)',
},
{
displayName: 'Mobile Country Code',
name: 'mobile_code_country',
type: 'string',
default: '',
description: 'Country code for mobile (e.g., 966 for Saudi Arabia)',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
placeholder: 'name@email.com',
default: '',
description: 'Customer email address',
},
{
displayName: 'Gender',
name: 'gender',
type: 'options',
options: [
{ name: 'Male', value: 'male' },
{ name: 'Female', value: 'female' },
],
default: 'male',
description: 'Customer gender',