import statusCode from "../utils/statusCodes"; import { Response } from "express"; import { getMessageUid, getUserOfMailbox } from "../db/utils/mail"; import emailManager from "../mails/EmailManager"; import { deleteMessage } from "../db/message/updateMessage-db"; import logger from "../system/Logger"; import { deleteRoom, getRoomNbMessage, getRoomOnMessageId } from "../db/Room-db"; export default class Message { static async addFlag(body, res: Response) { const { mailboxId, messageId, flag } = body; const uid = (await getMessageUid(messageId))[0]?.uid; if (!uid) { res.status(statusCode.NOT_FOUND).send({ error: "Message uid not found." }); } const user = (await getUserOfMailbox(mailboxId))[0]?.user; if (!user) { res.status(statusCode.NOT_FOUND).send({ error: "Not account for this mailbox." }); } emailManager .getImap(user) .getMailbox(mailboxId) .addFlag(uid.toString(), [flag]) .then(() => { res.status(statusCode.OK).send(); }) .catch((err) => { console.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); }); } static async removeFlag(body, res: Response) { const { mailboxId, messageId, flag } = body; const uid = (await getMessageUid(messageId))[0]?.uid; if (!uid) { res.status(statusCode.NOT_FOUND).send({ error: "Message uid not found." }); } const user = (await getUserOfMailbox(mailboxId))[0]?.user; if (!user) { res.status(statusCode.NOT_FOUND).send({ error: "Not account for this mailbox." }); } emailManager .getImap(user) .getMailbox(mailboxId) .removeFlag(uid.toString(), [flag]) .then(() => { res.status(statusCode.OK).send(); }) .catch((err) => { console.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); }); } static deleteRemoteOnly = async (body, res: Response) => { const { mailboxId, messageId } = body; const uid = (await getMessageUid(messageId))[0]?.uid; if (!uid) { res.status(statusCode.NOT_FOUND).send({ error: "Message uid not found." }); } const user = (await getUserOfMailbox(mailboxId))[0]?.user; if (!user) { res.status(statusCode.NOT_FOUND).send({ error: "Not account for this mailbox." }); } const mailbox = emailManager.getImap(user).getMailbox(mailboxId); // add flag for deletion mailbox .addFlag(uid.toString(), ["\\Deleted"]) .then(() => { // move message to trash mailbox.moveToTrash(uid.toString(), (err) => { if (err) { logger.err(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); } else { res.status(statusCode.OK).send(); } }); }) .catch((err) => { logger.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); }); }; static async deleteEverywhere(body, res: Response) { const { mailboxId, messageId } = body; const uid = (await getMessageUid(messageId))[0]?.uid; if (!uid) { res.status(statusCode.NOT_FOUND).send({ error: "Message uid not found." }); return; } const user = (await getUserOfMailbox(mailboxId))[0]?.user; if (!user) { res.status(statusCode.NOT_FOUND).send({ error: "Not account for this mailbox." }); return; } const roomId = (await getRoomOnMessageId(messageId))[0]?.room_id; emailManager .getImap(user) .getMailbox(mailboxId) .removeFlag(uid.toString(), ["\\Deleted"]) .then(async () => { try { await deleteMessage(messageId); if (roomId) { const nbMessage = (await getRoomNbMessage(roomId))[0].nbMessage; if (nbMessage > 0) { res.status(statusCode.OK).send(); } else { await deleteRoom(roomId); res.status(statusCode.OK).json({ deleteRoom: true }).send(); } } } catch (err) { res.status(statusCode.METHOD_FAILURE).send({ error: err }); console.log(err); } }) .catch((err) => { console.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); }); } }