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 templateMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, name: { type: 'string' }, language: { type: 'string' }, components: { type: 'array' }, webhookUrl: { type: 'string' }, }, required: ['name', 'language'], }; const quotedOptionsSchema: JSONSchema7 = { properties: { key: { type: 'object', properties: { id: { type: 'string' }, remoteJid: { type: 'string' }, fromMe: { type: 'boolean', enum: [true, false] }, }, required: ['id'], ...isNotEmpty('id'), }, message: { type: 'object' }, }, }; export const offerCallSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, isVideo: { type: 'boolean', enum: [true, false] }, callDuration: { type: 'integer', minimum: 1, maximum: 15 }, }, required: ['number', 'callDuration'], }; export const textMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, text: { type: 'string' }, linkPreview: { type: 'boolean' }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number', 'text'], }; export const mediaMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, mediatype: { type: 'string', enum: ['image', 'document', 'video', 'audio'] }, mimetype: { type: 'string' }, media: { type: 'string' }, fileName: { type: 'string' }, caption: { type: 'string' }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number', 'mediatype'], }; export const ptvMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, video: { type: 'string' }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number'], }; export const audioMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, audio: { type: 'string' }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number'], }; export const statusMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { type: { type: 'string', enum: ['text', 'image', 'audio', 'video'] }, content: { type: 'string' }, caption: { type: 'string' }, backgroundColor: { type: 'string' }, font: { type: 'integer', minimum: 0, maximum: 5 }, statusJidList: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"statusJidList" must be an array of numeric strings', }, }, allContacts: { type: 'boolean', enum: [true, false] }, }, required: ['type'], }; export const stickerMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, sticker: { type: 'string' }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number'], }; export const locationMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, latitude: { type: 'number' }, longitude: { type: 'number' }, name: { type: 'string' }, address: { type: 'string' }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number', 'latitude', 'longitude', 'name', 'address'], }; export const contactMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, contact: { type: 'array', items: { type: 'object', properties: { fullName: { type: 'string' }, wuid: { type: 'string', minLength: 10, pattern: '\\d+', description: '"wuid" must be a numeric string', }, phoneNumber: { type: 'string', minLength: 10 }, organization: { type: 'string' }, email: { type: 'string' }, url: { type: 'string' }, }, required: ['fullName', 'phoneNumber'], ...isNotEmpty('fullName'), }, minItems: 1, uniqueItems: true, }, }, required: ['number', 'contact'], }; export const reactionMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { key: { type: 'object', properties: { id: { type: 'string' }, remoteJid: { type: 'string' }, fromMe: { type: 'boolean', enum: [true, false] }, }, required: ['id', 'remoteJid', 'fromMe'], ...isNotEmpty('id', 'remoteJid'), }, reaction: { type: 'string' }, }, required: ['key', 'reaction'], }; export const pollMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, name: { type: 'string' }, selectableCount: { type: 'integer', minimum: 0, maximum: 10 }, values: { type: 'array', minItems: 2, maxItems: 10, uniqueItems: true, items: { type: 'string', }, }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number', 'name', 'selectableCount', 'values'], }; export const listMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, title: { type: 'string' }, description: { type: 'string' }, footerText: { type: 'string' }, buttonText: { type: 'string' }, sections: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'object', properties: { title: { type: 'string' }, rows: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'object', properties: { title: { type: 'string' }, description: { type: 'string' }, rowId: { type: 'string' }, }, required: ['title', 'rowId'], ...isNotEmpty('title', 'description', 'rowId'), }, }, }, required: ['title', 'rows'], ...isNotEmpty('title'), }, }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number', 'title', 'footerText', 'buttonText', 'sections'], }; export const buttonsMessageSchema: JSONSchema7 = { $id: v4(), type: 'object', properties: { number: { ...numberDefinition }, thumbnailUrl: { type: 'string' }, title: { type: 'string' }, description: { type: 'string' }, footer: { type: 'string' }, buttons: { type: 'array', items: { type: 'object', properties: { type: { type: 'string', enum: ['reply', 'copy', 'url', 'call', 'pix'], }, displayText: { type: 'string' }, id: { type: 'string' }, url: { type: 'string' }, phoneNumber: { type: 'string' }, currency: { type: 'string' }, name: { type: 'string' }, keyType: { type: 'string', enum: ['phone', 'email', 'cpf', 'cnpj', 'random'] }, key: { type: 'string' }, }, required: ['type'], ...isNotEmpty('id', 'url', 'phoneNumber'), }, }, delay: { type: 'integer', description: 'Enter a value in milliseconds', }, quoted: { ...quotedOptionsSchema }, everyOne: { type: 'boolean', enum: [true, false] }, mentioned: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', pattern: '^\\d+', description: '"mentioned" must be an array of numeric strings', }, }, }, required: ['number'], };