diff --git a/server/tasks/tasks.js b/server/tasks/tasks.js index 9eca856d3..827bd9795 100644 --- a/server/tasks/tasks.js +++ b/server/tasks/tasks.js @@ -9,30 +9,84 @@ const axios = require("axios"); const client = require("../graphql-client/graphql-client").client; const emailer = require("../email/sendemail"); const logger = require("../utils/logger"); - +const moment = require("moment-timezone"); exports.taskHandler = async (req, res) => { try { - const { bodyshopid, query, variables, text, to, subject } = req.body; + const { bodyshopid, query, variables, text, to, subject, timezone } = + req.body; //Run the query + + //Check the variables to see if they are an object. + Object.keys(variables).forEach((key) => { + if (typeof variables[key] === "object") { + if (variables[key].function) { + variables[key] = functionMapper(variables[key].function, timezone); + } + } + }); + const response = await client.request(query, variables); //Massage the data //Send the email const rootElement = response[Object.keys(response)[0]]; //This element shoudl always be an array. let converter = require("json-2-csv"); - converter.json2csv(rootElement, (err, csv) => { - if (err) { - res.status(500).json(err); - } + converter.json2csv( + rootElement, + (err, csv) => { + if (err) { + res.status(500).json(err); + } - emailer.sendTaskEmail({ - to, - subject, - text, - attachments: [{ filename: "query.csv", content: csv }], - }); - res.status(200).send(csv); - }); + emailer.sendTaskEmail({ + to, + subject, + text, + attachments: [{ filename: "query.csv", content: csv }], + }); + res.status(200).send(csv); + }, + { emptyFieldValue: "" } + ); } catch (error) { - res.status(500).json({ error }); + res.status(500).json({ error: error.message, stack: error.stackTrace }); } }; + +const isoformat = "YYYY-MM-DD"; +function functionMapper(f, timezone) { + switch (f) { + case "date.today": + return moment().tz(timezone).format(isoformat); + case "date.now": + return moment().tz(timezone); + case "date.yesterday": + return moment().tz(timezone).subtract(1, "day").format(isoformat); + case "date.3daysago": + return moment().tz(timezone).subtract(3, "days").format(isoformat); + case "date.7daysago": + return moment().tz(timezone).subtract(7, "days").format(isoformat); + case "date.tomorrow": + return moment().tz(timezone).add(1, "day").format(isoformat); + case "date.3daysfromnow": + return moment().tz(timezone).add(3, "days").format(isoformat); + case "date.7daysfromnow": + return moment().tz(timezone).add(7, "days").format(isoformat); + case "date.yesterdaytz": + return moment().tz(timezone).subtract(1, "day"); + case "date.3daysagotz": + return moment().tz(timezone).subtract(3, "days"); + case "date.7daysagotz": + return moment().tz(timezone).subtract(7, "days"); + case "date.tomorrowtz": + return moment().tz(timezone).add(1, "day"); + case "date.3daysfromnowtz": + return moment().tz(timezone).add(3, "days"); + case "date.7daysfromnowtz": + return moment().tz(timezone).add(7, "days"); + + case "date.now": + return moment().tz(timezone); + default: + return f; + } +}