import { db, FTS5Enabled } from "../db"; import { events } from "../globals"; export const createMessage = async (channelId: string, content: string) => { const query = db.prepare(`INSERT INTO messages (channelId, content) VALUES ($channelId, $content)`); const result = query.run({ channelId: channelId, content: content }); const messageId = result.lastInsertRowid; console.log(`Adding message for search with id ${messageId}`); // Insert into FTS table if FTS is enabled. if (FTS5Enabled) { const query2 = db.prepare(`INSERT INTO messages_fts (rowid, content) VALUES ($rowId, $content)`); const result2 = query2.run({ rowId: messageId, content: content }); } events.emit('message-created', messageId, channelId, content); return messageId; } export const updateMessage = async (messageId: string, content: string, append: boolean = false) => { const query = db.prepare(`UPDATE messages SET content = $content WHERE id = $id`); const result = query.run({ content: content, id: messageId }); // Update FTS table if enabled if (!FTS5Enabled) { const query2 = db.prepare(`INSERT INTO messages_fts (rowid, content) VALUES ($rowId, $content) ON CONFLICT(rowid) DO UPDATE SET content = excluded.content`); const result2 = query.run({ rowId: messageId, content: content }); } events.emit('message-updated', messageId, content); return result; } export const deleteMessage = async (messageId: string) => { const query = db.prepare(`DELETE FROM messages WHERE id = $id`); const result = query.run({ id: messageId }); // Remove from FTS table if enabled if (FTS5Enabled) { const query2 = db.prepare(`DELETE FROM messages_fts WHERE rowid = $rowId`); const result2 = query2.run({ rowId: messageId }); } events.emit('message-deleted', messageId); return result; } export const getMessages = async (channelId: string) => { const query = db.prepare(` SELECT messages.id, messages.channelId, messages.content, messages.createdAt, files.id as fileId, files.filePath, files.fileType, files.createdAt as fileCreatedAt, files.originalName, files.fileSize FROM messages LEFT JOIN files ON messages.fileId = files.id WHERE messages.channelId = $channelId `); const rows = query.all({ channelId: channelId }); return rows; } export const getMessage = async (id: string) => { const query = db.prepare(` SELECT messages.id, messages.channelId, messages.content, messages.createdAt, files.id as fileId, files.filePath, files.fileType, files.createdAt as fileCreatedAt, files.originalName, files.fileSize FROM messages LEFT JOIN files ON messages.fileId = files.id WHERE messages.id = $id `); const row = query.get({ id: id }); return row; } export const moveMessage = async (messageId: string, targetChannelId: string) => { // Get current message to emit proper events const currentMessage = await getMessage(messageId); if (!currentMessage) { throw new Error('Message not found'); } const query = db.prepare(`UPDATE messages SET channelId = $targetChannelId WHERE id = $messageId`); const result = query.run({ messageId: messageId, targetChannelId: targetChannelId }); if (result.changes === 0) { throw new Error('Message not found or not updated'); } // Update FTS table if enabled if (FTS5Enabled) { // FTS table doesn't need channelId update, just content remains searchable // No additional FTS changes needed since content hasn't changed } events.emit('message-moved', messageId, (currentMessage as any).channelId, targetChannelId); return result; }