Compare commits
2 Commits
a5d325818b
...
02e0e05c76
Author | SHA1 | Date | |
---|---|---|---|
|
02e0e05c76 | ||
|
7ba1ee083d |
@ -7,7 +7,7 @@ export async function members(body, res) {
|
|||||||
getMembers(roomId).then((addresses) => {
|
getMembers(roomId).then((addresses) => {
|
||||||
res.status(statusCode.OK).json(addresses);
|
res.status(statusCode.OK).json(addresses);
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
logger.error(err)
|
logger.err(err)
|
||||||
res.status(statusCode.INTERNAL_SERVER_ERROR);
|
res.status(statusCode.INTERNAL_SERVER_ERROR);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ export async function messages(body, res) {
|
|||||||
getMessages(roomId).then((messages) => {
|
getMessages(roomId).then((messages) => {
|
||||||
res.status(statusCode.OK).json(messages);
|
res.status(statusCode.OK).json(messages);
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
logger.error(err)
|
logger.err(err)
|
||||||
res.status(statusCode.INTERNAL_SERVER_ERROR);
|
res.status(statusCode.INTERNAL_SERVER_ERROR);
|
||||||
});
|
});
|
||||||
}
|
}
|
@ -7,7 +7,7 @@ export async function rooms(body, res) {
|
|||||||
getRooms(mailboxId).then((rooms) => {
|
getRooms(mailboxId).then((rooms) => {
|
||||||
res.status(statusCode.OK).json(rooms);
|
res.status(statusCode.OK).json(rooms);
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
logger.error(err)
|
logger.err(err)
|
||||||
res.status(statusCode.INTERNAL_SERVER_ERROR);
|
res.status(statusCode.INTERNAL_SERVER_ERROR);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ export const db = mysql.createConnection({
|
|||||||
|
|
||||||
db.connect(function (err) {
|
db.connect(function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
logger.error(`Unable to connect database ${err.code}`);
|
logger.err(`Unable to connect database ${err.code}`);
|
||||||
} else {
|
} else {
|
||||||
logger.log("Database successfully connected");
|
logger.log("Database successfully connected");
|
||||||
}
|
}
|
||||||
@ -45,7 +45,7 @@ export function execQueryAsyncWithId(query: string, values: any[]): Promise<numb
|
|||||||
export function execQuery(query: string, values: any[]) {
|
export function execQuery(query: string, values: any[]) {
|
||||||
db.query(query, values, (err, results, fields) => {
|
db.query(query, values, (err, results, fields) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
logger.error(err);
|
logger.err(err);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
|
@ -43,4 +43,5 @@ export interface AttrsWithEnvelope {
|
|||||||
envelope: Envelope;
|
envelope: Envelope;
|
||||||
/** The RFC822 message size (only set if requested with fetch()). */
|
/** The RFC822 message size (only set if requested with fetch()). */
|
||||||
size?: number | undefined;
|
size?: number | undefined;
|
||||||
|
modseq?: number;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import Imap, { ImapMessageAttributes, MailBoxes } from "imap";
|
import Imap, { ImapMessageAttributes, MailBoxes } from "imap";
|
||||||
import { getMailbox, updateMailbox } from "../../db/imap/imap";
|
import { getMailbox, updateMailbox } from "../../db/imap/imap";
|
||||||
import { Attrs } 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 "../saveMessage";
|
||||||
import { saveMessage } from "../storeMessage";
|
import { saveMessage } from "../storeMessage";
|
||||||
@ -24,14 +24,14 @@ export default class Box {
|
|||||||
|
|
||||||
const readOnly = true;
|
const readOnly = true;
|
||||||
this.imap.openBox(this.boxName, readOnly, (err, box) => {
|
this.imap.openBox(this.boxName, readOnly, (err, box) => {
|
||||||
if (err) logger.error(err);
|
if (err) logger.err(err);
|
||||||
this.sync(this.box.uidnext, box.uidnext);
|
this.sync(this.box.uidnext, box.uidnext);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sync(savedUid, currentUid) {
|
sync(savedUid, currentUid) {
|
||||||
const promises: Promise<unknown>[] = [];
|
const promises: Promise<unknown>[] = [];
|
||||||
const mails: ImapMessageAttributes[] = [];
|
const mails: Attrs[] = [];
|
||||||
logger.log(`Syncing from ${savedUid} to ${currentUid} uid`);
|
logger.log(`Syncing from ${savedUid} to ${currentUid} uid`);
|
||||||
const f = this.imap.seq.fetch(`${savedUid}:${currentUid}`, {
|
const f = this.imap.seq.fetch(`${savedUid}:${currentUid}`, {
|
||||||
// const f = this.imap.seq.fetch(`${savedUid}:${currentUid}`, {
|
// const f = this.imap.seq.fetch(`${savedUid}:${currentUid}`, {
|
||||||
@ -40,7 +40,7 @@ export default class Box {
|
|||||||
});
|
});
|
||||||
|
|
||||||
f.on("message", (msg, seqno) => {
|
f.on("message", (msg, seqno) => {
|
||||||
msg.once("attributes", (attrs: Attrs) => {
|
msg.once("attributes", (attrs: AttrsWithEnvelope) => {
|
||||||
console.log(attrs.envelope)
|
console.log(attrs.envelope)
|
||||||
mails.push(attrs);
|
mails.push(attrs);
|
||||||
promises.push(saveMessage(attrs, this.id, this.imap));
|
promises.push(saveMessage(attrs, this.id, this.imap));
|
||||||
@ -48,7 +48,7 @@ export default class Box {
|
|||||||
});
|
});
|
||||||
|
|
||||||
f.once("error", (err) => {
|
f.once("error", (err) => {
|
||||||
logger.error("Fetch error: " + err);
|
logger.err("Fetch error: " + err);
|
||||||
});
|
});
|
||||||
|
|
||||||
f.once("end", async () => {
|
f.once("end", async () => {
|
||||||
@ -58,7 +58,7 @@ export default class Box {
|
|||||||
for (let j = i; j < (i + step && promises.length); j++) {
|
for (let j = i; j < (i + step && promises.length); j++) {
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
promises[j]
|
promises[j]
|
||||||
.then(async (res) => {
|
.then(async (res: number) => {
|
||||||
const register = new RegisterMessageInApp(res, mails[j], this.id);
|
const register = new RegisterMessageInApp(res, mails[j], this.id);
|
||||||
await register.save();
|
await register.save();
|
||||||
resolve("");
|
resolve("");
|
||||||
|
@ -31,7 +31,7 @@ export class ImapInstance {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.imap.once("error", (err) => {
|
this.imap.once("error", (err) => {
|
||||||
logger.error("Imap error for " + this.account.user + ": " + err);
|
logger.err("Imap error for " + this.account.user + ": " + err);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.imap.once("end", () => {
|
this.imap.once("end", () => {
|
||||||
@ -47,7 +47,7 @@ export class ImapInstance {
|
|||||||
this.boxes.push(new Box(this.imap, mailboxes[0].mailbox_id, mailboxes[0].mailbox_name));
|
this.boxes.push(new Box(this.imap, mailboxes[0].mailbox_id, mailboxes[0].mailbox_name));
|
||||||
} else {
|
} else {
|
||||||
this.imap.getBoxes("", (err, boxes) => {
|
this.imap.getBoxes("", (err, boxes) => {
|
||||||
if (err) logger.error(err);
|
if (err) logger.err(err);
|
||||||
const allBoxName = this.getAllBox(boxes);
|
const allBoxName = this.getAllBox(boxes);
|
||||||
registerMailbox(this.account.id, allBoxName).then((mailboxId) => {
|
registerMailbox(this.account.id, allBoxName).then((mailboxId) => {
|
||||||
this.boxes.push(new Box(this.imap, mailboxId, allBoxName));
|
this.boxes.push(new Box(this.imap, mailboxId, allBoxName));
|
||||||
|
@ -23,7 +23,7 @@ export default class ImapSync {
|
|||||||
this.addInstance(accounts[i]);
|
this.addInstance(accounts[i]);
|
||||||
}
|
}
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
logger.error(err);
|
logger.err(err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ export default class RegisterMessageInApp {
|
|||||||
this.registerMembers(roomId);
|
this.registerMembers(roomId);
|
||||||
return roomId;
|
return roomId;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error(err);
|
logger.err(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { getAddresseId } from "../db/mail";
|
import { getAddresseId } from "../db/mail";
|
||||||
import {simpleParser} from "mailparser";
|
import {simpleParser} from "mailparser";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
|
import Imap from "imap";
|
||||||
import {
|
import {
|
||||||
registerMessage,
|
registerMessage,
|
||||||
registerMailbox_message,
|
registerMailbox_message,
|
||||||
@ -13,8 +14,9 @@ import {
|
|||||||
|
|
||||||
import { getFieldId } from "../db/mail";
|
import { getFieldId } from "../db/mail";
|
||||||
import logger from "../system/Logger";
|
import logger from "../system/Logger";
|
||||||
|
import { AttrsWithEnvelope } from "../interfaces/mail/attrs.interface";
|
||||||
|
|
||||||
export function saveMessage(attrs, mailboxId, imap) {
|
export function saveMessage(attrs: AttrsWithEnvelope, mailboxId: number, imap: Imap): Promise<number> {
|
||||||
const envelope = attrs.envelope;
|
const envelope = attrs.envelope;
|
||||||
const ts = moment(new Date(envelope.date).getTime()).format("YYYY-MM-DD HH:mm:ss");
|
const ts = moment(new Date(envelope.date).getTime()).format("YYYY-MM-DD HH:mm:ss");
|
||||||
const rfc822size = attrs.size;
|
const rfc822size = attrs.size;
|
||||||
@ -26,7 +28,7 @@ export function saveMessage(attrs, mailboxId, imap) {
|
|||||||
const isSeen = attrs.flags.includes("\\Seen") ? 1 : 0; // todo verify
|
const isSeen = attrs.flags.includes("\\Seen") ? 1 : 0; // todo verify
|
||||||
const deleted = attrs.flags.includes("\\Deleted") ? 1 : 0; // todo verify
|
const deleted = attrs.flags.includes("\\Deleted") ? 1 : 0; // todo verify
|
||||||
|
|
||||||
registerMailbox_message(mailboxId, attrs.uid, messageId, attrs.modseq, isSeen, deleted);
|
registerMailbox_message(mailboxId, attrs.uid, messageId, attrs?.modseq, isSeen, deleted);
|
||||||
const f = imap.fetch(attrs.uid, { bodies: "" });
|
const f = imap.fetch(attrs.uid, { bodies: "" });
|
||||||
let buffer = "";
|
let buffer = "";
|
||||||
|
|
||||||
|
15
back/package-lock.json
generated
15
back/package-lock.json
generated
@ -7,6 +7,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ajv": "^8.12.0",
|
"ajv": "^8.12.0",
|
||||||
"ajv-formats": "^2.1.1",
|
"ajv-formats": "^2.1.1",
|
||||||
|
"colors": "^1.4.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^16.0.3",
|
"dotenv": "^16.0.3",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
@ -2207,6 +2208,15 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/colors": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/colors/-/colors-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.1.90"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/concat-map": {
|
"node_modules/concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/concat-map/-/concat-map-0.0.1.tgz",
|
"resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/concat-map/-/concat-map-0.0.1.tgz",
|
||||||
@ -7508,6 +7518,11 @@
|
|||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"colors": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/colors/-/colors-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
|
||||||
|
},
|
||||||
"concat-map": {
|
"concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/concat-map/-/concat-map-0.0.1.tgz",
|
"resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/concat-map/-/concat-map-0.0.1.tgz",
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ajv": "^8.12.0",
|
"ajv": "^8.12.0",
|
||||||
"ajv-formats": "^2.1.1",
|
"ajv-formats": "^2.1.1",
|
||||||
|
"colors": "^1.4.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^16.0.3",
|
"dotenv": "^16.0.3",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
@ -1,42 +1,52 @@
|
|||||||
|
import color from "colors";
|
||||||
|
|
||||||
|
const logType = {
|
||||||
|
LOG: 0,
|
||||||
|
DEBUG: 1,
|
||||||
|
WARN: 2,
|
||||||
|
ERR: 3,
|
||||||
|
};
|
||||||
|
|
||||||
class Logger {
|
class Logger {
|
||||||
constructor() {
|
constructor() {}
|
||||||
|
|
||||||
}
|
print(header: string, message: string, type: number) {
|
||||||
|
const content = `[${this._timestamp}] - [${header}] -- ${message}`;
|
||||||
log(...content): void {
|
|
||||||
// console.log(this._prefix("log"), content);
|
|
||||||
}
|
|
||||||
|
|
||||||
warn(...content): void {
|
|
||||||
// console.warn(this._prefix("warn"), content);
|
|
||||||
}
|
|
||||||
|
|
||||||
error(...content): void {
|
|
||||||
// console.error(this._prefix("err"), content);
|
|
||||||
}
|
|
||||||
|
|
||||||
_prefix(type: string): string {
|
|
||||||
let typeStr = "";
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "log":
|
case logType.LOG:
|
||||||
typeStr = "LOG"
|
console.log(content);
|
||||||
break;
|
break;
|
||||||
case "warn":
|
case logType.DEBUG:
|
||||||
typeStr = "WARN"
|
console.debug(content);
|
||||||
break;
|
break;
|
||||||
case "err":
|
case logType.WARN:
|
||||||
typeStr = "ERR"
|
console.warn(content);
|
||||||
break;
|
break;
|
||||||
default:
|
case logType.ERR:
|
||||||
|
console.error(content);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return `[${typeStr}: ${this._timestamp()}]`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_timestamp() {
|
log = (...message: any[]) => this.print("LOG", `${message}`, logType.LOG);
|
||||||
return new Date().toLocaleString();
|
err = (...message: any[]) => this.print("ERR", `${message}`, logType.ERR);
|
||||||
|
warn = (...message: any[]) => this.print("WARN", `${message}`, logType.WARN);
|
||||||
|
debug = (...message: any[]) => this.print("DEBUG", `${message}`, logType.DEBUG);
|
||||||
|
success = (...message: any[]) => this.print("SUCCESS".green, `${message}`, logType.LOG);
|
||||||
|
|
||||||
|
get = (url: string, state: string, ...message: string[]) =>
|
||||||
|
this.print("GET".green, `[${state} - ${url}]: ${message}`, logType.LOG);
|
||||||
|
post = (url: string, state: string, ...message: string[]) =>
|
||||||
|
this.print("POST".blue, `[${state} - ${url}]: ${message}`, logType.LOG);
|
||||||
|
put = (url: string, state: string, ...message: string[]) =>
|
||||||
|
this.print("PUT".yellow, `[${state} - ${url}]: ${message}`, logType.LOG);
|
||||||
|
del = (url: string, state: string, ...message: string[]) =>
|
||||||
|
this.print("DEL".red, `[${state} - ${url}]: ${message}`, logType.LOG);
|
||||||
|
|
||||||
|
get _timestamp() {
|
||||||
|
return new Date().toLocaleString("en-GB", { hour12: false });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const logger = new Logger();
|
const logger = new Logger();
|
||||||
export default logger;
|
export default logger;
|
||||||
|
@ -36,9 +36,6 @@ export function generateAttrs(options: Options): AttrsWithEnvelope {
|
|||||||
"flags": options.flags ?? [],
|
"flags": options.flags ?? [],
|
||||||
"uid": options.uid ?? randomInt(3),
|
"uid": options.uid ?? randomInt(3),
|
||||||
"modseq": options.modseq ?? randomInt(7),
|
"modseq": options.modseq ?? randomInt(7),
|
||||||
"x-gm-labels": ["\\Inbox"],
|
|
||||||
"x-gm-msgid": "1760991478422670209",
|
|
||||||
"x-gm-thrid": "1760991478422670209",
|
|
||||||
};
|
};
|
||||||
return attrs;
|
return attrs;
|
||||||
}
|
}
|
||||||
|
@ -8,10 +8,5 @@
|
|||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"types": ["node", "jest"],
|
"types": ["node", "jest"],
|
||||||
"paths": {
|
}
|
||||||
"*": ["node_modules/*", "src/types/*"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"include": ["src/**/*.ts"],
|
|
||||||
"exclude": ["node_modules"]
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user