From 7a76600cd63f07650df1ea37428067fe2d0b03b0 Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Wed, 28 Aug 2024 12:11:32 -0300 Subject: [PATCH] Added redis cache for on whatsapp & TTL on .env --- .env.example | 6 +++ src/api/services/cache.service.ts | 4 +- src/config/env.config.ts | 7 +++ src/utils/onWhatsappCache.ts | 76 ++++++++++++++++++++++++++----- 4 files changed, 80 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index 620af393..335acfef 100644 --- a/.env.example +++ b/.env.example @@ -37,6 +37,7 @@ DATABASE_SAVE_DATA_CHATS=true DATABASE_SAVE_DATA_LABELS=true DATABASE_SAVE_DATA_HISTORIC=true DATABASE_SAVE_IS_ON_WHATSAPP=true +DATABASE_SAVE_IS_ON_WHATSAPP_DAYS=7 # RabbitMQ - Environment variables RABBITMQ_ENABLED=false @@ -172,12 +173,17 @@ DIFY_ENABLED=false # Redis Cache enabled CACHE_REDIS_ENABLED=true CACHE_REDIS_URI=redis://localhost:6379/6 +CACHE_REDIS_TTL=604800 # Prefix serves to differentiate data from one installation to another that are using the same redis CACHE_REDIS_PREFIX_KEY=evolution # Enabling this variable will save the connection information in Redis and not in the database. CACHE_REDIS_SAVE_INSTANCES=false # Local Cache enabled CACHE_LOCAL_ENABLED=false +# Local Cache enabled +CACHE_SAVE_IS_ON_WHATSAPP=true +CACHE_REDIS_SAVE_IS_ON_WHATSAPP=false +CACHE_REDIS_SAVE_IS_ON_WHATSAPP_DAYS=7 # Amazon S3 - Environment variables S3_ENABLED=false diff --git a/src/api/services/cache.service.ts b/src/api/services/cache.service.ts index 1004bb9c..2e8cd275 100644 --- a/src/api/services/cache.service.ts +++ b/src/api/services/cache.service.ts @@ -35,11 +35,11 @@ export class CacheService { } } - async set(key: string, value: any) { + async set(key: string, value: any, ttl?: number) { if (!this.cache) { return; } - this.cache.set(key, value); + this.cache.set(key, value, ttl); } public async hSet(key: string, field: string, value: any) { diff --git a/src/config/env.config.ts b/src/config/env.config.ts index 998d298a..0330e225 100644 --- a/src/config/env.config.ts +++ b/src/config/env.config.ts @@ -44,6 +44,7 @@ export type SaveData = { CHATS: boolean; LABELS: boolean; IS_ON_WHATSAPP: boolean; + IS_ON_WHATSAPP_DAYS: number; }; export type DBConnection = { @@ -168,6 +169,8 @@ export type CacheConfRedis = { PREFIX_KEY: string; TTL: number; SAVE_INSTANCES: boolean; + SAVE_IS_ON_WHATSAPP: boolean; + SAVE_IS_ON_WHATSAPP_TTL: number; }; export type CacheConfLocal = { ENABLED: boolean; @@ -297,6 +300,7 @@ export class ConfigService { HISTORIC: process.env?.DATABASE_SAVE_DATA_HISTORIC === 'true', LABELS: process.env?.DATABASE_SAVE_DATA_LABELS === 'true', IS_ON_WHATSAPP: process.env?.DATABASE_SAVE_IS_ON_WHATSAPP === 'true', + IS_ON_WHATSAPP_DAYS: Number.parseInt(process.env?.DATABASE_SAVE_IS_ON_WHATSAPP_DAYS ?? '7'), }, }, RABBITMQ: { @@ -453,6 +457,9 @@ export class ConfigService { PREFIX_KEY: process.env?.CACHE_REDIS_PREFIX_KEY || 'evolution-cache', TTL: Number.parseInt(process.env?.CACHE_REDIS_TTL) || 604800, SAVE_INSTANCES: process.env?.CACHE_REDIS_SAVE_INSTANCES === 'true', + SAVE_IS_ON_WHATSAPP: process.env?.CACHE_REDIS_SAVE_IS_ON_WHATSAPP === 'true', + SAVE_IS_ON_WHATSAPP_TTL: + (Number.parseInt(process.env?.CACHE_REDIS_SAVE_IS_ON_WHATSAPP_TTL) || 7) * 24 * 60 * 60, }, LOCAL: { ENABLED: process.env?.CACHE_LOCAL_ENABLED === 'true', diff --git a/src/utils/onWhatsappCache.ts b/src/utils/onWhatsappCache.ts index 285be212..bc7a5c06 100644 --- a/src/utils/onWhatsappCache.ts +++ b/src/utils/onWhatsappCache.ts @@ -1,9 +1,7 @@ -import { prismaRepository } from '@api/server.module'; -import { configService, Database } from '@config/env.config'; +import { cache, prismaRepository } from '@api/server.module'; +import { CacheConf, configService, Database } from '@config/env.config'; import dayjs from 'dayjs'; -const ON_WHATSAPP_CACHE_EXPIRATION = 7; // days - function getAvailableNumbers(remoteJid: string) { const numbersAvailable: string[] = []; @@ -56,6 +54,23 @@ interface ISaveOnWhatsappCacheParams { remoteJid: string; } export async function saveOnWhatsappCache(data: ISaveOnWhatsappCacheParams[]) { + const cacheConfig = configService.get('CACHE'); + + if (cacheConfig.REDIS.ENABLED && cacheConfig.REDIS.SAVE_IS_ON_WHATSAPP) { + await Promise.all( + data.map(async (item) => { + const remoteJid = item.remoteJid.startsWith('+') ? item.remoteJid.slice(1) : item.remoteJid; + const numbersAvailable = getAvailableNumbers(remoteJid); + + await cache.set( + `isOnWhatsapp:${remoteJid}`, + JSON.stringify({ jidOptions: numbersAvailable }), + cacheConfig.REDIS.SAVE_IS_ON_WHATSAPP_TTL, + ); + }), + ); + } + 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; @@ -73,6 +88,43 @@ export async function saveOnWhatsappCache(data: ISaveOnWhatsappCacheParams[]) { } export async function getOnWhatsappCache(remoteJids: string[]) { + const cacheConfig = configService.get('CACHE'); + + const results: { + remoteJid: string; + number: string; + jidOptions: string[]; + }[] = []; + + if (cacheConfig.REDIS.ENABLED && cacheConfig.REDIS.SAVE_IS_ON_WHATSAPP) { + const data = await Promise.all( + remoteJids.map(async (remoteJid) => { + const remoteJidWithoutPlus = remoteJid.startsWith('+') ? remoteJid.slice(1) : remoteJid; + const cacheData = await cache.get(`isOnWhatsapp:${remoteJidWithoutPlus}`); + + if (cacheData) { + return { + remoteJid: remoteJidWithoutPlus, + number: remoteJidWithoutPlus.split('@')[0], + jidOptions: JSON.parse(cacheData)?.jidOptions, + }; + } + + return null; + }), + ); + + data.forEach((item) => { + if (item) { + results.push({ + remoteJid: item.remoteJid, + number: item.number, + jidOptions: item.jidOptions, + }); + } + }); + } + if (configService.get('DATABASE').SAVE_DATA.IS_ON_WHATSAPP) { const remoteJidsWithoutPlus = remoteJids.map((remoteJid) => getAvailableNumbers(remoteJid)).flat(); @@ -80,17 +132,19 @@ export async function getOnWhatsappCache(remoteJids: string[]) { where: { OR: remoteJidsWithoutPlus.map((remoteJid) => ({ jidOptions: { contains: remoteJid } })), updatedAt: { - gte: dayjs().subtract(ON_WHATSAPP_CACHE_EXPIRATION, 'days').toDate(), + gte: dayjs().subtract(configService.get('DATABASE').SAVE_DATA.IS_ON_WHATSAPP_DAYS, 'days').toDate(), }, }, }); - return onWhatsappCache.map((item) => ({ - remoteJid: item.remoteJid, - number: item.remoteJid.split('@')[0], - jidOptions: item.jidOptions.split(','), - })); + onWhatsappCache.forEach((item) => + results.push({ + remoteJid: item.remoteJid, + number: item.remoteJid.split('@')[0], + jidOptions: item.jidOptions.split(','), + }), + ); } - return []; + return results; }