tests in typescript

This commit is contained in:
grimhilt
2023-04-01 22:36:51 +02:00
parent 90dd16ee0d
commit 11ab6a6a21
22 changed files with 1258 additions and 412 deletions

View File

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

View File

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

View File

@@ -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(

View File

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