const path = require("path"); require("dotenv").config({ path: path.resolve( process.cwd(), `.env.${process.env.NODE_ENV || "development"}` ), }); 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, 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); } emailer.sendTaskEmail({ to, subject, text, attachments: [{ filename: "query.csv", content: csv }], }); res.status(200).send(csv); }, { emptyFieldValue: "" } ); } catch (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; } }