import statusCode from "../utils/statusCodes"; import { Response } from "express"; import { RoomType } from "../mails/message/saveMessage"; import { getRoomType } from "../db/message/saveMessage-db"; import { getLastMsgData, getRoomOwner } from "../db/Room-db"; import emailManager from "../mails/EmailManager"; import MailBuilder from "../mails/utils/mailBuilder"; import { getAddresses } from "../db/utils/mail"; import { getMembers, getMessages, getRooms } from "../db/api-db"; import logger from "../system/Logger"; function rmUserFromAddrs(addresses: { email: string }[], user: string) { let index = addresses.findIndex((a) => a.email == user); if (index != -1) { addresses.splice(index, 1); } } export default class RoomAbl { // todo change name of reponse static async response(body, res: Response) { const { user, roomId, text, html } = body; const roomType = (await getRoomType(roomId))[0].room_type; if (roomType === RoomType.DM) { const ownerEmail = (await getRoomOwner(roomId))[0].email; const mailBuilder = new MailBuilder(); mailBuilder.from(user).to(ownerEmail).text(text).html(html); emailManager.getSmtp(user).sendMail(mailBuilder.message); res.status(statusCode.OK).send(); } else if (roomType === RoomType.GROUP || roomType === RoomType.THREAD) { const lastMsgData = (await getLastMsgData(roomId))[0]; const mailBuilder = new MailBuilder(); mailBuilder.inReplySubject(lastMsgData.subject).inReplyTo(lastMsgData.messageID).text(text).html(html); const from = await getAddresses(lastMsgData.fromA); let to = lastMsgData.toA ? await getAddresses(lastMsgData.toA) : []; let cc = lastMsgData.ccA ? await getAddresses(lastMsgData.ccA) : []; // remove us from recipients rmUserFromAddrs(to, user); rmUserFromAddrs(from, user); // add sender of previous as recipient if it is not us if (from.findIndex((a) => a.email == user) == -1) { to = to.concat(from); } mailBuilder .from(user) .to(to.map((a) => a.email)) .cc(cc.map((a) => a.email)); emailManager.getSmtp(user).sendMail(mailBuilder.message); res.status(statusCode.OK).send(); } else { res.status(statusCode.FORBIDDEN).send({ error: "Cannot add a new message in a room or a channel." }); } } static async getMessages(body, res: Response) { const { roomId } = body; getMessages(roomId) .then((messages) => { res.status(statusCode.OK).json(messages); }) .catch((err) => { logger.err(err); res.status(statusCode.INTERNAL_SERVER_ERROR); }); } static async getMembers(body, res) { const { roomId } = body; getMembers(roomId).then((addresses) => { res.status(statusCode.OK).json(addresses); }).catch((err) => { logger.err(err) res.status(statusCode.INTERNAL_SERVER_ERROR); }); } }