evolution-api/src/validate/chat.schema.ts
2024-06-07 19:16:51 -03:00

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: {
read_messages: {
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: ['read_messages'],
};
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' },
},
};