add original message in thread

This commit is contained in:
grimhilt 2023-07-14 19:05:37 +02:00
parent 0094783a4e
commit 3bffd88108
5 changed files with 106 additions and 93 deletions

View File

@ -106,7 +106,8 @@ export async function getMessages(roomId: number) {
) subjectT ON msg.message_id = subjectT.message_id ) subjectT ON msg.message_id = subjectT.message_id
LEFT JOIN ( 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 header_field
INNER JOIN field_name INNER JOIN field_name
WHERE WHERE

View File

@ -40,6 +40,12 @@ export async function getMessageUid(messageId: number): Promise<{uid: number}[]>
return await execQueryAsync(query, values); 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 }[]> { export async function findRoomByOwner(ownerId: number): Promise<{ room_id: number }[]> {
const query = `SELECT room_id FROM app_room WHERE owner_id = ?`; const query = `SELECT room_id FROM app_room WHERE owner_id = ?`;
const values = [ownerId]; const values = [ownerId];

View File

@ -4,7 +4,6 @@ import Imap from "imap";
import { getAllMailboxes, registerMailbox } from "../../db/imap/imap-db"; import { getAllMailboxes, registerMailbox } from "../../db/imap/imap-db";
import logger from "../../system/Logger"; import logger from "../../system/Logger";
import Mailbox from "./Mailbox"; import Mailbox from "./Mailbox";
import { rejects } from "assert";
export class ImapInstance { export class ImapInstance {
imap: Imap; imap: Imap;

View File

@ -166,7 +166,7 @@ export default class Mailbox {
}); });
f.once("error", (err) => { f.once("error", (err) => {
logger.err("Fetch error: " + err); logger.err("Fetch error when fetching in uid range: " + err);
reject(1); reject(1);
}); });

View File

@ -11,7 +11,7 @@ import {
getThreadInfoOnId, getThreadInfoOnId,
} from "../../db/message/saveMessage-db"; } 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 { nbMembers } from "../utils/envelopeUtils";
import logger from "../../system/Logger"; import logger from "../../system/Logger";
import { Attrs, Envelope, User } from "../../interfaces/mail/attrs.interface"; import { Attrs, Envelope, User } from "../../interfaces/mail/attrs.interface";
@ -55,93 +55,6 @@ export default class RegisterMessageInApp {
this.inReplyTo = ""; 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() { async save() {
await this.init(); await this.init();
if (this.envelope.inReplyTo) { 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();
}
}
} }