From 4cc53752d751f2780e19de28ad812b210f583370 Mon Sep 17 00:00:00 2001 From: grimhilt Date: Tue, 11 Apr 2023 18:14:48 +0200 Subject: [PATCH] sum of notseen thread and room --- back/db/api-db.ts | 146 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 back/db/api-db.ts diff --git a/back/db/api-db.ts b/back/db/api-db.ts new file mode 100644 index 0000000..cbe37b4 --- /dev/null +++ b/back/db/api-db.ts @@ -0,0 +1,146 @@ +import { execQueryAsync, execQueryAsyncWithId } from "./db"; +import { queryCcId, queryToId, queryFromId } from "./utils/addressQueries"; + +export async function registerAccount(userId, pwd, xoauth, xoauth2, host, port, tls) { + const query = ` + INSERT INTO app_account + (user_id, account_pwd, xoauth, xoauth2, host, port, tls) VALUES (?, ?, ?, ?, ?, ?, ?) + `; + const values = [userId, pwd, xoauth, xoauth2, host, port, tls]; + return await execQueryAsyncWithId(query, values); +} + +export async function getAccounts() { + // todo mailbox or account id ? + const query = ` + SELECT + mailbox.mailbox_id AS id, + address.email + FROM app_account + INNER JOIN address + INNER JOIN mailbox + WHERE + address.address_id = app_account.user_id AND + mailbox.account_id = app_account.account_id + `; + const values = []; + return await execQueryAsync(query, values); +} + +export async function getRooms(mailboxId) { + const query = ` + SELECT + room.room_id AS id, + room.room_name AS roomName, + address.email AS user, + room.owner_id AS userId, + (COUNT(notSeenThreads.message_id) + COUNT(notSeenRoom.message_id)) AS notSeen, + room.room_type AS roomType, + mailbox_message.mailbox_id AS mailboxId, + app_thread.parent_id + FROM app_room room + INNER JOIN message ON message.message_id = room.message_id + INNER JOIN mailbox_message ON mailbox_message.message_id = message.message_id + INNER JOIN address ON address.address_id = room.owner_id + LEFT JOIN app_thread ON room.room_id = app_thread.room_id + + LEFT JOIN ( + SELECT app_room_message.room_id, app_room_message.message_id + FROM app_room_message + WHERE + "\\\\Seen" NOT IN ( + SELECT flag_name FROM flag_name + INNER JOIN flag ON flag.flag_id = flag_name.flag_id AND flag.message_id = app_room_message.message_id + WHERE flag_name.flag_id = flag.flag_id + ) + ) notSeenRoom ON notSeenThreads.room_id = room.room_id + + LEFT JOIN ( + SELECT app_room_message.message_id, app_thread.parent_id + FROM app_room + INNER JOIN app_thread ON app_thread.room_id = app_room.room_id + INNER JOIN app_room_message ON app_room_message.room_id = app_room.room_id + WHERE + "\\\\Seen" NOT IN ( + SELECT flag_name FROM flag_name + INNER JOIN flag ON flag.flag_id = flag_name.flag_id AND flag.message_id = app_room_message.message_id + WHERE flag_name.flag_id = flag.flag_id + ) + ) notSeenThreads ON notSeenThreads.parent_id = room.room_id + + WHERE + mailbox_message.mailbox_id = ? + GROUP BY room.room_id + ORDER BY room.lastUpdate DESC + `; + // todo parent_id replace to root_id + const values = [mailboxId]; + return await execQueryAsync(query, values); +} + +export async function getMessages(roomId: number) { + // todo attachements name + const query = ` + SELECT + msg.message_id AS id, + GROUP_CONCAT(fromT.address_id) AS fromA, + GROUP_CONCAT(toT.address_id) AS toA, + GROUP_CONCAT(ccT.address_id) AS ccA, + subjectT.value AS subject, + content.text AS content, + message.idate AS date, + GROUP_CONCAT(flagT.flag_name) AS flags + FROM app_room_message msg + + ${queryFromId} fromT ON msg.message_id = fromT.message_id + ${queryToId} toT ON msg.message_id = toT.message_id + ${queryCcId} ccT ON msg.message_id = ccT.message_id + + LEFT JOIN ( + SELECT header_field.message_id, header_field.value + FROM header_field + INNER JOIN field_name + WHERE + field_name.field_id = header_field.field_id AND + field_name.field_name = 'subject' + ) subjectT ON msg.message_id = subjectT.message_id + + LEFT JOIN ( + SELECT bodypart.text, header_field.message_id FROM bodypart + INNER JOIN header_field + INNER JOIN field_name + WHERE + field_name.field_id = header_field.field_id AND + field_name.field_name = 'html' AND + bodypart.bodypart_id = header_field.bodypart_id + ) content ON msg.message_id = content.message_id + + LEFT JOIN flag ON flag.message_id = msg.message_id + LEFT JOIN flag_name flagT ON flagT.flag_id = flag.flag_id + + INNER JOIN message ON message.message_id = msg.message_id + + WHERE msg.room_id = ? + GROUP BY msg.message_id + ORDER BY message.idate DESC; + `; + const values = [roomId]; + return await execQueryAsync(query, values); +} + +export async function getMembers(roomId) { + const query = ` + SELECT + address.address_id AS id, + address.address_name AS name, + address.email AS email, + field_name.field_name as type + FROM app_room + INNER JOIN address_field ON address_field.message_id = app_room.message_id + INNER JOIN address ON address.address_id = address_field.address_id + INNER JOIN field_name ON field_name.field_id = address_field.field_id + WHERE app_room.room_id = ?; + `; + const values = [roomId]; + return await execQueryAsync(query, values); +}