From 5abab2ef05fe5d7dadd05db00b4bd73ee58c86ab Mon Sep 17 00:00:00 2001 From: adriano Date: Wed, 21 Feb 2024 11:23:51 -0300 Subject: [PATCH] feat: Optimize user search via Redis for backend access --- backend/src/helpers/RedisClient.ts | 23 ++- backend/src/server.ts | 2 +- .../WbotServices/wbotMessageListener.ts | 11 +- package-lock.json | 152 +++++++++++++++++- package.json | 5 + 5 files changed, 180 insertions(+), 13 deletions(-) create mode 100644 package.json diff --git a/backend/src/helpers/RedisClient.ts b/backend/src/helpers/RedisClient.ts index 30d6fc0..aadc8c8 100644 --- a/backend/src/helpers/RedisClient.ts +++ b/backend/src/helpers/RedisClient.ts @@ -17,17 +17,32 @@ export async function get(key: string) { return JSON.parse(value); } -export async function findByContain() { +export async function findByContain( + key: string, + keyName: string, + substring: string +) { // const keys = await redis.keys("*" + substring + "*"); - const keys = await redis.keys("user:*"); + // const keys = await redis.keys("user:*"); + + const keys = await redis.keys(key); const results: any[] = []; + for (const key of keys) { const value = await redis.get(key); if (value) { - results.push(JSON.parse(value)); + const obj = JSON.parse(value); + if ( + substring + ?.trim() + ?.toLowerCase() + .includes(obj[keyName]?.trim()?.toLowerCase()) + ) { + results.push(obj); + } } - } + } return results; } diff --git a/backend/src/server.ts b/backend/src/server.ts index b3b687b..f02362b 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -48,7 +48,7 @@ gracefulShutdown(server); for (const user of users) { const { id, name } = user; - await set(`user:${id}:${name.toLowerCase()}`, { id, name }); + await set(`user:${id}`, { id, name }); } loadSettings(); diff --git a/backend/src/services/WbotServices/wbotMessageListener.ts b/backend/src/services/WbotServices/wbotMessageListener.ts index e269cc2..b105c71 100644 --- a/backend/src/services/WbotServices/wbotMessageListener.ts +++ b/backend/src/services/WbotServices/wbotMessageListener.ts @@ -761,12 +761,9 @@ const handleMessage = async ( // Transfer to agent if (!msg.fromMe) { - const listUser = await findByContain(); + const filteredUsers = await findByContain("user:*", "name", msg?.body); + - let filteredUsers = listUser.filter(user => - msg?.body?.trim()?.toLowerCase().includes(user.name) - ); - if (filteredUsers && filteredUsers.length > 0) { const whatsappQueues = await ListWhatsappQueuesByUserQueue( +filteredUsers[0].id @@ -781,11 +778,11 @@ const handleMessage = async ( +filteredUsers[0].id, ticket, +obj.queueId - ); + ); await botSendMessage( ticket, - `VocĂȘ foi transferido para falar com o agente ${filteredUsers[0].name}` + `VocĂȘ foi transferido para falar com o agente ${filteredUsers[0].name}, aguarde.` ); } diff --git a/package-lock.json b/package-lock.json index a72869e..f1ff13b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,5 +2,155 @@ "name": "whaticket", "lockfileVersion": 2, "requires": true, - "packages": {} + "packages": { + "": { + "dependencies": { + "natural": "^6.10.4" + } + }, + "node_modules/afinn-165": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/afinn-165/-/afinn-165-1.0.4.tgz", + "integrity": "sha512-7+Wlx3BImrK0HiG6y3lU4xX7SpBPSSu8T9iguPMlaueRFxjbYwAQrp9lqZUuFikqKbd/en8lVREILvP2J80uJA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/afinn-165-financialmarketnews": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/afinn-165-financialmarketnews/-/afinn-165-financialmarketnews-3.0.0.tgz", + "integrity": "sha512-0g9A1S3ZomFIGDTzZ0t6xmv4AuokBvBmpes8htiyHpH7N4xDmvSQL6UxL/Zcs2ypRb3VwgCscaD8Q3zEawKYhw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "dependencies": { + "sylvester": ">= 0.0.8" + }, + "engines": { + "node": ">=0.2.6" + } + }, + "node_modules/natural": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/natural/-/natural-6.10.4.tgz", + "integrity": "sha512-PpqKTyRwNsYrTQ7/2El9X96pt7OCKynwGahl9oIBQEz9d71jxnHQ0KkuWg7xOC7ZvG0gRSkJ56q7Ygr5zfof2w==", + "dependencies": { + "afinn-165": "^1.0.2", + "afinn-165-financialmarketnews": "^3.0.0", + "apparatus": "^0.0.10", + "safe-stable-stringify": "^2.2.0", + "stopwords-iso": "^1.1.0", + "sylvester": "^0.0.12", + "underscore": "^1.9.1", + "wordnet-db": "^3.1.11" + }, + "engines": { + "node": ">=0.4.10" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/stopwords-iso": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stopwords-iso/-/stopwords-iso-1.1.0.tgz", + "integrity": "sha512-I6GPS/E0zyieHehMRPQcqkiBMJKGgLta+1hREixhoLPqEA0AlVFiC43dl8uPpmkkeRdDMzYRWFWk5/l9x7nmNg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sylvester": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.12.tgz", + "integrity": "sha512-SzRP5LQ6Ts2G5NyAa/jg16s8e3R7rfdFjizy1zeoecYWw+nGL+YA1xZvW/+iJmidBGSdLkuvdwTYEyJEb+EiUw==", + "engines": { + "node": ">=0.2.6" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/wordnet-db": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/wordnet-db/-/wordnet-db-3.1.14.tgz", + "integrity": "sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag==", + "engines": { + "node": ">=0.6.0" + } + } + }, + "dependencies": { + "afinn-165": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/afinn-165/-/afinn-165-1.0.4.tgz", + "integrity": "sha512-7+Wlx3BImrK0HiG6y3lU4xX7SpBPSSu8T9iguPMlaueRFxjbYwAQrp9lqZUuFikqKbd/en8lVREILvP2J80uJA==" + }, + "afinn-165-financialmarketnews": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/afinn-165-financialmarketnews/-/afinn-165-financialmarketnews-3.0.0.tgz", + "integrity": "sha512-0g9A1S3ZomFIGDTzZ0t6xmv4AuokBvBmpes8htiyHpH7N4xDmvSQL6UxL/Zcs2ypRb3VwgCscaD8Q3zEawKYhw==" + }, + "apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "requires": { + "sylvester": ">= 0.0.8" + } + }, + "natural": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/natural/-/natural-6.10.4.tgz", + "integrity": "sha512-PpqKTyRwNsYrTQ7/2El9X96pt7OCKynwGahl9oIBQEz9d71jxnHQ0KkuWg7xOC7ZvG0gRSkJ56q7Ygr5zfof2w==", + "requires": { + "afinn-165": "^1.0.2", + "afinn-165-financialmarketnews": "^3.0.0", + "apparatus": "^0.0.10", + "safe-stable-stringify": "^2.2.0", + "stopwords-iso": "^1.1.0", + "sylvester": "^0.0.12", + "underscore": "^1.9.1", + "wordnet-db": "^3.1.11" + } + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "stopwords-iso": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stopwords-iso/-/stopwords-iso-1.1.0.tgz", + "integrity": "sha512-I6GPS/E0zyieHehMRPQcqkiBMJKGgLta+1hREixhoLPqEA0AlVFiC43dl8uPpmkkeRdDMzYRWFWk5/l9x7nmNg==" + }, + "sylvester": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.12.tgz", + "integrity": "sha512-SzRP5LQ6Ts2G5NyAa/jg16s8e3R7rfdFjizy1zeoecYWw+nGL+YA1xZvW/+iJmidBGSdLkuvdwTYEyJEb+EiUw==" + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "wordnet-db": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/wordnet-db/-/wordnet-db-3.1.14.tgz", + "integrity": "sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag==" + } + } } diff --git a/package.json b/package.json new file mode 100644 index 0000000..bc81733 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "natural": "^6.10.4" + } +}