File: //matrixSwot/backend/apis/sendgrid/post/insights.js
/**
* @author Cristofer Marinho
* @date 2019-05
* @name InsightsBoarding // Service to inbound Mail in Insights@matrixswot.ai ||
* @method POST
*/
const fs = require("fs");
const path = require("path");
const moment = require("moment-timezone");
/*extensions:
USED IN:
Front-End: compoenents/Timeline/TimelineComponent
*/
const api = require("./../../../database/conf"),
multer = require("multer"),
inMemoryStorage = multer.memoryStorage(),
uploadStrategy = multer({ storage: inMemoryStorage }).single("image"),
azureStorage = require("azure-storage"),
blobService = azureStorage.createBlobService(),
getStream = require("into-stream"),
containerName = `${process.env.LOCAL !== "PROD" ? `dev-` : ``}${
process.env.CONTAINERINSIGHT
}`;
const handleError = (err, res) => {
res.status(500);
res.render("error", { error: err });
};
const getBlobName = originalName => {
const identifier = Math.random()
.toString()
.replace(/0\./, ""); // remove "0." from start of string
return `${identifier}-${originalName}`;
};
const request = async (req, res) => {
var createDate = moment(new Date())
.tz("America/Sao_Paulo")
.unix();
let data = {
from: req.mail.from,
subject: req.mail.subject,
text: req.mail.text,
html: req.mail.html
};
var mailVerify = `
MATCH (a:Insights)
WHERE
a.from='${data.from}' AND
a.subject='${data.subject}' AND
a.text='${
data.text
? data.text.replace(data.text.match(/\bhttps?:\/\/\S+/gi), "")
: ""
}'
RETURN a
`;
let execMailVerify = await api.session
.run(mailVerify, { html: data.html ? data.html : " " })
.then(result => {
return result.records;
})
.catch(err => {
console.log(err);
});
if (execMailVerify.length === 0) {
var Query = `MATCH (u:User) WHERE id(u)=${req.idUser} `;
if (req.nodeId) {
Query += `MATCH (n) WHERE id(n)=${req.nodeId} `;
}
Query += `CREATE (u)-[c:CREATED {createDate:'${createDate}'}]->(i:Insights $data) `;
if (req.nodeId) {
Query += `MERGE (i)-[s:IN]->(n) `;
}
Query += `RETURN i `;
let execQuery = await api.session
.run(Query, { data })
.then(result => {
return result.records;
})
.catch(err => {
console.log("error on line 84 ===>>>");
console.log(err);
});
if (execQuery.length > 0) {
var auth = [];
auth = { user: { idUser: req.idUser } };
var idRel = execQuery[0].get(0).identity.low;
var matches = [];
matches = data.text.match(/\bhttps?:\/\/\S+/gi);
if (matches && matches.length > 0) {
matches.map(async mat => {
var reqUrlPreview = await require("../../../modules/timeline/post/preview");
var resUrlPreview = await reqUrlPreview.request(auth, { value: mat });
if (resUrlPreview) {
let comment = {
idRel: idRel,
date: createDate,
type: "link",
image:
resUrlPreview.message.image || resUrlPreview.message.favicon,
title: resUrlPreview.message.title,
description: resUrlPreview.message.description,
link: mat
};
var reqModCommentLink = await require(`./../../../modules/timeline/post/comment.js`);
var resModCommentLink = await reqModCommentLink.request(
auth,
comment
);
comment = {};
}
});
}
let dataText = data.text
? data.text.replace(data.text.match(/\bhttps?:\/\/\S+/gi), "")
: "";
if (dataText.length > 3) {
let comment = {
idRel: idRel,
date: createDate,
type: "comment",
text: dataText
};
var reqModCommentLink = await require(`./../../../modules/timeline/post/comment.js`);
var resModCommentLink = await reqModCommentLink.request(auth, comment);
comment = {};
}
var fileKeys = Object.keys(req.files);
var attachments = [];
fileKeys.forEach(key => {
var file = fs.readFileSync(`${req.files[key].path}`, (err, fd) => {
if (err) throw err;
fs.close(fd, err => {
if (err) throw err;
});
});
let blobName = getBlobName(`${req.files[key].name}`),
stream = getStream(file.buffer),
streamLength = file.buffer.byteLength,
extension = req.files[key].name
.substring(req.files[key].name.lastIndexOf(".") + 1)
.toLowerCase();
blobService.createBlockBlobFromStream(
containerName,
blobName,
stream,
streamLength,
(err, result, response) => {
if (err) {
console.log(err);
} else {
var type = "attachment";
let comment = {
idRel: execQuery[0].get(0).identity.low,
date: createDate,
type: "attachment",
text: `${req.files[key].name}`,
value: `https://blobmatrix.blob.core.windows.net/${containerName}/${blobName}`,
link: `https://blobmatrix.blob.core.windows.net/${containerName}/${blobName}`
};
if (
req.files[key].name.indexOf("msg-") === -1 &&
req.files[key].name.indexOf(".txt") === -1
) {
var reqModComment = require(`./../../../modules/timeline/post/comment.js`);
var resModComment = reqModComment.request(auth, comment);
}
comment = {};
if (response.isSuccesful) {
//fs.unlinkSync(req.files[key].path);
}
}
}
);
attachments.push({ name: req.files[key].name, blobName, streamLength });
});
}
}
return { code: 200, message: "ok" };
};
module.exports = { request };