mail/back/abl/Room-abl.ts

85 lines
3.2 KiB
TypeScript

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);
});
}
}