tests in typescript
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { ImapMessageAttributes } from "imap";
|
||||
import Imap, { ImapMessageAttributes, MailBoxes } from "imap";
|
||||
import { getMailbox, updateMailbox } from "../../db/imap/imap";
|
||||
import { Attrs } from "../../interfaces/mail/attrs.interface";
|
||||
import logger from "../../system/Logger";
|
||||
import RegisterMessageInApp from "../saveMessage";
|
||||
import { saveMessage } from "../storeMessage";
|
||||
@@ -8,7 +9,7 @@ export default class Box {
|
||||
imap: Imap;
|
||||
boxName: string;
|
||||
id: number;
|
||||
box: Object;
|
||||
box: MailBoxes;
|
||||
|
||||
constructor(_imap, _boxId, _boxName) {
|
||||
this.imap = _imap;
|
||||
|
||||
@@ -7,17 +7,19 @@ import {
|
||||
registerThread,
|
||||
registerMember,
|
||||
getAllMembers,
|
||||
getRoomInfo,
|
||||
} from "../db/saveMessageApp";
|
||||
|
||||
import { findRoomByOwner, getAddresseId, getUserIdOfMailbox } from "../db/mail";
|
||||
import { nbMembers } from "./utils/envelopeUtils";
|
||||
import logger from "../system/Logger";
|
||||
import { ImapMessageAttributes } from "imap";
|
||||
import { Attrs, Envelope, User } from "../interfaces/mail/attrs.interface";
|
||||
|
||||
/**
|
||||
* take object address and join mailbox and host to return mailbox@host
|
||||
*/
|
||||
function createAddress(elt) {
|
||||
function createAddress(elt: User): string {
|
||||
return `${elt.mailbox}@${elt.host}`;
|
||||
}
|
||||
|
||||
@@ -31,47 +33,58 @@ export const roomType = {
|
||||
|
||||
export default class RegisterMessageInApp {
|
||||
messageId: number;
|
||||
attrs: ImapMessageAttributes;
|
||||
envelope?: ImapMessageAttributes.envelope;
|
||||
attrs: Attrs;
|
||||
envelope: Envelope;
|
||||
messageID?: string;
|
||||
boxId: number;
|
||||
isSeen: boolean;
|
||||
ownerId: number;
|
||||
userId: number;
|
||||
|
||||
constructor(_messageId, _attrs, _boxId) {
|
||||
inReplyTo: string;
|
||||
|
||||
constructor(_messageId: number, _attrs: Attrs, _boxId: number) {
|
||||
this.messageId = _messageId;
|
||||
this.attrs = _attrs;
|
||||
if (!this.attrs.envelope) throw new Error("Envelope must exist in attributes");
|
||||
this.envelope = this.attrs.envelope;
|
||||
this.messageID = this.envelope?.messageId;
|
||||
this.boxId = _boxId;
|
||||
this.isSeen = this.attrs.flags.includes("\\Seen") ? true : false;
|
||||
this.ownerId;
|
||||
this.userId;
|
||||
this.ownerId = -1;
|
||||
this.userId = -1;
|
||||
this.inReplyTo = "";
|
||||
}
|
||||
|
||||
async init() {
|
||||
this.ownerId = await getAddresseId(createAddress(this.envelope.from[0])); // todo use sender or from ?
|
||||
if (this.envelope.from) {
|
||||
this.ownerId = await getAddresseId(createAddress(this.envelope.from[0])); // todo use sender or from ?
|
||||
} else {
|
||||
throw new Error("Envelope must have a 'from' field");
|
||||
}
|
||||
}
|
||||
|
||||
isDm = () => nbMembers(this.envelope) == 2;
|
||||
|
||||
async isFromUs() {
|
||||
if (!this.userId) this.userId = (await getUserIdOfMailbox(this.boxId))[0]?.user_id;
|
||||
if (this.userId == -1) {
|
||||
await getUserIdOfMailbox(this.boxId).then((res) => {
|
||||
this.userId = res[0]?.user_id;
|
||||
});
|
||||
}
|
||||
return this.ownerId == this.userId;
|
||||
}
|
||||
|
||||
async registerMembers(roomId) {
|
||||
async registerMembers(roomId: number) {
|
||||
getAllMembers(this.messageId).then((res) => {
|
||||
res[0].id.split(",").foreach(async (memberId) => {
|
||||
res[0].id.split(",").foreach(async (memberId: number) => {
|
||||
await registerMember(roomId, memberId);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async initiateRoom(owner, type) {
|
||||
async initiateRoom(owner: number, roomType: number) {
|
||||
try {
|
||||
const roomId = await createRoom(this.envelope.subject, owner, this.messageId, type);
|
||||
const roomId = await createRoom(this.envelope.subject, owner, this.messageId, roomType);
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
this.registerMembers(roomId);
|
||||
return roomId;
|
||||
@@ -80,7 +93,7 @@ export default class RegisterMessageInApp {
|
||||
}
|
||||
}
|
||||
|
||||
async createOrRegisterOnExistence(owner, roomType) {
|
||||
async createOrRegisterOnExistence(owner: number, roomType: number) {
|
||||
await findRoomByOwner(owner).then(async (res) => {
|
||||
if (res.length == 0) {
|
||||
// first message with this sender
|
||||
@@ -93,42 +106,41 @@ export default class RegisterMessageInApp {
|
||||
}
|
||||
|
||||
async initiateThread() {
|
||||
await createRoom(this.envelope.subject, owner, this.messageId, roomType.THREAD).then(async (roomId) => {
|
||||
// find parent room infos
|
||||
await getRoomInfo(this.envelope.inReplyTo).then(async (room) => {
|
||||
// todo room not lenght, reply to transfer ?
|
||||
let root_id = room[0].root_id;
|
||||
if (!root_id) root_id = room[0].room_id;
|
||||
await registerThread(roomId, room[0].room_id, root_id);
|
||||
});
|
||||
// impl register previous message ?
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
await this.registerMembers(roomId);
|
||||
});
|
||||
await createRoom(this.envelope.subject, this.ownerId, this.messageId, roomType.THREAD).then(
|
||||
async (roomId: number) => {
|
||||
// find parent room infos
|
||||
await getRoomInfo(this.inReplyTo).then(async (room) => {
|
||||
// todo room not lenght, reply to transfer ?
|
||||
let root_id = room[0].root_id;
|
||||
if (!root_id) root_id = room[0].room_id;
|
||||
await registerThread(roomId, room[0].room_id, root_id);
|
||||
});
|
||||
// impl register previous message ?
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
await this.registerMembers(roomId);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
async createOrRegisterOnMembers(roomId) {
|
||||
const hasSameMembers = await hasSameMembersAsParent(this.messageID, this.envelope.inReplyTo);
|
||||
async createOrRegisterOnMembers(roomId: number) {
|
||||
const hasSameMembers = await hasSameMembersAsParent(this.messageId, this.inReplyTo);
|
||||
if (hasSameMembers) {
|
||||
await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date);
|
||||
} else {
|
||||
await this.initiateThread();
|
||||
await createThread(this.envelope.subject, this.ownerId, this.messageId, roomId, this.isDm()).then(
|
||||
async (threadId) => {
|
||||
await registerMessageInThread(this.messageId, threadId, this.isSeen);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async save() {
|
||||
await this.init();
|
||||
if (this.envelope.inReplyTo) {
|
||||
this.inReplyTo = this.envelope.inReplyTo;
|
||||
this.saveReply();
|
||||
} else {
|
||||
if (await this.isFromUs()) {
|
||||
if (this.isDm()) {
|
||||
// create or add new message to DM
|
||||
if (!this.envelope.to) throw new Error("Who send a DM and put the recipient in cc ?");
|
||||
const userTo = await getAddresseId(createAddress(this.envelope.to[0]));
|
||||
await this.createOrRegisterOnExistence(userTo, roomType.DM);
|
||||
} else {
|
||||
@@ -143,15 +155,14 @@ export default class RegisterMessageInApp {
|
||||
}
|
||||
|
||||
async saveReply() {
|
||||
const messageID = envelope.messageId;
|
||||
await findRoomsFromMessage(messageId).then(async (rooms) => {
|
||||
await findRoomsFromMessage(this.inReplyTo).then(async (rooms) => {
|
||||
if (rooms.length == 0) {
|
||||
// no rooms, so is a transfer
|
||||
// todo test if members of transferred message are included
|
||||
} else if (rooms.length === 1) {
|
||||
// only one room so message is only in a room and not in a thread
|
||||
// as a thread is associated to a room
|
||||
await isRoomGroup(rooms[0].room_id).then(async (isGroup) => {
|
||||
await isRoomGroup(rooms[0].room_id).then(async (isGroup: boolean) => {
|
||||
if (isGroup) {
|
||||
this.createOrRegisterOnMembers(rooms[0].room_id);
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { getAddresseId } from "../db/mail";
|
||||
import mailParser from "mailparser";
|
||||
import {simpleParser} from "mailparser";
|
||||
import moment from "moment";
|
||||
import {
|
||||
registerMessage,
|
||||
@@ -41,7 +41,7 @@ export function saveMessage(attrs, mailboxId, imap) {
|
||||
// saveSource(messageId, buffer);
|
||||
|
||||
// parse data
|
||||
mailParser(buffer, async (err, parsed) => {
|
||||
simpleParser(buffer, async (err, parsed) => {
|
||||
saveFromParsedData(parsed, messageId)
|
||||
.then(() => {
|
||||
resolve(messageId);
|
||||
@@ -68,7 +68,7 @@ export function saveMessage(attrs, mailboxId, imap) {
|
||||
}
|
||||
|
||||
async function saveFromParsedData(parsed, messageId) {
|
||||
const promises = [];
|
||||
const promises: Promise<any>[] = [];
|
||||
Object.keys(parsed).forEach((key) => {
|
||||
if (["from", "to", "cc", "bcc", "replyTo"].includes(key)) {
|
||||
promises.push(
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
export function nbMembers(envelope) {
|
||||
import { Envelope, User } from "../../interfaces/mail/attrs.interface";
|
||||
|
||||
export function nbMembers(envelope: Envelope) {
|
||||
return getMembers(envelope).length;
|
||||
}
|
||||
|
||||
export function getMembers(envelope) {
|
||||
const members: { mailbox: string; host: string }[] = [];
|
||||
const fields = ["from", "to", "sender", "replyTo", "cc", "bcc"];
|
||||
export function getMembers(envelope: Envelope) {
|
||||
const members: User[] = [];
|
||||
const fields = ["from", "to", "sender", "replyTo", "cc", "bcc"] as const;
|
||||
fields.forEach((field) => {
|
||||
if (!envelope[field]) return;
|
||||
envelope[field].forEach((member) => {
|
||||
envelope[field]?.forEach((member: User) => {
|
||||
if (members.find((m) => m.mailbox === member.mailbox && m.host === member.host)) return;
|
||||
members.push(member);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user