mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-07-23 17:08:44 -06:00

Refactored sendMessage.controller.ts, chat.dto.ts, and sendMessage.dto.ts to improve message handling. Updated chatwoot.service.ts and sendMessage.router.ts for better integration with Chatwoot. Enhanced whatsapp.baileys.service.ts for more reliable WhatsApp communication. Adjusted chat.schema.ts and message.schema.ts for validation improvements. These changes enhance the overall messaging functionality and reliability.
318 lines
7.6 KiB
TypeScript
318 lines
7.6 KiB
TypeScript
import { JSONSchema7, JSONSchema7Definition } from 'json-schema';
|
|
import { v4 } from 'uuid';
|
|
|
|
const isNotEmpty = (...propertyNames: string[]): JSONSchema7 => {
|
|
const properties = {};
|
|
propertyNames.forEach(
|
|
(property) =>
|
|
(properties[property] = {
|
|
minLength: 1,
|
|
description: `The "${property}" cannot be empty`,
|
|
}),
|
|
);
|
|
return {
|
|
if: {
|
|
propertyNames: {
|
|
enum: [...propertyNames],
|
|
},
|
|
},
|
|
then: { properties },
|
|
};
|
|
};
|
|
|
|
const numberDefinition: JSONSchema7Definition = {
|
|
type: 'string',
|
|
description: 'Invalid format',
|
|
};
|
|
|
|
export const whatsappNumberSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
numbers: {
|
|
type: 'array',
|
|
minItems: 1,
|
|
uniqueItems: true,
|
|
items: {
|
|
type: 'string',
|
|
description: '"numbers" must be an array of numeric strings',
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
export const readMessageSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
readMessages: {
|
|
type: 'array',
|
|
minItems: 1,
|
|
uniqueItems: true,
|
|
items: {
|
|
properties: {
|
|
id: { type: 'string' },
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
remoteJid: { type: 'string' },
|
|
},
|
|
required: ['id', 'fromMe', 'remoteJid'],
|
|
...isNotEmpty('id', 'remoteJid'),
|
|
},
|
|
},
|
|
},
|
|
required: ['readMessages'],
|
|
};
|
|
|
|
export const archiveChatSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
chat: { type: 'string' },
|
|
lastMessage: {
|
|
type: 'object',
|
|
properties: {
|
|
key: {
|
|
type: 'object',
|
|
properties: {
|
|
id: { type: 'string' },
|
|
remoteJid: { type: 'string' },
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
},
|
|
required: ['id', 'fromMe', 'remoteJid'],
|
|
...isNotEmpty('id', 'remoteJid'),
|
|
},
|
|
messageTimestamp: { type: 'integer', minLength: 1 },
|
|
},
|
|
required: ['key'],
|
|
...isNotEmpty('messageTimestamp'),
|
|
},
|
|
archive: { type: 'boolean', enum: [true, false] },
|
|
},
|
|
required: ['archive'],
|
|
};
|
|
|
|
export const markChatUnreadSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
chat: { type: 'string' },
|
|
lastMessage: {
|
|
type: 'object',
|
|
properties: {
|
|
key: {
|
|
type: 'object',
|
|
properties: {
|
|
id: { type: 'string' },
|
|
remoteJid: { type: 'string' },
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
},
|
|
required: ['id', 'fromMe', 'remoteJid'],
|
|
...isNotEmpty('id', 'remoteJid'),
|
|
},
|
|
messageTimestamp: { type: 'integer', minLength: 1 },
|
|
},
|
|
required: ['key'],
|
|
...isNotEmpty('messageTimestamp'),
|
|
},
|
|
},
|
|
required: ['lastMessage'],
|
|
};
|
|
|
|
export const deleteMessageSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
id: { type: 'string' },
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
remoteJid: { type: 'string' },
|
|
participant: { type: 'string' },
|
|
},
|
|
required: ['id', 'fromMe', 'remoteJid'],
|
|
...isNotEmpty('id', 'remoteJid', 'participant'),
|
|
};
|
|
|
|
export const profilePictureSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
number: { type: 'string' },
|
|
picture: { type: 'string' },
|
|
},
|
|
};
|
|
|
|
export const updateMessageSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
number: { type: 'string' },
|
|
text: { type: 'string' },
|
|
key: {
|
|
type: 'object',
|
|
properties: {
|
|
id: { type: 'string' },
|
|
remoteJid: { type: 'string' },
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
},
|
|
required: ['id', 'fromMe', 'remoteJid'],
|
|
...isNotEmpty('id', 'remoteJid'),
|
|
},
|
|
},
|
|
...isNotEmpty('number', 'text', 'key'),
|
|
};
|
|
|
|
export const presenceSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
number: { ...numberDefinition },
|
|
delay: { type: 'number' },
|
|
presence: {
|
|
type: 'string',
|
|
enum: ['unavailable', 'available', 'composing', 'recording', 'paused'],
|
|
},
|
|
},
|
|
required: ['number', 'presence', 'delay'],
|
|
};
|
|
|
|
export const blockUserSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
number: { type: 'string' },
|
|
status: { type: 'string', enum: ['block', 'unblock'] },
|
|
},
|
|
required: ['number', 'status'],
|
|
...isNotEmpty('number', 'status'),
|
|
};
|
|
|
|
export const contactValidateSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
where: {
|
|
type: 'object',
|
|
properties: {
|
|
_id: { type: 'string', minLength: 1 },
|
|
pushName: { type: 'string', minLength: 1 },
|
|
id: { type: 'string', minLength: 1 },
|
|
},
|
|
...isNotEmpty('_id', 'id', 'pushName'),
|
|
},
|
|
},
|
|
};
|
|
|
|
export const messageValidateSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
where: {
|
|
type: 'object',
|
|
properties: {
|
|
_id: { type: 'string', minLength: 1 },
|
|
key: {
|
|
type: 'object',
|
|
if: {
|
|
propertyNames: {
|
|
enum: ['fromMe', 'remoteJid', 'id'],
|
|
},
|
|
},
|
|
then: {
|
|
properties: {
|
|
remoteJid: {
|
|
type: 'string',
|
|
minLength: 1,
|
|
description: 'The property cannot be empty',
|
|
},
|
|
id: {
|
|
type: 'string',
|
|
minLength: 1,
|
|
description: 'The property cannot be empty',
|
|
},
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
},
|
|
},
|
|
},
|
|
message: { type: 'object' },
|
|
},
|
|
...isNotEmpty('_id'),
|
|
},
|
|
limit: { type: 'integer' },
|
|
},
|
|
};
|
|
|
|
export const messageUpSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
where: {
|
|
type: 'object',
|
|
properties: {
|
|
_id: { type: 'string' },
|
|
remoteJid: { type: 'string' },
|
|
id: { type: 'string' },
|
|
fromMe: { type: 'boolean', enum: [true, false] },
|
|
participant: { type: 'string' },
|
|
status: {
|
|
type: 'string',
|
|
enum: ['ERROR', 'PENDING', 'SERVER_ACK', 'DELIVERY_ACK', 'READ', 'PLAYED'],
|
|
},
|
|
},
|
|
...isNotEmpty('_id', 'remoteJid', 'id', 'status'),
|
|
},
|
|
limit: { type: 'integer' },
|
|
},
|
|
};
|
|
|
|
export const privacySettingsSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
readreceipts: { type: 'string', enum: ['all', 'none'] },
|
|
profile: {
|
|
type: 'string',
|
|
enum: ['all', 'contacts', 'contact_blacklist', 'none'],
|
|
},
|
|
status: {
|
|
type: 'string',
|
|
enum: ['all', 'contacts', 'contact_blacklist', 'none'],
|
|
},
|
|
online: { type: 'string', enum: ['all', 'match_last_seen'] },
|
|
last: { type: 'string', enum: ['all', 'contacts', 'contact_blacklist', 'none'] },
|
|
groupadd: {
|
|
type: 'string',
|
|
enum: ['all', 'contacts', 'contact_blacklist', 'none'],
|
|
},
|
|
},
|
|
required: ['readreceipts', 'profile', 'status', 'online', 'last', 'groupadd'],
|
|
...isNotEmpty('readreceipts', 'profile', 'status', 'online', 'last', 'groupadd'),
|
|
};
|
|
|
|
export const profileNameSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
name: { type: 'string' },
|
|
},
|
|
...isNotEmpty('name'),
|
|
};
|
|
|
|
export const profileStatusSchema: JSONSchema7 = {
|
|
$id: v4(),
|
|
type: 'object',
|
|
properties: {
|
|
status: { type: 'string' },
|
|
},
|
|
...isNotEmpty('status'),
|
|
};
|
|
|
|
export const profileSchema: JSONSchema7 = {
|
|
type: 'object',
|
|
properties: {
|
|
wuid: { type: 'string' },
|
|
name: { type: 'string' },
|
|
picture: { type: 'string' },
|
|
status: { type: 'string' },
|
|
isBusiness: { type: 'boolean' },
|
|
},
|
|
};
|