n8n-nodes-walichat
Version:
n8n plugin for WaliChat
736 lines (735 loc) • 24.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeTeamOperations = exports.teamProperties = void 0;
const request_1 = require("../request");
exports.teamProperties = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['team'],
},
},
options: [
{
name: 'Get Team Members',
value: 'getTeamUsers',
description: 'Get a list of all team members in your account',
},
{
name: 'Update Team Member',
value: 'updateTeamUser',
description: 'Update team member information',
},
{
name: 'Delete Team Members',
value: 'deleteUsers',
description: 'Remove one or more team members',
},
{
name: 'Get Device Team Members',
value: 'getDeviceTeamMembers',
description: 'Get team members with access to a specific WhatsApp number',
},
{
name: 'Create Team Member',
value: 'createDeviceUser',
description: 'Create a new team member with access to a WhatsApp number',
},
{
name: 'Grant Device Access',
value: 'grantDeviceUserAccess',
description: 'Grant existing user access to a WhatsApp number',
},
{
name: 'Revoke Device Access',
value: 'revokeDeviceUserAccess',
description: 'Revoke user access from a WhatsApp number',
},
],
default: 'getTeamUsers',
},
// GET TEAM USERS FILTERS
{
displayName: 'Filters',
name: 'filters',
type: 'collection',
placeholder: 'Add Filter',
default: {},
displayOptions: {
show: {
resource: ['team'],
operation: ['getTeamUsers'],
},
},
options: [
{
displayName: 'User IDs',
name: 'ids',
type: 'string',
typeOptions: {
multipleValues: true,
},
default: [],
description: 'Filter users by specific IDs',
},
{
displayName: 'Status',
name: 'status',
type: 'multiOptions',
options: [
{ name: 'Active', value: 'active' },
{ name: 'Pending', value: 'pending' },
{ name: 'Suspended', value: 'suspended' },
],
default: [],
description: 'Filter users by status',
},
{
displayName: 'Role',
name: 'role',
type: 'multiOptions',
options: [
{ name: 'Admin', value: 'admin' },
{ name: 'Supervisor', value: 'supervisor' },
{ name: 'Agent', value: 'agent' },
],
default: [],
description: 'Filter users by role',
},
{
displayName: 'Search',
name: 'search',
type: 'string',
default: '',
description: 'Search users by name or email',
},
{
displayName: 'Device ID',
name: 'device',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getDevices',
},
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['getTeamUsers'],
},
},
description: 'Filter users with access to a specific WhatsApp number',
},
{
displayName: 'Exclude User IDs',
name: 'exceptIds',
type: 'string',
typeOptions: {
multipleValues: true,
},
default: [],
description: 'Exclude specific user IDs from results',
},
{
displayName: 'Last Online Before',
name: 'onlineBefore',
type: 'dateTime',
default: '',
description: 'Filter users last seen online before this date',
},
{
displayName: 'Last Online After',
name: 'onlineAfter',
type: 'dateTime',
default: '',
description: 'Filter users last seen online after this date',
},
{
displayName: 'Last Login Before',
name: 'loginBefore',
type: 'dateTime',
default: '',
description: 'Filter users who logged in before this date',
},
{
displayName: 'Last Login After',
name: 'loginAfter',
type: 'dateTime',
default: '',
description: 'Filter users who logged in after this date',
},
{
displayName: 'Results Page Size',
name: 'size',
type: 'number',
default: 20,
description: 'Number of results per page',
},
{
displayName: 'Page Number',
name: 'page',
type: 'number',
default: 0,
description: 'Page number (starting from 0)',
},
],
},
// UPDATE TEAM USER PARAMETERS
{
displayName: 'User ID',
name: 'id',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['updateTeamUser'],
},
},
description: 'ID of the user to update (24 characters hexadecimal)',
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['team'],
operation: ['updateTeamUser'],
},
},
options: [
{
displayName: 'Display Name',
name: 'displayName',
type: 'string',
default: '',
description: 'New display name for the user (2-30 characters)',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
default: '',
description: 'New email address for the user',
},
{
displayName: 'Password',
name: 'password',
type: 'string',
typeOptions: {
password: true,
},
default: '',
description: 'New password for the user (5-50 characters)',
},
{
displayName: 'Role',
name: 'role',
type: 'options',
options: [
{ name: 'Admin', value: 'admin' },
{ name: 'Supervisor', value: 'supervisor' },
{ name: 'Agent', value: 'agent' },
],
default: '',
description: 'New role for the user',
},
{
displayName: 'Color',
name: 'color',
type: 'options',
options: [
{ name: 'Blue', value: 'blue' },
{ name: 'Azure', value: 'azure' },
{ name: 'Indigo', value: 'indigo' },
{ name: 'Purple', value: 'purple' },
{ name: 'Pink', value: 'pink' },
{ name: 'Red', value: 'red' },
{ name: 'Orange', value: 'orange' },
{ name: 'Yellow', value: 'yellow' },
{ name: 'Lime', value: 'lime' },
{ name: 'Green', value: 'green' },
{ name: 'Teal', value: 'teal' },
{ name: 'Cyan', value: 'cyan' },
{ name: 'Gray', value: 'gray' },
{ name: 'Gray Dark', value: 'gray-dark' },
],
default: '',
description: 'New color for the user',
},
],
},
// DELETE USERS PARAMETERS
{
displayName: 'Force Delete',
name: 'force',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['team'],
operation: ['deleteUsers'],
},
},
description: 'Whether to force delete users even if they have access to one or more WhatsApp numbers',
},
{
displayName: 'Users to Delete',
name: 'users',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
maxValues: 10,
},
default: { userItems: [{}] },
displayOptions: {
show: {
resource: ['team'],
operation: ['deleteUsers'],
},
},
options: [
{
name: 'userItems',
displayName: 'User',
values: [
{
displayName: 'Identifier Type',
name: 'identifierType',
type: 'options',
options: [
{ name: 'User ID', value: 'id' },
{ name: 'Email', value: 'email' },
],
default: 'id',
description: 'Type of identifier to use',
},
{
displayName: 'User ID',
name: 'id',
type: 'string',
default: '',
displayOptions: {
show: {
identifierType: ['id'],
},
},
description: 'ID of the user to delete (24 characters hexadecimal)',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
default: '',
displayOptions: {
show: {
identifierType: ['email'],
},
},
description: 'Email of the user to delete',
},
{
displayName: 'Action',
name: 'action',
type: 'options',
options: [
{ name: 'Unassign Chats', value: 'unassign' },
{ name: 'Reassign Chats', value: 'reassign' },
{ name: 'Resolve Chats', value: 'resolve' },
],
default: 'unassign',
description: 'Action to perform on the chats assigned to this user',
},
{
displayName: 'Reassign To User ID',
name: 'assign',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTeamAgents',
loadOptionsDependsOn: ['device'],
},
displayOptions: {
show: {
action: ['reassign'],
},
},
default: '',
description: 'User ID to reassign the chats to',
},
{
displayName: 'Remove Completely',
name: 'remove',
type: 'boolean',
default: false,
description: 'Whether to remove the user completely from the system even if they have access to other WhatsApp numbers',
},
],
},
],
description: 'List of users to delete',
},
// DEVICE TEAM OPERATIONS - COMMON PARAMETER
{
displayName: 'WhatsApp Number',
name: 'device',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getDevices',
},
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['getDeviceTeamMembers', 'createDeviceUser', 'grantDeviceUserAccess', 'revokeDeviceUserAccess'],
},
},
description: 'The ID of the WhatsApp number',
},
// CREATE DEVICE USER PARAMETERS
{
displayName: 'Display Name',
name: 'displayName',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['createDeviceUser'],
},
},
description: 'Display name for the new user (2-30 characters)',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['createDeviceUser'],
},
},
description: 'Email address for the new user',
},
{
displayName: 'Password',
name: 'password',
type: 'string',
required: true,
typeOptions: {
password: true,
},
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['createDeviceUser'],
},
},
description: 'Password for the new user (5-50 characters)',
},
{
displayName: 'Role',
name: 'role',
type: 'options',
required: true,
options: [
{ name: 'Admin', value: 'admin' },
{ name: 'Supervisor', value: 'supervisor' },
{ name: 'Agent', value: 'agent' },
],
default: 'agent',
displayOptions: {
show: {
resource: ['team'],
operation: ['createDeviceUser'],
},
},
description: 'Role for the new user',
},
{
displayName: 'Color',
name: 'color',
type: 'options',
required: true,
options: [
{ name: 'Blue', value: 'blue' },
{ name: 'Azure', value: 'azure' },
{ name: 'Indigo', value: 'indigo' },
{ name: 'Purple', value: 'purple' },
{ name: 'Pink', value: 'pink' },
{ name: 'Red', value: 'red' },
{ name: 'Orange', value: 'orange' },
{ name: 'Yellow', value: 'yellow' },
{ name: 'Lime', value: 'lime' },
{ name: 'Green', value: 'green' },
{ name: 'Teal', value: 'teal' },
{ name: 'Cyan', value: 'cyan' },
{ name: 'Gray', value: 'gray' },
{ name: 'Gray Dark', value: 'gray-dark' },
],
default: 'blue',
displayOptions: {
show: {
resource: ['team'],
operation: ['createDeviceUser'],
},
},
description: 'Color for the new user',
},
{
displayName: 'Send Invitation Email',
name: 'invite',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['team'],
operation: ['createDeviceUser'],
},
},
description: 'Whether to send an invitation email to the new user',
},
// GRANT DEVICE USER ACCESS PARAMETERS
{
displayName: 'User ID',
name: 'id',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTeamAgents',
loadOptionsDependsOn: ['device'],
},
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['grantDeviceUserAccess'],
},
},
description: 'ID of the user to grant access to (24 characters hexadecimal)',
},
// REVOKE DEVICE USER ACCESS PARAMETERS
{
displayName: 'User Identifier Type',
name: 'identifierType',
type: 'options',
required: true,
options: [
{ name: 'User ID', value: 'id' },
{ name: 'Email', value: 'email' },
],
default: 'id',
displayOptions: {
show: {
resource: ['team'],
operation: ['revokeDeviceUserAccess'],
},
},
description: 'Type of identifier to use',
},
{
displayName: 'User ID',
name: 'id',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['revokeDeviceUserAccess'],
identifierType: ['id'],
},
},
description: 'ID of the user to revoke access from (24 characters hexadecimal)',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['revokeDeviceUserAccess'],
identifierType: ['email'],
},
},
description: 'Email of the user to revoke access from',
},
{
displayName: 'Action',
name: 'action',
type: 'options',
options: [
{ name: 'Unassign Chats', value: 'unassign' },
{ name: 'Reassign Chats', value: 'reassign' },
{ name: 'Resolve Chats', value: 'resolve' },
],
default: 'unassign',
displayOptions: {
show: {
resource: ['team'],
operation: ['revokeDeviceUserAccess'],
},
},
description: 'Action to perform on the chats assigned to this user',
},
{
displayName: 'Reassign To User ID',
name: 'assign',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTeamAgents',
loadOptionsDependsOn: ['device'],
},
required: true,
default: '',
displayOptions: {
show: {
resource: ['team'],
operation: ['revokeDeviceUserAccess'],
action: ['reassign'],
},
},
description: 'User ID to reassign the chats to',
},
{
displayName: 'Remove Completely',
name: 'remove',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['team'],
operation: ['revokeDeviceUserAccess'],
},
},
description: 'Whether to remove the user completely from the system',
},
];
async function executeTeamOperations(index) {
const operation = this.getNodeParameter('operation', index);
// GET TEAM USERS
if (operation === 'getTeamUsers') {
const filters = this.getNodeParameter('filters', index, {});
const queryParameters = {};
// Add all filters to query parameters
for (const [key, value] of Object.entries(filters)) {
if (value !== undefined && value !== '' &&
(typeof value !== 'object' || (Array.isArray(value) && value.length > 0))) {
queryParameters[key] = value;
}
}
return (0, request_1.request)(this, 'GET', '/team', undefined, queryParameters);
}
// UPDATE TEAM USER
if (operation === 'updateTeamUser') {
const userId = this.getNodeParameter('id', index);
const updateFields = this.getNodeParameter('updateFields', index, {});
const body = {
id: userId,
};
// Add update fields to request body
for (const [key, value] of Object.entries(updateFields)) {
if (value !== undefined && value !== '') {
body[key] = value;
}
}
return (0, request_1.request)(this, 'PATCH', '/team', body);
}
// DELETE USERS
if (operation === 'deleteUsers') {
const force = this.getNodeParameter('force', index, false);
const usersCollection = this.getNodeParameter('users', index);
const users = usersCollection.userItems.map(item => {
const user = {
action: item.action,
remove: item.remove,
};
if (item.identifierType === 'id' && item.id) {
user.id = item.id;
}
else if (item.identifierType === 'email' && item.email) {
user.email = item.email;
}
if (item.action === 'reassign' && item.assign) {
user.assign = item.assign;
}
return user;
});
const body = {
force,
users,
};
return (0, request_1.request)(this, 'DELETE', '/team', body);
}
// GET DEVICE TEAM MEMBERS
if (operation === 'getDeviceTeamMembers') {
const device = this.getNodeParameter('device', index);
return (0, request_1.request)(this, 'GET', `/devices/${device}/team`);
}
// CREATE DEVICE USER
if (operation === 'createDeviceUser') {
const device = this.getNodeParameter('device', index);
const displayName = this.getNodeParameter('displayName', index);
const email = this.getNodeParameter('email', index);
const password = this.getNodeParameter('password', index);
const role = this.getNodeParameter('role', index);
const color = this.getNodeParameter('color', index);
const invite = this.getNodeParameter('invite', index, false);
const body = {
displayName,
email,
password,
role,
color,
invite,
};
return (0, request_1.request)(this, 'POST', `/devices/${device}/team`, body);
}
// GRANT DEVICE USER ACCESS
if (operation === 'grantDeviceUserAccess') {
const device = this.getNodeParameter('device', index);
const id = this.getNodeParameter('id', index);
return (0, request_1.request)(this, 'PATCH', `/devices/${device}/team`, { id });
}
// REVOKE DEVICE USER ACCESS
if (operation === 'revokeDeviceUserAccess') {
const device = this.getNodeParameter('device', index);
const identifierType = this.getNodeParameter('identifierType', index);
const action = this.getNodeParameter('action', index);
const remove = this.getNodeParameter('remove', index, false);
const body = {
action,
remove,
};
if (identifierType === 'id') {
const id = this.getNodeParameter('id', index);
body.id = id;
}
else {
const email = this.getNodeParameter('email', index);
body.email = email;
}
if (action === 'reassign') {
const assign = this.getNodeParameter('assign', index);
body.assign = assign;
}
return (0, request_1.request)(this, 'DELETE', `/devices/${device}/team`, body);
}
throw new Error(`The operation "${operation}" is not supported for team!`);
}
exports.executeTeamOperations = executeTeamOperations;