MOON
Server: Apache
System: Linux vps.erhabenn.com.br 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64
User: machen (1008)
PHP: 8.2.31
Disabled: NONE
Upload Files
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 };