oex2003/evolution-api
0
1import { prismaRepository } from '@api/server.module';2import { configService, Database } from '@config/env.config';3import dayjs from 'dayjs';4 5function getAvailableNumbers(remoteJid: string) {6 const numbersAvailable: string[] = [];7 8 if (remoteJid.startsWith('+')) {9 remoteJid = remoteJid.slice(1);10 }11 12 const [number, domain] = remoteJid.split('@');13 14 // Brazilian numbers15 if (remoteJid.startsWith('55')) {16 const numberWithDigit =17 number.slice(4, 5) === '9' && number.length === 13 ? number : `${number.slice(0, 4)}9${number.slice(4)}`;18 const numberWithoutDigit = number.length === 12 ? number : number.slice(0, 4) + number.slice(5);19 20 numbersAvailable.push(numberWithDigit);21 numbersAvailable.push(numberWithoutDigit);22 }23 24 // Mexican/Argentina numbers25 // Ref: https://faq.whatsapp.com/129484105794878426 else if (number.startsWith('52') || number.startsWith('54')) {27 let prefix = '';28 if (number.startsWith('52')) {29 prefix = '1';30 }31 if (number.startsWith('54')) {32 prefix = '9';33 }34 35 const numberWithDigit =36 number.slice(2, 3) === prefix && number.length === 1337 ? number38 : `${number.slice(0, 2)}${prefix}${number.slice(2)}`;39 const numberWithoutDigit = number.length === 12 ? number : number.slice(0, 2) + number.slice(3);40 41 numbersAvailable.push(numberWithDigit);42 numbersAvailable.push(numberWithoutDigit);43 }44 45 // Other countries46 else {47 numbersAvailable.push(remoteJid);48 }49 50 return numbersAvailable.map((number) => `${number}@${domain}`);51}52 53interface ISaveOnWhatsappCacheParams {54 remoteJid: string;55 lid?: string;56}57 58export async function saveOnWhatsappCache(data: ISaveOnWhatsappCacheParams[]) {59 if (configService.get<Database>('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) {60 const upsertsQuery = data.map((item) => {61 const remoteJid = item.remoteJid.startsWith('+') ? item.remoteJid.slice(1) : item.remoteJid;62 const numbersAvailable = getAvailableNumbers(remoteJid);63 64 return prismaRepository.isOnWhatsapp.upsert({65 create: {66 remoteJid: remoteJid,67 jidOptions: numbersAvailable.join(','),68 lid: item.lid,69 },70 update: {71 jidOptions: numbersAvailable.join(','),72 lid: item.lid,73 },74 where: { remoteJid: remoteJid },75 });76 });77 78 await prismaRepository.$transaction(upsertsQuery);79 }80}81 82export async function getOnWhatsappCache(remoteJids: string[]) {83 let results: {84 remoteJid: string;85 number: string;86 jidOptions: string[];87 lid?: string;88 }[] = [];89 90 if (configService.get<Database>('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) {91 const remoteJidsWithoutPlus = remoteJids.map((remoteJid) => getAvailableNumbers(remoteJid)).flat();92 93 const onWhatsappCache = await prismaRepository.isOnWhatsapp.findMany({94 where: {95 OR: remoteJidsWithoutPlus.map((remoteJid) => ({ jidOptions: { contains: remoteJid } })),96 updatedAt: {97 gte: dayjs().subtract(configService.get<Database>('DATABASE').SAVE_DATA.IS_ON_WHATSAPP_DAYS, 'days').toDate(),98 },99 },100 });101 102 results = onWhatsappCache.map((item) => ({103 remoteJid: item.remoteJid,104 number: item.remoteJid.split('@')[0],105 jidOptions: item.jidOptions.split(','),106 lid: item.lid,107 }));108 }109 110 return results;111}112 