From 8bcb5cc97778652a97fd420242f7483cf7553b0c Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 23 Mar 2026 01:54:42 +0100 Subject: [PATCH] fix: wrap DM message deletion in transaction for atomicity Matches the space message delete handler pattern. Prevents inconsistent state if the server crashes between individual delete operations. --- packages/server/src/ws/events.ts | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/server/src/ws/events.ts b/packages/server/src/ws/events.ts index 42ffb3a3..f59afdfb 100644 --- a/packages/server/src/ws/events.ts +++ b/packages/server/src/ws/events.ts @@ -993,20 +993,18 @@ function handleDmMessageDelete(event: Record, userId: string): const dmAttachmentRows = db.select({ filename: schema.attachments.filename }) .from(schema.attachments).where(eq(schema.attachments.dmMessageId, messageId)).all(); - // Delete attachments linked to this DM message - db.delete(schema.attachments) - .where(eq(schema.attachments.dmMessageId, messageId)) - .run(); - - // Delete reactions - db.delete(schema.dmReactions) - .where(eq(schema.dmReactions.dmMessageId, messageId)) - .run(); - - // Delete message - db.delete(schema.dmMessages) - .where(eq(schema.dmMessages.id, messageId)) - .run(); + // Delete attachments, reactions, and message atomically + db.transaction((tx) => { + tx.delete(schema.attachments) + .where(eq(schema.attachments.dmMessageId, messageId)) + .run(); + tx.delete(schema.dmReactions) + .where(eq(schema.dmReactions.dmMessageId, messageId)) + .run(); + tx.delete(schema.dmMessages) + .where(eq(schema.dmMessages.id, messageId)) + .run(); + }); // Clean up files from disk deleteAttachmentFiles(dmAttachmentRows);