This repository has been archived on 2025-10-20. You can view files and clone it, but cannot push or open issues or pull requests.
Files
esp-projekt/database/helpers/utils/chat_utils.ts
2025-03-14 06:33:12 +01:00

86 lines
2.6 KiB
TypeScript

/// <reference lib="deno.ns" />
/**
* @author Esad Mustafoski
* @description This file is responsible for creating Functions to easily access the Database, Specifically for Chats
* @file chatUtil.ts
*/
// +++ IMPORTS ------------------------------------------------------ //
import { DB } from "https://deno.land/x/sqlite@v3.9.1/mod.ts";
import { Chat, Message } from "../interfaces.ts";
import { mapChatRow, mapMessageRow, queryDatabase } from "./mod.ts";
async function getUserChats(db: DB, userId: string): Promise<Chat[]> {
const query = `SELECT * FROM chats WHERE participants LIKE '%${userId}%'`;
return await queryDatabase<Chat>(db, query, [], mapChatRow);
}
async function getChatById(db: DB, chatId: string): Promise<Chat | null> {
const query = `SELECT * FROM chats WHERE chat_id = ?`;
const chats = await queryDatabase<Chat>(db, query, [chatId], mapChatRow);
return chats.length > 0 ? chats[0] : null;
}
async function getChatMessages(db: DB, chatId: string): Promise<Message[]> {
const query =
`SELECT * FROM messages WHERE chat_id = ? ORDER BY timestamp ASC`;
return await queryDatabase<Message>(db, query, [chatId], mapMessageRow);
}
async function createChat(
db: DB,
participants: string[],
chatName: string,
): Promise<string> {
const participantsJson = JSON.stringify(participants);
const timestamp = `${Math.floor(Date.now() / 1000)}-${
new Date().toLocaleDateString("en-GB").split("/").join("-")
}`;
const query = `
INSERT INTO chats (chat_name, participants, created_at)
VALUES (?, ?, ?)
`;
db.query(query, [chatName, participantsJson, timestamp]);
return db.lastInsertRowId.toString();
}
async function addMessageToChat(
db: DB,
chatId: string,
senderId: string,
content: string,
): Promise<string> {
const timestamp = `${Math.floor(Date.now() / 1000)}-${
new Date().toLocaleDateString("en-GB").split("/").join("-")
}`;
const query = `
INSERT INTO messages (chat_id, sender_id, content, timestamp)
VALUES (?, ?, ?, ?)
`;
db.query(query, [chatId, senderId, content, timestamp]);
return db.lastInsertRowId.toString();
}
async function deleteChat(db: DB, chatId: string): Promise<void> {
// First delete all messages in the chat
const deleteMessagesQuery = `DELETE FROM messages WHERE chat_id = ?`;
db.query(deleteMessagesQuery, [chatId]);
// Then delete the chat itself
const deleteChatQuery = `DELETE FROM chats WHERE chat_id = ?`;
db.query(deleteChatQuery, [chatId]);
}
export {
getUserChats,
getChatById,
getChatMessages,
createChat,
addMessageToChat,
deleteChat
};