import { DataSource } from 'typeorm'; import { MessageEntity } from '../../../entities'; import { replaceMessageReactions } from '../../relations'; import { UpdateMessageCommand } from '../../types'; export async function handleUpdateMessage(command: UpdateMessageCommand, dataSource: DataSource): Promise { const { messageId, updates } = command.payload; await dataSource.transaction(async (manager) => { const repo = manager.getRepository(MessageEntity); const existing = await repo.findOne({ where: { id: messageId } }); if (!existing) return; const directFields = [ 'senderId', 'senderName', 'content', 'timestamp' ] as const; const entity = existing as unknown as Record; for (const field of directFields) { if (updates[field] !== undefined) entity[field] = updates[field]; } const nullableFields = [ 'channelId', 'editedAt', 'replyToId' ] as const; for (const field of nullableFields) { if (updates[field] !== undefined) entity[field] = updates[field] ?? null; } if (updates.isDeleted !== undefined) existing.isDeleted = updates.isDeleted ? 1 : 0; if (updates.linkMetadata !== undefined) existing.linkMetadata = updates.linkMetadata ? JSON.stringify(updates.linkMetadata) : null; await repo.save(existing); if (updates.reactions !== undefined) { await replaceMessageReactions(manager, messageId, updates.reactions ?? []); } }); }