Compare commits

..

2 Commits

Author SHA1 Message Date
grimhilt
843659b495 delete room when empty 2023-05-06 15:58:33 +02:00
grimhilt
1a7828b281 minor fixes for deletion compatibility 2023-05-06 15:17:02 +02:00
11 changed files with 72 additions and 32 deletions

View File

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

View File

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

View File

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

View File

@ -121,7 +121,7 @@ CREATE TABLE app_room (
room_id INT AUTO_INCREMENT,
room_name VARCHAR(255) NOT NULL,
owner_id INT NOT NULL,
message_id INT NOT NULL,
message_id INT,
room_type INT NOT NULL DEFAULT 0,
lastUpdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
PRIMARY KEY (room_id),

View File

@ -35,7 +35,6 @@ export async function getMailbox(mailboxId: number) {
}
export function updateMailbox(mailboxId: number, uidnext: number) {
console.log("updateMailbox", mailboxId, uidnext);
const query = `UPDATE mailbox SET uidnext = ? WHERE mailbox_id = ?`;
const values = [uidnext, mailboxId];
execQuery(query, values);

View File

@ -137,7 +137,7 @@ export default class Mailbox {
} catch (error) {
logger.err("Failed to sync message " + error);
}
logger.log(`Saved messages ${i + STEP > nbMessageToSync ? nbMessageToSync : i + STEP}/${nbMessageToSync}`);
logger.log(`Saved messages in uids ${i + STEP > nbMessageToSync ? nbMessageToSync : i + STEP}/${nbMessageToSync}`);
}
// if has receive new msg during last sync then start a new sync

View File

@ -35,7 +35,7 @@ if (shouldReset) {
if (table.table_name == "mailbox") return;
console.log(table.table_name);
execQuery("DELETE FROM " + table.table_name, []);
// execQuery("DROP TABLE " + table.table_name);
// execQuery("DROP TABLE " + table.table_name, []);
});
});
}

View File

@ -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) => {

View File

@ -132,6 +132,14 @@ const store = createStore<State>({
}
});
},
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);
@ -174,6 +182,12 @@ const store = createStore<State>({
const msgs = msgOnRoomId(state, payload.roomId);
const msgIndex = msgs?.messages.findIndex((msg) => msg.id == payload.messageId) ?? -1;
if (msgs && msgIndex != -1) {
if (!isSeenFc(msgs.messages[msgIndex].flags)) {
const room = roomOnId(state, payload.roomId);
if (room) {
room.notSeen = room.notSeen - 1;
}
}
msgs.messages.splice(msgIndex, 1);
}
},

View File

@ -51,6 +51,7 @@ function openMessageView(messageId) {
const shouldBeCompact = (index) => {
// show last three messages
// todo fix not changing three displayed when deleting
if (messages.value?.length - 4 < index) return false;
return true;
};

View File

@ -1,3 +1,8 @@
<script lang="ts" setup>
import Accounts from "./accounts/Accounts.vue";
import Rooms from "./rooms/Rooms.vue";
</script>
<template>
<div>
<Accounts class="accounts" />
@ -5,19 +10,6 @@
</div>
</template>
<script>
import Accounts from "./accounts/Accounts";
import Rooms from "./rooms/Rooms.vue";
export default {
name: "Sidebar",
components: {
Accounts,
Rooms,
},
};
</script>
<style scoped>
div {
display: flex;