import statusCode from "../utils/statusCodes"; import { Response } from "express"; import { getMessageUid, getUserOfMailbox } from "../db/utils/mail"; import emailManager from "../mails/EmailManager"; import logger from "../system/Logger"; import Message from "../mails/message/Message"; import Room from "../mails/room/Room"; export default class MessageAbl { 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 message = new Message().setMessageId(messageId); try { await message.useUid(); } catch (error) { logger.err(error); res.status(statusCode.NOT_FOUND).send({ error: "Message uid not found." }); return; } try { await message.useMailbox(mailboxId); } catch (error) { res.status(statusCode.NOT_FOUND).send({ error: "Not account for this mailbox." }); return; } try { await message.mailbox.addFlag(message.uid.toString(), ["\\Deleted"]); await message.mailbox.moveToTrash(message.uid.toString(), (err) => { throw err; }); } catch (err) { logger.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); return; } res.status(statusCode.OK).send(); }; static deleteEverywhere = async (body, res: Response) => { const { mailboxId, messageId } = body; const message = new Message().setMessageId(messageId); await message.useFlags(); try { await message.useUid(); } catch (error) { logger.err(error); res.status(statusCode.NOT_FOUND).send({ error: "Message uid not found." }); return; } // if message not deleted remotly, delete it if (!message.isDeleted) { try { await message.useMailbox(mailboxId); } catch (error) { res.status(statusCode.NOT_FOUND).send({ error: "Not account for this mailbox." }); return; } try { await message.mailbox.addFlag(message.uid.toString(), ["\\Deleted"]); await message.mailbox.moveToTrash(message.uid.toString(), (err) => { throw err; }); } catch (err) { logger.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); return; } } const room = await new Room().setRoomIdOnMessageId(messageId); try { await message.delete(); if (room.roomId && room.shouldDelete()) { await room.delete(); res.status(statusCode.OK).json({ deleteRoom: true }).send(); return; } } catch (err) { res.status(statusCode.METHOD_FAILURE).send({ error: err }); return; } res.status(statusCode.OK).send(); }; }