From dacd408f8de18eac5aa4ba6b6d3966af70588175 Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Sat, 10 Aug 2024 23:42:45 -0300 Subject: [PATCH 1/3] Make contacts unique for the same instance Avoid duplicated contacts in the database --- prisma/mysql-schema.prisma | 2 ++ prisma/postgresql-schema.prisma | 2 ++ 2 files changed, 4 insertions(+) diff --git a/prisma/mysql-schema.prisma b/prisma/mysql-schema.prisma index ed82c7e7..793354a8 100644 --- a/prisma/mysql-schema.prisma +++ b/prisma/mysql-schema.prisma @@ -130,6 +130,8 @@ model Contact { updatedAt DateTime? @updatedAt @db.Timestamp Instance Instance @relation(fields: [instanceId], references: [id], onDelete: Cascade) instanceId String + + @@unique([remoteJid, instanceId]) } model Message { diff --git a/prisma/postgresql-schema.prisma b/prisma/postgresql-schema.prisma index c245ed9d..db12f4ea 100644 --- a/prisma/postgresql-schema.prisma +++ b/prisma/postgresql-schema.prisma @@ -130,6 +130,8 @@ model Contact { updatedAt DateTime? @updatedAt @db.Timestamp Instance Instance @relation(fields: [instanceId], references: [id], onDelete: Cascade) instanceId String + + @@unique([remoteJid, instanceId]) } model Message { From 54e47c09c46155b67011c182302c3ab5ec5f9ba3 Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Sat, 10 Aug 2024 23:43:53 -0300 Subject: [PATCH 2/3] Fixed contacts update in the database --- .../channels/whatsapp.baileys.service.ts | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/api/services/channels/whatsapp.baileys.service.ts b/src/api/services/channels/whatsapp.baileys.service.ts index 392afa17..12d28b57 100644 --- a/src/api/services/channels/whatsapp.baileys.service.ts +++ b/src/api/services/channels/whatsapp.baileys.service.ts @@ -725,6 +725,7 @@ export class BaileysStartupService extends ChannelStartupService { if (this.configService.get('DATABASE').SAVE_DATA.CHATS) await this.prismaRepository.chat.createMany({ data: chatsToInsert, + skipDuplicates: true, }); } }, @@ -845,7 +846,12 @@ export class BaileysStartupService extends ChannelStartupService { }, 'contacts.update': async (contacts: Partial[]) => { - const contactsRaw: any = []; + const contactsRaw: { + remoteJid: string; + pushName?: string; + profilePicUrl?: string; + instanceId: string; + }[] = []; for await (const contact of contacts) { contactsRaw.push({ remoteJid: contact.id, @@ -857,10 +863,14 @@ export class BaileysStartupService extends ChannelStartupService { this.sendDataWebhook(Events.CONTACTS_UPDATE, contactsRaw); - this.prismaRepository.contact.updateMany({ - where: { instanceId: this.instanceId }, - data: contactsRaw, - }); + const updateTransactions = contactsRaw.map((contact) => + this.prismaRepository.contact.upsert({ + where: { remoteJid_instanceId: { remoteJid: contact.remoteJid, instanceId: contact.instanceId } }, + create: contact, + update: contact, + }), + ); + await this.prismaRepository.$transaction(updateTransactions); }, }; @@ -1252,19 +1262,19 @@ export class BaileysStartupService extends ChannelStartupService { where: { remoteJid: received.key.remoteJid, instanceId: this.instanceId }, }); - const contactRaw: any = { + const contactRaw: { remoteJid: string; pushName: string; profilePicUrl?: string; instanceId: string } = { remoteJid: received.key.remoteJid, pushName: received.pushName, profilePicUrl: (await this.profilePicture(received.key.remoteJid)).profilePictureUrl, instanceId: this.instanceId, }; - if (contactRaw.id === 'status@broadcast') { + if (contactRaw.remoteJid === 'status@broadcast') { return; } if (contact) { - const contactRaw: any = { + const contactRaw: { remoteJid: string; pushName: string; profilePicUrl?: string; instanceId: string } = { remoteJid: received.key.remoteJid, pushName: contact.pushName, profilePicUrl: (await this.profilePicture(received.key.remoteJid)).profilePictureUrl, @@ -1291,8 +1301,15 @@ export class BaileysStartupService extends ChannelStartupService { this.sendDataWebhook(Events.CONTACTS_UPSERT, contactRaw); if (this.configService.get('DATABASE').SAVE_DATA.CONTACTS) - await this.prismaRepository.contact.create({ - data: contactRaw, + await this.prismaRepository.contact.upsert({ + where: { + remoteJid_instanceId: { + remoteJid: contactRaw.remoteJid, + instanceId: contactRaw.instanceId, + }, + }, + update: contactRaw, + create: contactRaw, }); } } catch (error) { From 93cc25b51302c1f41037069824ef4ee045ad1847 Mon Sep 17 00:00:00 2001 From: Judson Cairo Date: Sun, 11 Aug 2024 15:33:46 -0300 Subject: [PATCH 3/3] Add migration for unique index in contacts --- .../migration.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 prisma/postgresql-migrations/20240811183328_add_unique_index_for_remoted_jid_and_instance_in_contacts/migration.sql diff --git a/prisma/postgresql-migrations/20240811183328_add_unique_index_for_remoted_jid_and_instance_in_contacts/migration.sql b/prisma/postgresql-migrations/20240811183328_add_unique_index_for_remoted_jid_and_instance_in_contacts/migration.sql new file mode 100644 index 00000000..b0289bb2 --- /dev/null +++ b/prisma/postgresql-migrations/20240811183328_add_unique_index_for_remoted_jid_and_instance_in_contacts/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[remoteJid,instanceId]` on the table `Contact` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "Contact_remoteJid_instanceId_key" ON "Contact"("remoteJid", "instanceId");