started to convert to typescript
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
const { getMailbox, updateMailbox } = require("../../db/imap/imap");
|
||||
const { logger } = require("../../system/Logger");
|
||||
const { registerMessageInApp } = require("../saveMessage");
|
||||
const { saveMessage } = require("../storeMessage");
|
||||
import { ImapMessageAttributes } from "imap";
|
||||
import { getMailbox, updateMailbox } from "../../db/imap/imap";
|
||||
import logger from "../../system/Logger";
|
||||
import RegisterMessageInApp from "../saveMessage";
|
||||
import { saveMessage } from "../storeMessage";
|
||||
|
||||
export default class Box {
|
||||
imap: Imap;
|
||||
boxName: string;
|
||||
id: number;
|
||||
box: Object;
|
||||
|
||||
class Box {
|
||||
constructor(_imap, _boxId, _boxName) {
|
||||
this.imap = _imap;
|
||||
this.boxName = _boxName;
|
||||
@@ -23,16 +29,18 @@ class Box {
|
||||
}
|
||||
|
||||
sync(savedUid, currentUid) {
|
||||
const promises = [];
|
||||
const mails = [];
|
||||
const promises: Promise<unknown>[] = [];
|
||||
const mails: ImapMessageAttributes[] = [];
|
||||
logger.log(`Syncing from ${savedUid} to ${currentUid} uid`);
|
||||
const f = this.imap.seq.fetch(`${savedUid}:${currentUid}`, {
|
||||
// const f = this.imap.seq.fetch(`${savedUid}:${currentUid}`, {
|
||||
size: true,
|
||||
envelope: true,
|
||||
});
|
||||
|
||||
f.on("message", (msg, seqno) => {
|
||||
msg.once("attributes", (attrs) => {
|
||||
msg.once("attributes", (attrs: Attrs) => {
|
||||
console.log(attrs.envelope)
|
||||
mails.push(attrs);
|
||||
promises.push(saveMessage(attrs, this.id, this.imap));
|
||||
});
|
||||
@@ -44,14 +52,15 @@ class Box {
|
||||
|
||||
f.once("end", async () => {
|
||||
let step = 20;
|
||||
logger.log(promises.length)
|
||||
for (let i = 0; i < promises.length; i += step) {
|
||||
for (let j = i; j < (i + step && promises.length); j++) {
|
||||
console.log(j, promises.length, promises[j])
|
||||
await new Promise((resolve, reject) => {
|
||||
promises[j]
|
||||
.then(async (res) => {
|
||||
await registerMessageInApp(res, mails[j], this.id);
|
||||
resolve();
|
||||
const register = new RegisterMessageInApp(res, mails[j], this.id);
|
||||
await register.save();
|
||||
resolve("");
|
||||
})
|
||||
.catch((err) => {
|
||||
reject(err);
|
||||
@@ -61,16 +70,7 @@ class Box {
|
||||
logger.log(`Saved messages ${i + step > promises.length ? promises.length : i + step}/${mails.length}`);
|
||||
updateMailbox(this.id, mails[i].uid);
|
||||
}
|
||||
// await Promise.all(promises).then(async (res) => {
|
||||
// for (let i = 0; i < mails.length; i++) {
|
||||
// logger.log(`Saved message ${i}/${mails.length}`);
|
||||
// }
|
||||
// });
|
||||
updateMailbox(this.id, currentUid);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
Box,
|
||||
};
|
||||
}
|
||||
@@ -1,9 +1,15 @@
|
||||
const Imap = require("imap");
|
||||
const { getAllMailboxes, registerMailbox } = require("../../db/imap/imap");
|
||||
const { logger } = require("../../system/Logger");
|
||||
const { Box } = require("./Box");
|
||||
import { Account } from "./ImapSync";
|
||||
|
||||
import Imap from "imap";
|
||||
import { getAllMailboxes, registerMailbox } from "../../db/imap/imap";
|
||||
import logger from "../../system/Logger";
|
||||
import Box from "./Box";
|
||||
|
||||
export class ImapInstance {
|
||||
imap: Imap;
|
||||
account: Account;
|
||||
boxes: Box[];
|
||||
|
||||
class ImapInstance {
|
||||
constructor(account) {
|
||||
this.imap = new Imap({
|
||||
user: account.user,
|
||||
@@ -68,8 +74,4 @@ class ImapInstance {
|
||||
if (!allBox.includes("/")) logger.warn("Did not find 'All' mailbox");
|
||||
return allBox;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ImapInstance,
|
||||
};
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
const { getAllAccounts } = require("../../db/imap/imap");
|
||||
const { logger } = require("../../system/Logger");
|
||||
const { ImapInstance } = require("./ImapInstance");
|
||||
|
||||
class ImapSync {
|
||||
constructor() {
|
||||
this.instances = [];
|
||||
}
|
||||
|
||||
init() {
|
||||
getAllAccounts().then((accounts) => {
|
||||
for (let i = 0; i < accounts.length; i++) {
|
||||
accounts[i].password = accounts[i]?.password.toString().replace(/[\u{0080}-\u{FFFF}]/gu,"");
|
||||
this.addInstance(accounts[i]);
|
||||
}
|
||||
}).catch((err) => {
|
||||
logger.error(err);
|
||||
});
|
||||
}
|
||||
|
||||
addInstance(config) {
|
||||
this.instances.push(new ImapInstance(config));
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ImapSync
|
||||
}
|
||||
33
back/mails/imap/ImapSync.ts
Normal file
33
back/mails/imap/ImapSync.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { getAllAccounts } from "../../db/imap/imap";
|
||||
import logger from "../../system/Logger";
|
||||
import { ImapInstance } from "./ImapInstance";
|
||||
|
||||
export interface Account {
|
||||
id: number;
|
||||
user: string
|
||||
password?: string
|
||||
}
|
||||
|
||||
export default class ImapSync {
|
||||
instances: ImapInstance[]
|
||||
|
||||
constructor() {
|
||||
this.instances = [];
|
||||
}
|
||||
|
||||
init() {
|
||||
getAllAccounts().then((accounts: Account[]) => {
|
||||
for (let i = 0; i < accounts.length; i++) {
|
||||
accounts[i].password = accounts[i]?.password?.toString().replace(/[\u{0080}-\u{FFFF}]/gu,"");
|
||||
if (accounts[i].id == 2) continue; //debug_todo
|
||||
this.addInstance(accounts[i]);
|
||||
}
|
||||
}).catch((err) => {
|
||||
logger.error(err);
|
||||
});
|
||||
}
|
||||
|
||||
addInstance(config) {
|
||||
this.instances.push(new ImapInstance(config));
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,18 @@
|
||||
const {
|
||||
import {
|
||||
createRoom,
|
||||
registerMessageInRoom,
|
||||
createThread,
|
||||
registerMessageInThread,
|
||||
isRoomGroup,
|
||||
findRoomsFromMessage,
|
||||
hasSameMembersAsParent,
|
||||
registerThread,
|
||||
registerMember,
|
||||
getAllMembers,
|
||||
} = require("../db/saveMessageApp");
|
||||
} from "../db/saveMessageApp";
|
||||
|
||||
const { findRoomByOwner, getAddresseId, getUserIdOfMailbox } = require("../db/mail");
|
||||
const { nbMembers } = require("./utils/envelopeUtils");
|
||||
const { logger } = require("../system/Logger");
|
||||
import { findRoomByOwner, getAddresseId, getUserIdOfMailbox } from "../db/mail";
|
||||
import { nbMembers } from "./utils/envelopeUtils";
|
||||
import logger from "../system/Logger";
|
||||
import { ImapMessageAttributes } from "imap";
|
||||
|
||||
/**
|
||||
* take object address and join mailbox and host to return mailbox@host
|
||||
@@ -22,22 +21,31 @@ function createAddress(elt) {
|
||||
return `${elt.mailbox}@${elt.host}`;
|
||||
}
|
||||
|
||||
const roomType = {
|
||||
export const roomType = {
|
||||
ROOM: 0,
|
||||
CHANNEL: 1,
|
||||
GROUP: 2,
|
||||
DM: 3,
|
||||
THREAD: 4
|
||||
}
|
||||
THREAD: 4,
|
||||
};
|
||||
|
||||
class registerMessageInApp {
|
||||
export default class RegisterMessageInApp {
|
||||
messageId: number;
|
||||
attrs: ImapMessageAttributes;
|
||||
envelope?: ImapMessageAttributes.envelope;
|
||||
messageID?: string;
|
||||
boxId: number;
|
||||
isSeen: boolean;
|
||||
ownerId: number;
|
||||
userId: number;
|
||||
|
||||
constructor(_messageId, _attrs, _boxId) {
|
||||
this.messageId = _messageId;
|
||||
this.attrs = _attrs;
|
||||
this.envelope = this.attrs.envelope;
|
||||
this.messageID = this.envelope.messageId;
|
||||
this.messageID = this.envelope?.messageId;
|
||||
this.boxId = _boxId;
|
||||
this.isSeen = this.attrs.flags.includes("\\Seen") ? 1 : 0;
|
||||
this.isSeen = this.attrs.flags.includes("\\Seen") ? true : false;
|
||||
this.ownerId;
|
||||
this.userId;
|
||||
}
|
||||
@@ -55,7 +63,7 @@ class registerMessageInApp {
|
||||
|
||||
async registerMembers(roomId) {
|
||||
getAllMembers(this.messageId).then((res) => {
|
||||
res[0].id.split(',').foreach(async (memberId) => {
|
||||
res[0].id.split(",").foreach(async (memberId) => {
|
||||
await registerMember(roomId, memberId);
|
||||
});
|
||||
});
|
||||
@@ -89,8 +97,8 @@ class registerMessageInApp {
|
||||
// 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
|
||||
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 ?
|
||||
@@ -162,8 +170,3 @@ class registerMessageInApp {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
registerMessageInApp,
|
||||
roomType
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
const { getAddresseId } = require("../db/mail");
|
||||
const { simpleParser } = require("mailparser");
|
||||
const moment = require("moment");
|
||||
const {
|
||||
import { getAddresseId } from "../db/mail";
|
||||
import mailParser from "mailparser";
|
||||
import moment from "moment";
|
||||
import {
|
||||
registerMessage,
|
||||
registerMailbox_message,
|
||||
saveHeader_fields,
|
||||
@@ -9,12 +9,12 @@ const {
|
||||
registerBodypart,
|
||||
saveBodypart,
|
||||
saveSource,
|
||||
} = require("../db/saveMessage");
|
||||
} from "../db/saveMessage";
|
||||
|
||||
const { getFieldId } = require("../db/mail");
|
||||
const { logger } = require("../system/Logger");
|
||||
import { getFieldId } from "../db/mail";
|
||||
import logger from "../system/Logger";
|
||||
|
||||
function saveMessage(attrs, mailboxId, imap) {
|
||||
export function saveMessage(attrs, mailboxId, imap) {
|
||||
const envelope = attrs.envelope;
|
||||
const ts = moment(new Date(envelope.date).getTime()).format("YYYY-MM-DD HH:mm:ss");
|
||||
const rfc822size = attrs.size;
|
||||
@@ -41,7 +41,7 @@ function saveMessage(attrs, mailboxId, imap) {
|
||||
// saveSource(messageId, buffer);
|
||||
|
||||
// parse data
|
||||
simpleParser(buffer, async (err, parsed) => {
|
||||
mailParser(buffer, async (err, parsed) => {
|
||||
saveFromParsedData(parsed, messageId)
|
||||
.then(() => {
|
||||
resolve(messageId);
|
||||
@@ -118,9 +118,6 @@ async function saveFromParsedData(parsed, messageId) {
|
||||
// todo when transfered
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
saveMessage,
|
||||
};
|
||||
|
||||
if (process.env["NODE_DEV"] == "TEST") {
|
||||
module.exports = {
|
||||
@@ -1,9 +1,9 @@
|
||||
function nbMembers(envelope) {
|
||||
export function nbMembers(envelope) {
|
||||
return getMembers(envelope).length;
|
||||
}
|
||||
|
||||
function getMembers(envelope) {
|
||||
const members = [];
|
||||
export function getMembers(envelope) {
|
||||
const members: { mailbox: string; host: string }[] = [];
|
||||
const fields = ["from", "to", "sender", "replyTo", "cc", "bcc"];
|
||||
fields.forEach((field) => {
|
||||
if (!envelope[field]) return;
|
||||
@@ -14,8 +14,3 @@ function getMembers(envelope) {
|
||||
});
|
||||
return members;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
nbMembers,
|
||||
getMembers,
|
||||
};
|
||||
Reference in New Issue
Block a user