From 34c53d352a922a82bd923312720610f37dd2ef2d Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Wed, 7 Feb 2024 15:16:37 -0300 Subject: [PATCH 1/3] Refactor code and remove commented out sections --- src/utils/i18n.ts | 4 ---- src/whatsapp/abstract/abstract.router.ts | 5 ----- src/whatsapp/controllers/settings.controller.ts | 3 --- src/whatsapp/routers/chatwoot.router.ts | 1 - src/whatsapp/routers/settings.router.ts | 1 - src/whatsapp/services/chatwoot.service.ts | 10 ---------- 6 files changed, 24 deletions(-) diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts index 65feab48..74a76724 100644 --- a/src/utils/i18n.ts +++ b/src/utils/i18n.ts @@ -4,8 +4,6 @@ import path from 'path'; import { ConfigService, Language } from '../config/env.config'; -// export class i18n { -// constructor(private readonly configService: ConfigService) { const languages = ['en', 'pt-BR']; const translationsPath = path.join(__dirname, 'translations'); const configService: ConfigService = new ConfigService(); @@ -31,6 +29,4 @@ i18next.init({ escapeValue: false, }, }); -// } -// } export default i18next; diff --git a/src/whatsapp/abstract/abstract.router.ts b/src/whatsapp/abstract/abstract.router.ts index 7c603880..18770ffa 100644 --- a/src/whatsapp/abstract/abstract.router.ts +++ b/src/whatsapp/abstract/abstract.router.ts @@ -21,7 +21,6 @@ const logger = new Logger('Validate'); export abstract class RouterBroker { constructor() {} public routerPath(path: string, param = true) { - // const route = param ? '/:instanceName/' + path : '/' + path; let route = '/' + path; param ? (route += '/:instanceName') : null; @@ -56,10 +55,6 @@ export abstract class RouterBroker { message = stack.replace('instance.', ''); } return message; - // return { - // property: property.replace('instance.', ''), - // message, - // }; }); logger.error(message); throw new BadRequestException(message); diff --git a/src/whatsapp/controllers/settings.controller.ts b/src/whatsapp/controllers/settings.controller.ts index 0f559d1b..15563647 100644 --- a/src/whatsapp/controllers/settings.controller.ts +++ b/src/whatsapp/controllers/settings.controller.ts @@ -1,7 +1,4 @@ -// import { isURL } from 'class-validator'; - import { Logger } from '../../config/logger.config'; -// import { BadRequestException } from '../../exceptions'; import { InstanceDto } from '../dto/instance.dto'; import { SettingsDto } from '../dto/settings.dto'; import { SettingsService } from '../services/settings.service'; diff --git a/src/whatsapp/routers/chatwoot.router.ts b/src/whatsapp/routers/chatwoot.router.ts index eb779587..c232e007 100644 --- a/src/whatsapp/routers/chatwoot.router.ts +++ b/src/whatsapp/routers/chatwoot.router.ts @@ -5,7 +5,6 @@ import { chatwootSchema, instanceNameSchema } from '../../validate/validate.sche import { RouterBroker } from '../abstract/abstract.router'; import { ChatwootDto } from '../dto/chatwoot.dto'; import { InstanceDto } from '../dto/instance.dto'; -// import { ChatwootService } from '../services/chatwoot.service'; import { chatwootController } from '../whatsapp.module'; import { HttpStatus } from './index.router'; diff --git a/src/whatsapp/routers/settings.router.ts b/src/whatsapp/routers/settings.router.ts index 6bd4d549..57e56b0d 100644 --- a/src/whatsapp/routers/settings.router.ts +++ b/src/whatsapp/routers/settings.router.ts @@ -5,7 +5,6 @@ import { instanceNameSchema, settingsSchema } from '../../validate/validate.sche import { RouterBroker } from '../abstract/abstract.router'; import { InstanceDto } from '../dto/instance.dto'; import { SettingsDto } from '../dto/settings.dto'; -// import { SettingsService } from '../services/settings.service'; import { settingsController } from '../whatsapp.module'; import { HttpStatus } from './index.router'; diff --git a/src/whatsapp/services/chatwoot.service.ts b/src/whatsapp/services/chatwoot.service.ts index 42043e65..b0b07ce5 100644 --- a/src/whatsapp/services/chatwoot.service.ts +++ b/src/whatsapp/services/chatwoot.service.ts @@ -51,11 +51,6 @@ export class ChatwootService { this.cache.set(cacheKey, provider); return provider; - // try { - // } catch (error) { - // this.logger.error('provider not found'); - // return null; - // } } private async clientCw(instance: InstanceDto) { @@ -389,10 +384,6 @@ export class ChatwootService { q: query, }); } else { - // contact = await client.contacts.filter({ - // accountId: this.provider.account_id, - // payload: this.getFilterPayload(query), - // }); // hotfix for: https://github.com/EvolutionAPI/evolution-api/pull/382. waiting fix: https://github.com/figurolatam/chatwoot-sdk/pull/7 contact = await chatwootRequest(this.getClientCwConfig(), { method: 'POST', @@ -1194,7 +1185,6 @@ export class ChatwootService { if (state !== 'open') { if (state === 'close') { this.logger.verbose('request cleaning up instance: ' + instance.instanceName); - // await this.waMonitor.cleaningUp(instance.instanceName); } this.logger.verbose('connect to whatsapp'); const number = command.split(':')[1]; From 704701e2516c56f4c9e34fc1a9ba6699379c4889 Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Wed, 7 Feb 2024 16:34:26 -0300 Subject: [PATCH 2/3] Add list method to AuthRepository and delete temp instances in WAMonitoringService --- src/whatsapp/repository/auth.repository.ts | 33 +++++++++++++++++++- src/whatsapp/services/monitor.service.ts | 36 +++++++++++++--------- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/whatsapp/repository/auth.repository.ts b/src/whatsapp/repository/auth.repository.ts index 7aa1a427..fa520a16 100644 --- a/src/whatsapp/repository/auth.repository.ts +++ b/src/whatsapp/repository/auth.repository.ts @@ -1,4 +1,4 @@ -import { readFileSync } from 'fs'; +import { opendirSync, readFileSync } from 'fs'; import { join } from 'path'; import { Auth, ConfigService } from '../../config/env.config'; @@ -64,6 +64,37 @@ export class AuthRepository extends Repository { } } + public async list(): Promise { + try { + if (this.dbSettings.ENABLED) { + this.logger.verbose('listing auth in db'); + return await this.authModel.find(); + } + + this.logger.verbose('listing auth in store'); + + const auths: AuthRaw[] = []; + const openDir = opendirSync(join(AUTH_DIR, this.auth.TYPE), { + encoding: 'utf-8', + }); + for await (const dirent of openDir) { + if (dirent.isFile()) { + auths.push( + JSON.parse( + readFileSync(join(AUTH_DIR, this.auth.TYPE, dirent.name), { + encoding: 'utf-8', + }), + ), + ); + } + } + + return auths; + } catch (error) { + return []; + } + } + public async findInstanceNameById(instanceId: string): Promise { try { this.logger.verbose('finding auth by instanceId'); diff --git a/src/whatsapp/services/monitor.service.ts b/src/whatsapp/services/monitor.service.ts index 3c3e8881..4be4e462 100644 --- a/src/whatsapp/services/monitor.service.ts +++ b/src/whatsapp/services/monitor.service.ts @@ -2,22 +2,19 @@ import { execSync } from 'child_process'; import EventEmitter2 from 'eventemitter2'; import { opendirSync, readdirSync, rmSync } from 'fs'; import { Db } from 'mongodb'; +import { Collection } from 'mongoose'; import { join } from 'path'; import { Auth, ConfigService, Database, DelInstance, HttpServer, Redis } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; import { INSTANCE_DIR, STORE_DIR } from '../../config/path.config'; import { NotFoundException } from '../../exceptions'; -import { dbserver } from '../../libs/db.connect'; import { RedisCache } from '../../libs/redis.client'; import { AuthModel, ChamaaiModel, - // ChatModel, ChatwootModel, - // ContactModel, - // MessageModel, - // MessageUpModel, + ContactModel, ProxyModel, RabbitmqModel, SettingsModel, @@ -41,7 +38,6 @@ export class WAMonitoringService { this.removeInstance(); this.noConnection(); - // this.delInstanceFiles(); Object.assign(this.db, configService.get('DATABASE')); Object.assign(this.redis, configService.get('REDIS')); @@ -56,8 +52,6 @@ export class WAMonitoringService { private dbInstance: Db; - private dbStore = dbserver; - private readonly logger = new Logger(WAMonitoringService.name); public readonly waInstances: Record = {}; @@ -326,11 +320,6 @@ export class WAMonitoringService { this.logger.verbose('cleaning store database instance: ' + instanceName); - // await ChatModel.deleteMany({ owner: instanceName }); - // await ContactModel.deleteMany({ owner: instanceName }); - // await MessageUpModel.deleteMany({ owner: instanceName }); - // await MessageModel.deleteMany({ owner: instanceName }); - await AuthModel.deleteMany({ _id: instanceName }); await WebhookModel.deleteMany({ _id: instanceName }); await ChatwootModel.deleteMany({ _id: instanceName }); @@ -340,6 +329,7 @@ export class WAMonitoringService { await TypebotModel.deleteMany({ _id: instanceName }); await WebsocketModel.deleteMany({ _id: instanceName }); await SettingsModel.deleteMany({ _id: instanceName }); + await ContactModel.deleteMany({ owner: instanceName }); return; } @@ -393,7 +383,7 @@ export class WAMonitoringService { this.logger.verbose('Database enabled'); await this.repository.dbServer.connect(); const collections: any[] = await this.dbInstance.collections(); - + await this.deleteTempInstances(collections); if (collections.length > 0) { this.logger.verbose('Reading collections and setting instances'); await Promise.all(collections.map((coll) => this.setInstance(coll.namespace.replace(/^[\w-]+\./, '')))); @@ -482,4 +472,22 @@ export class WAMonitoringService { } }); } + + private async deleteTempInstances(collections: Collection[]) { + this.logger.verbose('Cleaning up temp instances'); + const auths = await this.repository.auth.list(); + if (auths.length === 0) { + this.logger.verbose('No temp instances found'); + return; + } + let tempInstances = 0; + auths.forEach((auth) => { + if (collections.find((coll) => coll.namespace.replace(/^[\w-]+\./, '') === auth._id)) { + return; + } + tempInstances++; + this.eventEmitter.emit('remove.instance', auth._id, 'inner'); + }); + this.logger.verbose('Temp instances removed: ' + tempInstances); + } } From 27900c214f88792a9ca367cd01e3fa91f465106f Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Wed, 7 Feb 2024 18:42:12 -0300 Subject: [PATCH 3/3] Extracted profile picture request from contacts.upsert function --- src/whatsapp/services/whatsapp.service.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 22f7e7b2..f5081939 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -1657,7 +1657,7 @@ export class WAStartupService { ); this.logger.verbose('Verifying if contacts exists in database to insert'); - const contactsRaw: ContactRaw[] = []; + let contactsRaw: ContactRaw[] = []; for (const contact of contacts) { if (contactsRepository.has(contact.id)) { @@ -1667,7 +1667,7 @@ export class WAStartupService { contactsRaw.push({ id: contact.id, pushName: contact?.name || contact?.verifiedName || contact.id.split('@')[0], - profilePictureUrl: (await this.profilePicture(contact.id)).profilePictureUrl, + profilePictureUrl: null, owner: this.instance.name, }); } @@ -1682,6 +1682,23 @@ export class WAStartupService { this.chatwootService.addHistoryContacts({ instanceName: this.instance.name }, contactsRaw); chatwootImport.importHistoryContacts({ instanceName: this.instance.name }, this.localChatwoot); } + + // Update profile pictures + contactsRaw = []; + for await (const contact of contacts) { + contactsRaw.push({ + id: contact.id, + pushName: contact?.name || contact?.verifiedName || contact.id.split('@')[0], + profilePictureUrl: (await this.profilePicture(contact.id)).profilePictureUrl, + owner: this.instance.name, + }); + } + + this.logger.verbose('Sending data to webhook in event CONTACTS_UPDATE'); + this.sendDataWebhook(Events.CONTACTS_UPSERT, contactsRaw); + + this.logger.verbose('Updating contacts in database'); + this.repository.contact.update(contactsRaw, this.instance.name, database.SAVE_DATA.CONTACTS); } catch (error) { this.logger.error(error); }