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' }, }, };