From 910a3c522985ac75b23bfe85b3a94e3c3353c4c2 Mon Sep 17 00:00:00 2001 From: Ong Chung Yau <33013947+chungyau97@users.noreply.github.com> Date: Tue, 22 Jul 2025 18:40:14 +0800 Subject: [PATCH] Fix import chatMessageFeedback messageIDs unique violation (#4919) * fix: chatMessageFeedback unique violation * fix: sync chatMessage IDs and chatMessageFeedback messageIDs * feat: optimize chatMessageFeedback IDs replacement --- .../src/services/export-import/index.ts | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/server/src/services/export-import/index.ts b/packages/server/src/services/export-import/index.ts index e2e39ead2..0f60796a5 100644 --- a/packages/server/src/services/export-import/index.ts +++ b/packages/server/src/services/export-import/index.ts @@ -269,11 +269,21 @@ async function replaceDuplicateIdsForChatMessage( }) if (records.length < 0) return originalData - // replace duplicate ids found in db to new id + // Replace duplicate ChatMessage ids found in db with new ids, + // and update corresponding messageId references in ChatMessageFeedback + const idMap: { [key: string]: string } = {} const dbExistingIds = new Set(records.map((record) => record.id)) originalData.ChatMessage = originalData.ChatMessage.map((item) => { if (dbExistingIds.has(item.id)) { - return { ...item, id: uuidv4() } + const newId = uuidv4() + idMap[item.id] = newId + return { ...item, id: newId } + } + return item + }) + originalData.ChatMessageFeedback = originalData.ChatMessageFeedback.map((item) => { + if (idMap[item.messageId]) { + return { ...item, messageId: idMap[item.messageId] } } return item }) @@ -408,12 +418,28 @@ async function replaceDuplicateIdsForChatMessageFeedback( const records = await queryRunner.manager.find(ChatMessageFeedback, { where: { id: In(ids) } }) + + // remove duplicate messageId + const seenMessageIds = new Set() + originalData.ChatMessageFeedback = originalData.ChatMessageFeedback.filter((feedback) => { + if (seenMessageIds.has(feedback.messageId)) { + return false + } + seenMessageIds.add(feedback.messageId) + return true + }) + if (records.length < 0) return originalData - for (let record of records) { - const oldId = record.id - const newId = uuidv4() - originalData = JSON.parse(JSON.stringify(originalData).replaceAll(oldId, newId)) - } + + // replace duplicate ids found in db to new id + const dbExistingIds = new Set(records.map((record) => record.id)) + originalData.ChatMessageFeedback = originalData.ChatMessageFeedback.map((item) => { + if (dbExistingIds.has(item.id)) { + const newId = uuidv4() + return { ...item, id: newId } + } + return item + }) return originalData } catch (error) { throw new InternalFlowiseError(