Team Ai
Apppublic

oex2003/evolution-api

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
onWhatsappCache.ts112 linesDownload Raw Back to utils
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