UNPKG

n8n-nodes-salla

Version:

n8n node for Salla.sa e-commerce platform integration with OAuth2.0

1,176 lines (1,175 loc) 142 kB
"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',