n8n-nodes-walichat
Version:
n8n plugin for WaliChat
346 lines (345 loc) • 12.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeProfileOperations = exports.profileProperties = void 0;
const request_1 = require("../request");
exports.profileProperties = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['profile'],
},
},
options: [
{
name: 'Get Profile',
value: 'deviceProfile',
description: 'Get WhatsApp profile information',
},
{
name: 'Update Profile',
value: 'deviceProfileUpdate',
description: 'Update WhatsApp profile information',
},
{
name: 'Get Profile Image',
value: 'deviceProfileImage',
description: 'Get WhatsApp account profile image',
},
{
name: 'Update Profile Image',
value: 'updateProfileImage',
description: 'Update WhatsApp account profile image',
},
],
default: 'deviceProfile',
},
{
displayName: 'WhatsApp Number',
name: 'device',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getDevices',
},
required: true,
default: '',
displayOptions: {
show: {
resource: ['profile'],
},
},
description: 'The ID of the WhatsApp number',
},
// ADDITIONAL PARAMETERS FOR GET PROFILE
{
displayName: 'Include Options',
name: 'include',
type: 'string',
required: false,
default: '',
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfile'],
},
},
description: 'Additional data to include in the response',
},
// PARAMETERS FOR UPDATE PROFILE
{
displayName: 'Profile Name',
name: 'name',
type: 'string',
required: false,
default: '',
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfileUpdate'],
},
},
description: 'WhatsApp profile public name (max 25 characters)',
},
{
displayName: 'Profile Status',
name: 'status',
type: 'string',
required: false,
default: '',
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfileUpdate'],
},
},
description: 'WhatsApp profile public status description (max 130 characters)',
},
{
displayName: 'Update Business Profile',
name: 'updateBusinessProfile',
type: 'boolean',
required: false,
default: false,
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfileUpdate'],
},
},
description: 'Whether to update business profile information (only supported for WhatsApp Business numbers)',
},
{
displayName: 'Business Profile',
name: 'businessProfile',
type: 'collection',
placeholder: 'Add Business Profile Detail',
default: {},
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfileUpdate'],
updateBusinessProfile: [true],
},
},
options: [
{
displayName: 'Business Address',
name: 'address',
type: 'string',
default: '',
description: 'Business physical address (max 256 characters)',
},
{
displayName: 'Business Description',
name: 'description',
type: 'string',
default: '',
description: 'Business activity description (max 256 characters)',
},
{
displayName: 'Business Email',
name: 'email',
type: 'string',
default: '',
description: 'Business contact email (max 128 characters)',
},
{
displayName: 'Business Websites',
name: 'websites',
type: 'string',
typeOptions: {
multipleValues: true,
maxValues: 2,
},
default: [],
description: 'Business website URLs (max 2 websites)',
},
{
displayName: 'Business Categories',
name: 'categories',
type: 'multiOptions',
options: [
{ name: 'Other', value: 'other_category' },
{ name: 'Automotive Service', value: 'automotive_service' },
{ name: 'Clothing & Accessories', value: 'clothing_and_accessories' },
{ name: 'Art & Entertainment', value: 'art_and_entertainment' },
{ name: 'Beauty, Cosmetics & Personal Care', value: 'beauty_cosmetics_and_personal_care' },
{ name: 'Education', value: 'education' },
{ name: 'Event Organizer', value: 'event_organizer' },
{ name: 'Finance', value: 'finance' },
{ name: 'Grocery', value: 'grocery' },
{ name: 'Hotel', value: 'hotel' },
{ name: 'Medicine & Health', value: 'medicine_and_health' },
{ name: 'Non-Profit', value: 'non_profit' },
{ name: 'Restaurant', value: 'restaurant' },
{ name: 'Retail Purchases & Sales', value: 'retail_purchases_and_sales' },
{ name: 'Travel & Transportation', value: 'travel_and_transportation' },
],
default: [],
description: 'Business categories (max 3)',
},
],
},
{
displayName: 'Set Business Hours',
name: 'setBusinessHours',
type: 'boolean',
required: false,
default: false,
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfileUpdate'],
updateBusinessProfile: [true],
},
},
description: 'Whether to set business hours',
},
{
displayName: 'Business Hours Timezone',
name: 'timezone',
type: 'string',
required: true,
default: 'UTC',
displayOptions: {
show: {
resource: ['profile'],
operation: ['deviceProfileUpdate'],
updateBusinessProfile: [true],
setBusinessHours: [true],
},
},
description: 'Timezone for business hours (e.g., America/New_York, Europe/London)',
},
// PARAMETERS FOR UPDATE PROFILE IMAGE
{
displayName: 'Image Source',
name: 'imageSource',
type: 'options',
required: true,
displayOptions: {
show: {
resource: ['profile'],
operation: ['updateProfileImage'],
},
},
options: [
{
name: 'URL',
value: 'url',
},
{
name: 'Base64',
value: 'base64',
},
],
default: 'url',
description: 'Source of the image',
},
{
displayName: 'Image URL',
name: 'url',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['profile'],
operation: ['updateProfileImage'],
imageSource: ['url'],
},
},
description: 'URL of the image to use as profile picture (JPG or PNG, max 1MB)',
},
{
displayName: 'Base64 Image',
name: 'image',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['profile'],
operation: ['updateProfileImage'],
imageSource: ['base64'],
},
},
description: 'Base64 encoded image data (JPG or PNG, max 1MB)',
},
];
async function executeProfileOperations(index) {
const operation = this.getNodeParameter('operation', index);
const device = this.getNodeParameter('device', index);
// GET PROFILE
if (operation === 'deviceProfile') {
const include = this.getNodeParameter('include', index, '');
const queryParameters = {};
if (include) {
queryParameters.include = include;
}
return (0, request_1.request)(this, 'GET', `/devices/${device}/profile`, undefined, queryParameters);
}
// UPDATE PROFILE
if (operation === 'deviceProfileUpdate') {
const name = this.getNodeParameter('name', index, '');
const status = this.getNodeParameter('status', index, '');
const updateBusinessProfile = this.getNodeParameter('updateBusinessProfile', index, false);
const body = {};
if (name)
body.name = name;
if (status)
body.status = status;
if (updateBusinessProfile) {
const businessProfileData = this.getNodeParameter('businessProfile', index, {});
body.businessProfile = {};
if (businessProfileData.address)
body.businessProfile.address = businessProfileData.address;
if (businessProfileData.description)
body.businessProfile.description = businessProfileData.description;
if (businessProfileData.email)
body.businessProfile.email = businessProfileData.email;
if (businessProfileData.websites && businessProfileData.websites.length > 0) {
body.businessProfile.websites = businessProfileData.websites;
}
if (businessProfileData.categories && businessProfileData.categories.length > 0) {
body.businessProfile.categories = businessProfileData.categories;
}
const setBusinessHours = this.getNodeParameter('setBusinessHours', index, false);
if (setBusinessHours) {
const timezone = this.getNodeParameter('timezone', index);
body.businessProfile.businessHours = {
timezone,
};
// TODO: support week days hours
}
}
return (0, request_1.request)(this, 'PATCH', `/devices/${device}/profile`, body);
}
// GET PROFILE IMAGE
if (operation === 'deviceProfileImage') {
// Set the Accept header to image/jpeg to get the actual image
const customHeaders = {
'Accept': 'image/jpeg',
};
return (0, request_1.request)(this, 'GET', `/devices/${device}/profile/image`, undefined, undefined, customHeaders);
}
// UPDATE PROFILE IMAGE
if (operation === 'updateProfileImage') {
const imageSource = this.getNodeParameter('imageSource', index);
const body = {};
if (imageSource === 'url') {
const url = this.getNodeParameter('url', index);
body.url = url;
}
else if (imageSource === 'base64') {
const image = this.getNodeParameter('image', index);
body.image = image;
}
return (0, request_1.request)(this, 'PUT', `/devices/${device}/profile/image`, body);
}
throw new Error(`The operation "${operation}" is not supported for profile!`);
}
exports.executeProfileOperations = executeProfileOperations;