diff --git a/prisma/postgresql-migrations/20240813003116_make_label_unique_for_instance/migration.sql b/prisma/postgresql-migrations/20240813003116_make_label_unique_for_instance/migration.sql new file mode 100644 index 00000000..9110ed8a --- /dev/null +++ b/prisma/postgresql-migrations/20240813003116_make_label_unique_for_instance/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - A unique constraint covering the columns `[labelId,instanceId]` on the table `Label` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "Label_labelId_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "Label_labelId_instanceId_key" ON "Label"("labelId", "instanceId"); diff --git a/prisma/postgresql-schema.prisma b/prisma/postgresql-schema.prisma index be71597d..d4be6b5f 100644 --- a/prisma/postgresql-schema.prisma +++ b/prisma/postgresql-schema.prisma @@ -216,7 +216,7 @@ model Chatwoot { model Label { id String @id @default(cuid()) - labelId String? @unique @db.VarChar(100) + labelId String? @db.VarChar(100) name String @db.VarChar(100) color String @db.VarChar(100) predefinedId String? @db.VarChar(100) @@ -224,6 +224,8 @@ model Label { updatedAt DateTime @updatedAt @db.Timestamp Instance Instance @relation(fields: [instanceId], references: [id], onDelete: Cascade) instanceId String + + @@unique([labelId, instanceId]) } model Proxy { diff --git a/src/api/services/channels/whatsapp.baileys.service.ts b/src/api/services/channels/whatsapp.baileys.service.ts index b48368fb..e1da7002 100644 --- a/src/api/services/channels/whatsapp.baileys.service.ts +++ b/src/api/services/channels/whatsapp.baileys.service.ts @@ -1455,7 +1455,7 @@ export class BaileysStartupService extends ChannelStartupService { const savedLabel = labelsRepository.find((l) => l.labelId === label.id); if (label.deleted && savedLabel) { await this.prismaRepository.label.delete({ - where: { instanceId: this.instanceId, labelId: label.id }, + where: { labelId_instanceId: { instanceId: this.instanceId, labelId: label.id } }, }); this.sendDataWebhook(Events.LABELS_EDIT, { ...label, instance: this.instance.name }); return; @@ -1463,16 +1463,25 @@ export class BaileysStartupService extends ChannelStartupService { const labelName = label.name.replace(/[^\x20-\x7E]/g, ''); if (!savedLabel || savedLabel.color !== `${label.color}` || savedLabel.name !== labelName) { - if (this.configService.get('DATABASE').SAVE_DATA.LABELS) - await this.prismaRepository.label.create({ - data: { - color: `${label.color}`, - name: labelName, - labelId: label.id, - predefinedId: label.predefinedId, - instanceId: this.instanceId, + if (this.configService.get('DATABASE').SAVE_DATA.LABELS) { + const labelData = { + color: `${label.color}`, + name: labelName, + labelId: label.id, + predefinedId: label.predefinedId, + instanceId: this.instanceId, + }; + await this.prismaRepository.label.upsert({ + where: { + labelId_instanceId: { + instanceId: labelData.instanceId, + labelId: labelData.labelId, + }, }, + update: labelData, + create: labelData, }); + } this.sendDataWebhook(Events.LABELS_EDIT, { ...label, instance: this.instance.name }); } },