diff --git a/back/imap/storeMessage.js b/back/imap/storeMessage.js index 891d4ed..659fae3 100644 --- a/back/imap/storeMessage.js +++ b/back/imap/storeMessage.js @@ -1,7 +1,7 @@ const { getAddresseId } = require("../sql/mail"); const { DEBUG } = require("../utils/debug"); const { simpleParser } = require("mailparser"); - +const moment = require('moment'); const { registerMessage, registerMailbox_message, @@ -16,13 +16,14 @@ const { registerMessageInRoom, createThread, registerMessageInThread, - isRoomGroup + isRoomGroup, + findSpacesFromMessage } = require("../sql/saveMessageApp"); const { getFieldId, findRoomByOwner } = require("../sql/mail"); function saveMessage(attrs, mailboxId, imap) { const envelope = attrs.envelope; - const timestamp = new Date(envelope.date).getTime(); + const timestamp = moment(new Date(envelope.date).getTime()).format('YYYY-MM-DD HH:mm:ss'); const rfc822size = attrs.size; registerMessage(timestamp, rfc822size, envelope.messageId).then( @@ -94,7 +95,7 @@ function saveMessage(attrs, mailboxId, imap) { getFieldId(newKey).then((fieldId) => { if (envelope[key]) { envelope[key].forEach((elt, index) => { - getAddresseId(`${elt.mailbox}@${elt.host}`).then((addressId) => { + getAddresseId(createAddress(elt)).then((addressId) => { saveAddress_fields(messageId, part, position, fieldId, index, addressId); }); }); @@ -104,7 +105,8 @@ function saveMessage(attrs, mailboxId, imap) { }); // todo check for different provider name of inreplyto - registerMessageInApp() + // registerMessageInApp(envelope, messageId); + console.log(envelope) } ); @@ -114,24 +116,33 @@ function haveSameReceivers() { // take cc and to } -function registerMessageInApp() { - if (envelope.inReplyTo) { - registerReplyMessage(); - } else { - findRoomByOwner(ownerId).then((res) => { - if (res.length == 0) { - registerMessageInRoom(messageId, res[0].id); - } else { - createRoom(envelope.subject, ownerId, envelope.flags.includes["seen"]).then((roomId) => { - registerMessageInRoom(messageId, roomId); - }); - } - }); - } +/** + * take object address and join mailbox and host to return mailbox@host + */ +function createAddress(elt) { + return `${elt.mailbox}@${elt.host}` } -function registerReplyMessage() { - findSpaceFromMessage(messageId).then((spaces) => { +function registerMessageInApp(envelope, messageId) { + getAddresseId(createAddress(envelope.sender[0])).then((ownerId) => { + if (envelope.inReplyTo) { + registerReplyMessage(); + } else { + findRoomByOwner(ownerId).then((res) => { + if (res.length == 0) { + registerMessageInRoom(messageId, res[0].id); + } else { + createRoom(envelope.subject, ownerId, envelope.flags.includes["seen"]).then((roomId) => { + registerMessageInRoom(messageId, roomId); + }); + } + }); + } + }); +} + +function registerReplyMessage(envelope, messageId) { + findSpacesFromMessage(messageId).then((spaces) => { if(spaces.length == 0) { // no space, so is a transfer // todo test if members of transferred message are included } else if (spaces[0].room) { // message in room diff --git a/back/package-lock.json b/back/package-lock.json index 93dd830..5d6d2cb 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -8,6 +8,7 @@ "imap": "^0.8.19", "imap-simple": "^5.1.0", "mailparser": "^3.6.3", + "moment": "^2.29.4", "mysql": "^2.18.1", "vue-router": "^4.1.6" } @@ -446,6 +447,15 @@ "libqp": "2.0.1" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/mysql": { "version": "2.18.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/mysql/-/mysql-2.18.1.tgz", @@ -1102,6 +1112,11 @@ "libqp": "2.0.1" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, "mysql": { "version": "2.18.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/mysql/-/mysql-2.18.1.tgz", diff --git a/back/package.json b/back/package.json index 6b52e49..d627804 100644 --- a/back/package.json +++ b/back/package.json @@ -3,6 +3,7 @@ "imap": "^0.8.19", "imap-simple": "^5.1.0", "mailparser": "^3.6.3", + "moment": "^2.29.4", "mysql": "^2.18.1", "vue-router": "^4.1.6" } diff --git a/back/sql/bdd.js b/back/sql/bdd.js index 12a5a92..e1d7789 100644 --- a/back/sql/bdd.js +++ b/back/sql/bdd.js @@ -18,6 +18,40 @@ bdd.connect(function (err) { } }); +function execQueryAsync(query) { + return new Promise((resolve, reject) => { + bdd.query(query, (err, results, fields) => { + if (err) { + reject(err); + } else { + resolve(results); + } + }); + }); +} + +function execQueryAsyncWithId(query) { + return new Promise((resolve, reject) => { + bdd.query(query, (err, results, fields) => { + if (err) { + reject(err); + } else { + resolve(results.insertId); + } + }); + }); +} + +function execQuery(query) { + bdd.query(query, (err, results, fields) => { + if (err) throw (err); + return results + }); +} + module.exports = { - bdd: bdd, + bdd, // todo remove this + execQuery, + execQueryAsync, + execQueryAsyncWithId }; \ No newline at end of file diff --git a/back/sql/mail.js b/back/sql/mail.js index 57463e2..f9e4b6d 100644 --- a/back/sql/mail.js +++ b/back/sql/mail.js @@ -1,4 +1,4 @@ -const bdd = require("./bdd.js").bdd; +const { bdd, execQueryAsyncWithId } = require("./bdd.js"); const DEBUG = require("../utils/debug").DEBUG; function isValidEmail(email) { @@ -7,18 +7,12 @@ function isValidEmail(email) { } -function getAddresseId(email, name) { +async function getAddresseId(email, name) { const localpart = email.split("@")[0]; const domain = email.split("@")[1]; - return new Promise((resolve, reject) => { - if (!isValidEmail(email)) reject("Not a valid email"); - const query = `INSERT INTO address (address_name, localpart, domain, email) VALUES ('${name}', '${localpart}', '${domain}', '${email}') - ON DUPLICATE KEY UPDATE email = '${email}', id = LAST_INSERT_ID(id)`; - bdd.query(query, (err, results, fields) => { - if (err) reject(err); - resolve(results.insertId); - }); - }); + const query = `INSERT INTO address (address_name, localpart, domain, email) VALUES ('${name}', '${localpart}', '${domain}', '${email}') + ON DUPLICATE KEY UPDATE email = '${email}', address_id = LAST_INSERT_ID(address_id)`; + return await execQueryAsyncWithId(query); } function getMailboxId(email) { @@ -28,15 +22,9 @@ function getMailboxId(email) { // todo } -function getFieldId(field) { - return new Promise((resolve, reject) => { - const query = `INSERT INTO field_name (field_name) VALUES ('${field}') ON DUPLICATE KEY UPDATE field_id=LAST_INSERT_ID(field_id); - `; - bdd.query(query, (err, results, fields) => { - if (err) reject(err); - resolve(results.insertId); - }); - }); +async function getFieldId(field) { + const query = `INSERT INTO field_name (field_name) VALUES ('${field}') ON DUPLICATE KEY UPDATE field_id=LAST_INSERT_ID(field_id)`; + return await execQueryAsyncWithId(query); } function findRoomByOwner(ownerId) { diff --git a/back/sql/saveMessage.js b/back/sql/saveMessage.js index 4f3e741..e48c5d5 100644 --- a/back/sql/saveMessage.js +++ b/back/sql/saveMessage.js @@ -1,9 +1,10 @@ -const bdd = require("./bdd.js").bdd; +const {bdd} = require("./bdd.js"); const DEBUG = require("../utils/debug").DEBUG; function registerMessage(timestamp, rfc822size, messageId) { return new Promise((resolve, reject) => { - const query = `INSERT INTO message (idate, messageID, rfc822size) VALUES (${timestamp}, '${messageId}', '${rfc822size}')`; + const query = `INSERT INTO message (idate, messageID, rfc822size) VALUES ('${timestamp}', '${messageId}', ${rfc822size}) + ON DUPLICATE KEY UPDATE message_id = LAST_INSERT_ID(message_id)`; bdd.query(query, (err, results, fields) => { if (err) reject(err); resolve(results.insertId); @@ -19,7 +20,7 @@ function registerMailbox_message(mailboxId, uid, messageId, modseq, seen, delete } function registerBodypart(messageId, part, bodypartId, bytes, nbLines) { - const query = `INSERT IGNORE INTO part_number (message_id, part, bodypart, bytes, nbLines) VALUES ('${messageId}', '${part}', '${bodypartId}', '${bytes}', '${nbLines}')`; + const query = `INSERT IGNORE INTO part_number (message_id, part, bodypart_id, bytes, nb_lines) VALUES ('${messageId}', '${part}', '${bodypartId}', '${bytes}', '${nbLines}')`; bdd.query(query, (err, results, fields) => { if (err) DEBUG.log(err); }); diff --git a/back/sql/saveMessageApp.js b/back/sql/saveMessageApp.js index 08e30d3..6a781bd 100644 --- a/back/sql/saveMessageApp.js +++ b/back/sql/saveMessageApp.js @@ -83,10 +83,15 @@ function isRoomGroup(roomId) { }); } +function findSpacesFromMessage(messageId) { + const query = ``; +} + module.exports = { createRoom, registerMessageInRoom, createThread, registerMessageInThread, - isRoomGroup + isRoomGroup, + findSpacesFromMessage }; \ No newline at end of file