83 lines
2.9 KiB
TypeScript
83 lines
2.9 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;
|
||
|
}
|