From 3bffd88108fc2dc90ec5a3b61c26cb23f6872c34 Mon Sep 17 00:00:00 2001 From: grimhilt Date: Fri, 14 Jul 2023 19:05:37 +0200 Subject: [PATCH] add original message in thread --- back/db/api-db.ts | 7 +- back/db/utils/mail.ts | 6 + back/mails/imap/ImapInstance.ts | 1 - back/mails/imap/Mailbox.ts | 2 +- back/mails/message/saveMessage.ts | 183 ++++++++++++++++-------------- 5 files changed, 106 insertions(+), 93 deletions(-) diff --git a/back/db/api-db.ts b/back/db/api-db.ts index 316d268..6447957 100644 --- a/back/db/api-db.ts +++ b/back/db/api-db.ts @@ -104,9 +104,10 @@ export async function getMessages(roomId: number) { 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 + SELECT bodypart.text, header_field.message_id + FROM bodypart INNER JOIN header_field INNER JOIN field_name WHERE @@ -119,7 +120,7 @@ export async function getMessages(roomId: number) { 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 ASC; diff --git a/back/db/utils/mail.ts b/back/db/utils/mail.ts index d683d64..fed5bdc 100644 --- a/back/db/utils/mail.ts +++ b/back/db/utils/mail.ts @@ -40,6 +40,12 @@ export async function getMessageUid(messageId: number): Promise<{uid: number}[]> return await execQueryAsync(query, values); } +export async function getMessageIdOnID(messageID: string): Promise<{message_id: number}[]> { + const query = `SELECT message_id FROM message WHERE messageID = ?`; + const values = [messageID]; + return await execQueryAsync(query, values); +} + export async function findRoomByOwner(ownerId: number): Promise<{ room_id: number }[]> { const query = `SELECT room_id FROM app_room WHERE owner_id = ?`; const values = [ownerId]; diff --git a/back/mails/imap/ImapInstance.ts b/back/mails/imap/ImapInstance.ts index 3f25925..7266930 100644 --- a/back/mails/imap/ImapInstance.ts +++ b/back/mails/imap/ImapInstance.ts @@ -4,7 +4,6 @@ import Imap from "imap"; import { getAllMailboxes, registerMailbox } from "../../db/imap/imap-db"; import logger from "../../system/Logger"; import Mailbox from "./Mailbox"; -import { rejects } from "assert"; export class ImapInstance { imap: Imap; diff --git a/back/mails/imap/Mailbox.ts b/back/mails/imap/Mailbox.ts index 8bc46d0..bf8586c 100644 --- a/back/mails/imap/Mailbox.ts +++ b/back/mails/imap/Mailbox.ts @@ -166,7 +166,7 @@ export default class Mailbox { }); f.once("error", (err) => { - logger.err("Fetch error: " + err); + logger.err("Fetch error when fetching in uid range: " + err); reject(1); }); diff --git a/back/mails/message/saveMessage.ts b/back/mails/message/saveMessage.ts index ef2b305..dff8646 100644 --- a/back/mails/message/saveMessage.ts +++ b/back/mails/message/saveMessage.ts @@ -11,7 +11,7 @@ import { getThreadInfoOnId, } from "../../db/message/saveMessage-db"; -import { findRoomByOwner, getAddressId, getUserIdOfMailbox } from "../../db/utils/mail"; +import { findRoomByOwner, getAddressId, getMessageIdOnID, getUserIdOfMailbox } from "../../db/utils/mail"; import { nbMembers } from "../utils/envelopeUtils"; import logger from "../../system/Logger"; import { Attrs, Envelope, User } from "../../interfaces/mail/attrs.interface"; @@ -55,93 +55,6 @@ export default class RegisterMessageInApp { this.inReplyTo = ""; } - async init() { - if (this.envelope.from) { - this.ownerId = await getAddressId(createAddress(this.envelope.from[0])); // todo use sender or from ? - } else { - throw new Error("Envelope must have a 'from' field"); - } - } - - isDm = () => nbMembers(this.envelope) == 2; - - async isFromUs() { - if (this.userId == -1) { - await getUserIdOfMailbox(this.boxId).then((res) => { - this.userId = res[0]?.user_id; - }); - } - return this.ownerId == this.userId; - } - - async registerMembers(roomId: number) { - getAllMembers(this.messageId).then((res) => { - if (res.lenght == 0) return; - const data = res[0].id.split(","); - data.forEach(async (memberId: number) => { - await registerMember(roomId, memberId); - }); - }); - } - - async initiateRoom(owner: number, roomType: RoomType) { - try { - const roomId = await createRoom(this.envelope.subject, owner, this.messageId, roomType); - await registerMessageInRoom(this.messageId, roomId, this.envelope.date); - await this.registerMembers(roomId); - return roomId; - } catch (err) { - logger.err(err); - } - } - - async createOrRegisterOnExistence(owner: number, roomType: RoomType) { - await findRoomByOwner(owner).then(async (res) => { - if (res.length == 0) { - // first message with this sender - await this.initiateRoom(owner, roomType); - } else { - // not a reply, add to the list of message if this sender - await registerMessageInRoom(this.messageId, res[0].room_id, this.envelope.date); - } - }); - } - - async initiateThread() { - await createRoom(this.envelope.subject, this.ownerId, this.messageId, RoomType.THREAD).then( - async (threadId: number) => { - // find parent room infos - let roomId: number; - let root_id: number; - await getThreadInfo(this.inReplyTo).then(async (room) => { - // todo room not lenght, reply to transfer ? - roomId = room[0].room_id; - root_id = room[0].root_id; - if (root_id === undefined) root_id = roomId; - await registerThread(threadId, roomId, root_id); - }); - // impl register previous message or go back - await registerMessageInRoom(this.messageId, threadId, this.envelope.date); - await this.registerMembers(threadId); - }, - ); - } - - async createOrRegisterOnMembers(roomId: number, isThread?: boolean) { - const hasSameMembers = await hasSameMembersAsParent(this.messageId, this.inReplyTo); - if (hasSameMembers) { - await registerMessageInRoom(this.messageId, roomId, this.envelope.date); - if (isThread) { - await getThreadInfoOnId(roomId).then(async (res) => { - let root_id = res[0].root_id; - if (root_id == undefined) root_id = res[0].room_id; - }); - } - } else { - await this.initiateThread(); - } - } - async save() { await this.init(); if (this.envelope.inReplyTo) { @@ -194,4 +107,98 @@ export default class RegisterMessageInApp { } }); } + + async init() { + if (this.envelope.from) { + this.ownerId = await getAddressId(createAddress(this.envelope.from[0])); // todo use sender or from ? + } else { + throw new Error("Envelope must have a 'from' field"); + } + } + + isDm = () => nbMembers(this.envelope) == 2; + + async isFromUs() { + if (this.userId == -1) { + await getUserIdOfMailbox(this.boxId).then((res) => { + this.userId = res[0]?.user_id; + }); + } + return this.ownerId == this.userId; + } + + /** + * add all members of the message to the room + */ + async registerMembers(roomId: number) { + getAllMembers(this.messageId).then((res) => { + if (res.lenght == 0) return; + const data = res[0].id.split(","); + data.forEach(async (memberId: number) => { + await registerMember(roomId, memberId); + }); + }); + } + + async initiateRoom(owner: number, roomType: RoomType) { + try { + const roomId = await createRoom(this.envelope.subject, owner, this.messageId, roomType); + await registerMessageInRoom(this.messageId, roomId, this.envelope.date); + await this.registerMembers(roomId); + return roomId; + } catch (err) { + logger.err(err); + } + } + + async createOrRegisterOnExistence(owner: number, roomType: RoomType) { + await findRoomByOwner(owner).then(async (res) => { + if (res.length == 0) { + // first message with this sender + await this.initiateRoom(owner, roomType); + } else { + // not a reply, add to the list of message if this sender + await registerMessageInRoom(this.messageId, res[0].room_id, this.envelope.date); + } + }); + } + + async initiateThread() { + const inReplyToId = (await getMessageIdOnID(this.inReplyTo))[0]?.message_id; + await createRoom(this.envelope.subject, this.ownerId, inReplyToId, RoomType.THREAD).then( + async (threadId: number) => { + // find parent room infos + let roomId: number; + let root_id: number; + await getThreadInfo(this.inReplyTo).then(async (room) => { + // todo room not lenght, reply to transfer ? + roomId = room[0].room_id; + root_id = room[0].root_id; + if (root_id === undefined) root_id = roomId; + await registerThread(threadId, roomId, root_id); + }); + + // add original message + await registerMessageInRoom(inReplyToId, threadId, this.envelope.date); + // add reply message + await registerMessageInRoom(this.messageId, threadId, this.envelope.date); + await this.registerMembers(threadId); + }, + ); + } + + async createOrRegisterOnMembers(roomId: number, isThread?: boolean) { + const hasSameMembers = await hasSameMembersAsParent(this.messageId, this.inReplyTo); + if (hasSameMembers) { + await registerMessageInRoom(this.messageId, roomId, this.envelope.date); + if (isThread) { + await getThreadInfoOnId(roomId).then(async (res) => { + let root_id = res[0].root_id; + if (root_id == undefined) root_id = res[0].room_id; + }); + } + } else { + await this.initiateThread(); + } + } }