From bf683e84cf836bc68612284b0c25c2003690c37b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20H=C3=BCttemann?= Date: Fri, 1 Sep 2023 11:36:24 +0200 Subject: [PATCH] Skip thread replies imported before the thread root --- src/handlers/messages.test.ts | 3 ++- src/handlers/messages.ts | 31 ++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/handlers/messages.test.ts b/src/handlers/messages.test.ts index ff96d69..5633f7e 100644 --- a/src/handlers/messages.test.ts +++ b/src/handlers/messages.test.ts @@ -58,7 +58,8 @@ test('handling messages', async () => { mockedAxios.put.mockResolvedValue({ data: { event_id: 'test@matrix' } }) mockedStorage.getRoomId.mockResolvedValue('testMatrixRoom') mockedStorage.getUserId.mockResolvedValue('testMatrixUser') - mockedStorage.getMessageId.mockResolvedValue('testMatrixMessage') + mockedStorage.getMessageId.mockResolvedValueOnce(undefined) // For checking if the Message already exists + mockedStorage.getMessageId.mockResolvedValue('testMatrixMessage') // For checking the parent message await expect(handle({ ...rcMessage, tmid: 'threadId' })).resolves.toBe( undefined diff --git a/src/handlers/messages.ts b/src/handlers/messages.ts index cdc72e8..3180ea6 100644 --- a/src/handlers/messages.ts +++ b/src/handlers/messages.ts @@ -85,12 +85,20 @@ export async function createMessage( } export async function handle(rcMessage: RcMessage): Promise { + log.info(`Parsing message with ID: ${rcMessage._id}`) + + const matrixId = await getMessageId(rcMessage._id) + if (matrixId) { + log.debug(`Mapping exists: ${rcMessage._id} -> ${matrixId}`) + return + } + if (rcMessage.t) { log.warn(`Message ${rcMessage._id} is of type ${rcMessage.t}, skipping.`) return } - const room_id = (await getRoomId(rcMessage.rid)) || '' + const room_id = await getRoomId(rcMessage.rid) if (!room_id) { log.warn( `Could not find room ${rcMessage.rid} for message ${rcMessage._id}, skipping.` @@ -98,7 +106,7 @@ export async function handle(rcMessage: RcMessage): Promise { return } - const user_id = (await getUserId(rcMessage.u._id)) || '' + const user_id = await getUserId(rcMessage.u._id) if (!user_id) { log.warn( `Could not find author ${rcMessage.u.username} for message ${rcMessage._id}, skipping.` @@ -110,14 +118,19 @@ export async function handle(rcMessage: RcMessage): Promise { const ts = new Date(rcMessage.ts.$date).valueOf() if (rcMessage.tmid) { - const event_id = (await getMessageId(rcMessage.tmid)) || '' - matrixMessage['m.relates_to'] = { - rel_type: 'm.thread', - event_id, - is_falling_back: true, - 'm.in_reply_to': { + const event_id = await getMessageId(rcMessage.tmid) + if (!event_id) { + log.warn(`Related message ${rcMessage.tmid} missing, skipping.`) + return + } else { + matrixMessage['m.relates_to'] = { + rel_type: 'm.thread', event_id, - }, + is_falling_back: true, + 'm.in_reply_to': { + event_id, + }, + } } }