import { Request, Response } from "express"; import DynamicQueryBuilder from "../../helpers/dynamicQueryBuilder"; import { dataSource } from "../../data-source"; /** * @description get all table metas * @param req {Request} Express req object * @param res {Response} Express res object * @returns {Promise<*>} */ export async function getAllTableMeta(req: Request, res: Response): Promise { let tableMetas = DynamicQueryBuilder.getAllTableMeta(); res.json(tableMetas); } /** * @description get meta by tablename * @param req {Request} Express req object * @param res {Response} Express res object * @returns {Promise<*>} */ export async function getTableMetaByTablename(req: Request, res: Response): Promise { const tablename = req.params.tablename; let tableMeta = DynamicQueryBuilder.getTableMeta(tablename); res.json(tableMeta); } /** * @description execute Query * @param req {Request} Express req object * @param res {Response} Express res object * @returns {Promise<*>} */ export async function executeQuery(req: Request, res: Response): Promise { let offset = parseInt((req.query.offset as string) ?? "0"); let count = parseInt((req.query.count as string) ?? "25"); const query = req.body.query; if (typeof query == "string") { const upperQuery = query.trim().toUpperCase(); if (!upperQuery.startsWith("SELECT") || /INSERT|UPDATE|DELETE|ALTER|DROP|CREATE|TRUNCATE/.test(upperQuery)) { return res.json({ stats: "error", sql: query, code: "UNALLOWED", msg: "Not allowed to change rows", }); } try { let data: Array = []; const result = await dataSource .transaction(async (manager) => { data = await manager.query(query); throw new Error("AllwaysRollbackQuery"); }) .catch((error) => { if (error.message === "AllwaysRollbackQuery") { return { stats: "success", rows: data, total: data.length, offset: offset, count: count, }; } else { return { stats: "error", sql: error.sql, code: error.code, msg: error.sqlMessage, }; } }); res.send(result); } catch (error) { res.json({ stats: "error", sql: error.sql, code: error.code, msg: error.sqlMessage, }); } } else { try { let [rows, total] = await DynamicQueryBuilder.buildQuery(query, offset, count).getManyAndCount(); res.json({ stats: "success", rows: DynamicQueryBuilder.flattenQueryResult(rows), total: total, offset: offset, count: count, }); } catch (error) { res.json({ stats: "error", sql: error.sql, code: error.code, msg: error.sqlMessage, }); } } }