should update flags
This commit is contained in:
parent
af76e8f2f9
commit
9d12e81e07
30
back/db/message/updateMessage-db.ts
Normal file
30
back/db/message/updateMessage-db.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { execQuery, execQueryAsync, execQueryAsyncWithId } from "../db";
|
||||||
|
|
||||||
|
export async function getFlags(uid: number): Promise<{flag_id: number, flag_name: string}[]> {
|
||||||
|
const query = `
|
||||||
|
SELECT * FROM flag_name
|
||||||
|
INNER JOIN flag ON flag.flag_id = flag_name.flag_id
|
||||||
|
INNER JOIN mailbox_message ON mailbox_message.message_id = flag.message_id
|
||||||
|
WHERE mailbox_message.uid = ?
|
||||||
|
`;
|
||||||
|
const values = [uid];
|
||||||
|
return await execQueryAsync(query, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteFlag(messageId: number, flagId: number) {
|
||||||
|
const query = `DELETE FROM flag WHERE message_id = ? AND flag_id = ?`;
|
||||||
|
const values = [messageId, flagId];
|
||||||
|
execQuery(query, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateMailboxSeen(messageId: number, isSeen: boolean) {
|
||||||
|
const query = `UPDATE mailbox_message SET seen = ? WHERE message_id = ?`;
|
||||||
|
const values = [messageId, isSeen];
|
||||||
|
return await execQueryAsync(query, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateMailboxDeleted(messageId: number, isDeleted: boolean) {
|
||||||
|
const query = `UPDATE mailbox_message SET deleted = ? WHERE message_id = ?`;
|
||||||
|
const values = [messageId, isDeleted];
|
||||||
|
return await execQueryAsync(query, values);
|
||||||
|
}
|
@ -22,6 +22,12 @@ export async function getFlagId(flag: string): Promise<number> {
|
|||||||
return await execQueryAsyncWithId(query, values);
|
return await execQueryAsyncWithId(query, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getMessageIdOnUid(uid: number): Promise<{message_id: number}[]> {
|
||||||
|
const query = `SELECT message_id FROM mailbox_message WHERE uid = ?`;
|
||||||
|
const values = [uid];
|
||||||
|
return await execQueryAsync(query, values);
|
||||||
|
}
|
||||||
|
|
||||||
export async function findRoomByOwner(ownerId: number): Promise<{ room_id: number }[]> {
|
export async function findRoomByOwner(ownerId: number): Promise<{ room_id: number }[]> {
|
||||||
const query = `SELECT room_id FROM app_room WHERE owner_id = ?`;
|
const query = `SELECT room_id FROM app_room WHERE owner_id = ?`;
|
||||||
const values = [ownerId];
|
const values = [ownerId];
|
||||||
|
@ -2,8 +2,15 @@ import Imap, { ImapMessageAttributes, Box } from "imap";
|
|||||||
import { getMailbox, updateMailbox } from "../../db/imap/imap-db";
|
import { getMailbox, updateMailbox } from "../../db/imap/imap-db";
|
||||||
import { Attrs, AttrsWithEnvelope } from "../../interfaces/mail/attrs.interface";
|
import { Attrs, AttrsWithEnvelope } from "../../interfaces/mail/attrs.interface";
|
||||||
import logger from "../../system/Logger";
|
import logger from "../../system/Logger";
|
||||||
import RegisterMessageInApp from "../saveMessage";
|
import RegisterMessageInApp from "../message/saveMessage";
|
||||||
import { saveMessage } from "../storeMessage";
|
import { saveMessage } from "../message/storeMessage";
|
||||||
|
import updateMessage from "../message/updateMessage";
|
||||||
|
|
||||||
|
export interface ImapInfo {
|
||||||
|
uid: number;
|
||||||
|
modseq: string;
|
||||||
|
flags: string[];
|
||||||
|
}
|
||||||
|
|
||||||
export default class Mailbox {
|
export default class Mailbox {
|
||||||
imap: Imap;
|
imap: Imap;
|
||||||
@ -38,6 +45,7 @@ export default class Mailbox {
|
|||||||
logger.log("Already up to date")
|
logger.log("Already up to date")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// wait for new mails
|
||||||
this.imap.on("mail", (numNewMsgs: number) => {
|
this.imap.on("mail", (numNewMsgs: number) => {
|
||||||
if (!this.syncing) {
|
if (!this.syncing) {
|
||||||
// if not syncing restart a sync
|
// if not syncing restart a sync
|
||||||
@ -47,6 +55,11 @@ export default class Mailbox {
|
|||||||
this.msgToSync += numNewMsgs;
|
this.msgToSync += numNewMsgs;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.imap.on("update", (seqno: number, info: ImapInfo) => {
|
||||||
|
const updateMsg = new updateMessage(info.uid, info.flags);
|
||||||
|
updateMsg.updateFlags();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
43
back/mails/message/updateMessage.ts
Normal file
43
back/mails/message/updateMessage.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { registerFlag } from "../../db/message/storeMessage-db";
|
||||||
|
import { deleteFlag, getFlags, updateMailboxDeleted, updateMailboxSeen } from "../../db/message/updateMessage-db";
|
||||||
|
import { getFlagId, getMessageIdOnUid } from "../../db/utils/mail";
|
||||||
|
|
||||||
|
export default class updateMessage {
|
||||||
|
uid: number;
|
||||||
|
flags: string[];
|
||||||
|
|
||||||
|
constructor(_uid: number, _flags: string[]) {
|
||||||
|
this.uid = _uid;
|
||||||
|
this.flags = _flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateFlags() {
|
||||||
|
const messageId = (await getMessageIdOnUid(this.uid))[0].message_id;
|
||||||
|
const currentFlags = await getFlags(this.uid);
|
||||||
|
|
||||||
|
const flagsToAdd = this.flags.filter((flag) => !currentFlags.find((f) => flag == f.flag_name));
|
||||||
|
const flagToRm = currentFlags.filter((f) => !this.flags.includes(f.flag_name));
|
||||||
|
|
||||||
|
flagsToAdd.forEach(async (flag) => {
|
||||||
|
const flagId = await getFlagId(flag);
|
||||||
|
registerFlag(messageId, flagId);
|
||||||
|
});
|
||||||
|
|
||||||
|
flagToRm.forEach(async (flag) => {
|
||||||
|
deleteFlag(messageId, flag.flag_id);
|
||||||
|
});
|
||||||
|
|
||||||
|
// todo update seen counter rooms
|
||||||
|
if (flagsToAdd.includes("\\Seen")) {
|
||||||
|
updateMailboxSeen(messageId, true);
|
||||||
|
} else if (flagToRm.find((f) => f.flag_name == "\\Seen")) {
|
||||||
|
updateMailboxSeen(messageId, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flagsToAdd.includes("\\Deleted")) {
|
||||||
|
updateMailboxDeleted(messageId, true);
|
||||||
|
} else if (flagToRm.find((f) => f.flag_name == "\\Deleted")) {
|
||||||
|
updateMailboxDeleted(messageId, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user