Compare commits

...

2 Commits

Author SHA1 Message Date
grimhilt
02e0e05c76 improve logger 2023-04-02 12:59:11 +02:00
grimhilt
7ba1ee083d run server as typescript 2023-04-02 12:35:55 +02:00
15 changed files with 75 additions and 54 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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("");

View File

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

View File

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

View File

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

View File

@ -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
View File

@ -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",

View File

@ -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",

View File

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

View File

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

View File

@ -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"]
} }