import fs from "node:fs"; import { Router } from "express"; import multer from "multer"; import z from "zod"; import { db } from "../db/db.controller.js"; import { datamart, type NewDatamart } from "../db/schema/datamart.schema.js"; import { apiReturn } from "../utils/returnHelper.utils.js"; import { tryCatch } from "../utils/trycatch.utils.js"; const r = Router(); const upload = multer({ dest: "uploads/" }); const newQuery = z.object({ name: z.string().min(5), description: z.string().min(30), query: z.string().min(10).optional(), options: z .string() .describe("This should be a set of keys separated by a comma") .optional(), }); r.post("/", upload.single("queryFile"), async (req, res) => { try { const v = newQuery.parse(req.body); const query: NewDatamart = { ...v, name: v.name?.trim().replaceAll(" ", "_"), }; //console.log(query); if (req.file) { const sqlContents = fs.readFileSync(req.file.path, "utf8"); query.query = sqlContents; // optional: delete temp file afterwards fs.unlink(req.file.path, () => {}); } // if we forget the file crash out if (!query.query) { // no query text anywhere return apiReturn(res, { success: true, level: "info", //connect.success ? "info" : "error", module: "routes", subModule: "datamart", message: `${query.name} missing sql file to parse`, data: [], status: 400, //connect.success ? 200 : 400, }); } // // if we didn't replace the test1 stuff crash out // if (!query.query.includes("test1")) { // return apiReturn(res, { // success: true, // level: "info", //connect.success ? "info" : "error", // module: "routes", // subModule: "datamart", // message: // "Query must include the 'test1' or everything switched to test1", // data: [], // status: 400, //connect.success ? 200 : 400, // }); // } const { data, error } = await tryCatch(db.insert(datamart).values(query)); if (error) { return apiReturn(res, { success: true, level: "error", //connect.success ? "info" : "error", module: "routes", subModule: "datamart", message: `${query.name} encountered an error while being added`, data: [error.cause], status: 200, //connect.success ? 200 : 400, }); } if (data) { return apiReturn(res, { success: true, level: "info", //connect.success ? "info" : "error", module: "routes", subModule: "datamart", message: `${query.name} was just added`, data: [query], status: 200, //connect.success ? 200 : 400, }); } } catch (err) { if (err instanceof z.ZodError) { const flattened = z.flattenError(err); // return res.status(400).json({ // error: "Validation failed", // details: flattened, // }); return apiReturn(res, { success: false, level: "error", //connect.success ? "info" : "error", module: "routes", subModule: "auth", message: "Validation failed", data: [flattened], status: 400, //connect.success ? 200 : 400, }); } return apiReturn(res, { success: false, level: "error", module: "routes", subModule: "datamart", message: "There was an error creating the new query", data: [err], status: 200, }); } }); export default r;