import { prismaRepository } from '@api/server.module'; import { configService, Database } from '@config/env.config'; import dayjs from 'dayjs'; function getAvailableNumbers(remoteJid: string) { const numbersAvailable: string[] = []; if (remoteJid.startsWith('+')) { remoteJid = remoteJid.slice(1); } const [number, domain] = remoteJid.split('@'); // Brazilian numbers if (remoteJid.startsWith('55')) { const numberWithDigit = number.slice(4, 5) === '9' && number.length === 13 ? number : `${number.slice(0, 4)}9${number.slice(4)}`; const numberWithoutDigit = number.length === 12 ? number : number.slice(0, 4) + number.slice(5); numbersAvailable.push(numberWithDigit); numbersAvailable.push(numberWithoutDigit); } // Mexican/Argentina numbers // Ref: https://faq.whatsapp.com/1294841057948784 else if (number.startsWith('52') || number.startsWith('54')) { let prefix = ''; if (number.startsWith('52')) { prefix = '1'; } if (number.startsWith('54')) { prefix = '9'; } const numberWithDigit = number.slice(2, 3) === prefix && number.length === 13 ? number : `${number.slice(0, 2)}${prefix}${number.slice(2)}`; const numberWithoutDigit = number.length === 12 ? number : number.slice(0, 2) + number.slice(3); numbersAvailable.push(numberWithDigit); numbersAvailable.push(numberWithoutDigit); } // Other countries else { numbersAvailable.push(remoteJid); } return numbersAvailable.map((number) => `${number}@${domain}`); } interface ISaveOnWhatsappCacheParams { remoteJid: string; } export async function saveOnWhatsappCache(data: ISaveOnWhatsappCacheParams[]) { if (configService.get('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) { const upsertsQuery = data.map((item) => { const remoteJid = item.remoteJid.startsWith('+') ? item.remoteJid.slice(1) : item.remoteJid; const numbersAvailable = getAvailableNumbers(remoteJid); return prismaRepository.isOnWhatsapp.upsert({ create: { remoteJid: remoteJid, jidOptions: numbersAvailable.join(',') }, update: { jidOptions: numbersAvailable.join(',') }, where: { remoteJid: remoteJid }, }); }); await prismaRepository.$transaction(upsertsQuery); } } export async function getOnWhatsappCache(remoteJids: string[]) { let results: { remoteJid: string; number: string; jidOptions: string[]; }[] = []; if (configService.get('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) { const remoteJidsWithoutPlus = remoteJids.map((remoteJid) => getAvailableNumbers(remoteJid)).flat(); const onWhatsappCache = await prismaRepository.isOnWhatsapp.findMany({ where: { OR: remoteJidsWithoutPlus.map((remoteJid) => ({ jidOptions: { contains: remoteJid } })), updatedAt: { gte: dayjs().subtract(configService.get('DATABASE').SAVE_DATA.IS_ON_WHATSAPP_DAYS, 'days').toDate(), }, }, }); results = onWhatsappCache.map((item) => ({ remoteJid: item.remoteJid, number: item.remoteJid.split('@')[0], jidOptions: item.jidOptions.split(','), })); } return results; }