diff --git a/back/abl/Message-abl.ts b/back/abl/Message-abl.ts index 12ddab3..9c1f551 100644 --- a/back/abl/Message-abl.ts +++ b/back/abl/Message-abl.ts @@ -4,6 +4,7 @@ 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) { @@ -68,7 +69,8 @@ export default class Message { const mailbox = emailManager.getImap(user).getMailbox(mailboxId); // add flag for deletion - mailbox.addFlag(uid.toString(), ["\\Deleted"]) + mailbox + .addFlag(uid.toString(), ["\\Deleted"]) .then(() => { // move message to trash mailbox.moveToTrash(uid.toString(), (err) => { @@ -84,7 +86,6 @@ export default class Message { logger.log(err); res.status(statusCode.METHOD_FAILURE).send({ error: err }); }); - }; static async deleteEverywhere(body, res: Response) { @@ -92,26 +93,37 @@ export default class Message { 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(() => { - deleteMessage(messageId) - .then((result) => { - // todo check if room is empty - res.status(statusCode.OK).send(); - }) - .catch((err) => { - res.status(statusCode.METHOD_FAILURE).send({ error: err }); - console.log(err); - }); + .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); diff --git a/back/abl/Room-abl.ts b/back/abl/Room-abl.ts index 2a23c0f..8ea438f 100644 --- a/back/abl/Room-abl.ts +++ b/back/abl/Room-abl.ts @@ -31,8 +31,6 @@ export default class Room { res.status(statusCode.OK).send(); } else if (roomType === RoomType.GROUP || roomType === RoomType.THREAD) { const lastMsgData = (await getLastMsgData(roomId))[0]; - console.log(lastMsgData); - const mailBuilder = new MailBuilder(); mailBuilder.inReplySubject(lastMsgData.subject).inReplyTo(lastMsgData.messageID).text(text).html(html); diff --git a/back/db/Room-db.ts b/back/db/Room-db.ts index b82bf93..42e940f 100644 --- a/back/db/Room-db.ts +++ b/back/db/Room-db.ts @@ -12,8 +12,10 @@ export async function getRoomOwner(roomId: number) { return await execQueryAsync(query, values); } +/** + * get all the data needed to reply to a message in a room + */ export async function getLastMsgData(roomId: number) { - const query = ` SELECT msg.message_id AS id, @@ -59,3 +61,21 @@ export async function getLastMsgData(roomId: number) { const values = [roomId]; return await execQueryAsync(query, values); } + +export async function getRoomOnMessageId(messageId: number) { + const query = `SELECT room_id FROM app_room_message WHERE message_id = ?`; + const values = [messageId]; + return await execQueryAsync(query, values); +} + +export async function getRoomNbMessage(roomId: number) { + const query = `SELECT COUNT(room_id) AS nbMessage FROM app_room_message WHERE room_id = ?`; + const values = [roomId]; + return await execQueryAsync(query, values); +} + +export async function deleteRoom(roomId: number) { + const query = `DELETE FROM app_room WHERE room_id = ?`; + const values = [roomId]; + return await execQueryAsync(query, values); +} diff --git a/front/src/components/structure/message/Options.vue b/front/src/components/structure/message/Options.vue index bbf0dae..e6ba20e 100644 --- a/front/src/components/structure/message/Options.vue +++ b/front/src/components/structure/message/Options.vue @@ -50,7 +50,11 @@ const deleteEverywhere = () => { deletionLoading.value = true; API.deleteEverywhere({ mailboxId: room.value?.mailboxId, messageId: props.msg?.id }) .then((res) => { + // delete even if we delete the room after because the transition between room is not clean (todo) store.commit("removeMsg", { roomId: room.value?.id, messageId: props.msg?.id }); + if (res.data?.deleteRoom) { + store.commit("removeRoom", { roomId: room.value?.id }); + } deletionLoading.value = false; }) .catch((err) => { diff --git a/front/src/store/store.ts b/front/src/store/store.ts index 625324c..032b105 100644 --- a/front/src/store/store.ts +++ b/front/src/store/store.ts @@ -132,6 +132,14 @@ const store = createStore({ } }); }, + removeRoom(state, payload) { + const roomMessageIndex = state.roomMessages.findIndex((roomM) => roomM.roomId === payload.roomId); + state.roomMessages.splice(roomMessageIndex, 1); + const roomIndex = state.rooms.findIndex((room) => room.id === payload.roomId); + state.rooms.splice(roomIndex, 1); + // state.activeRoom = state.rooms[0].id; + // router.push(`/${state.activeRoom}`); + }, addMessages(state, payload) { // todo add if not exist const room = roomOnId(state, payload.roomId); diff --git a/front/src/views/sidebar/Sidebar.vue b/front/src/views/sidebar/Sidebar.vue index 281e687..85c7b3e 100644 --- a/front/src/views/sidebar/Sidebar.vue +++ b/front/src/views/sidebar/Sidebar.vue @@ -1,3 +1,8 @@ + + - -