126 lines
3.2 KiB
TypeScript
126 lines
3.2 KiB
TypeScript
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;
|