107 lines
3.8 KiB
TypeScript
107 lines
3.8 KiB
TypeScript
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;
|
|
} |