From 982149f759735ecc508236ae23755af8782629d8 Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Wed, 15 Jan 2025 23:11:00 +0100 Subject: [PATCH] Updates --- .../package-shared/functions/api/query/get.js | 9 +- dist/package-shared/types/index.d.ts | 8 +- .../get/(utils)/grab-query-and-values.d.ts | 11 ++ .../get/(utils)/grab-query-and-values.js | 29 ++++ dist/utils/get/index.d.ts | 34 +++++ dist/utils/get/index.js | 132 ++++++++++++++++++ package-shared/functions/api/query/get.ts | 10 +- package-shared/types/index.ts | 6 +- package.json | 2 +- utils/get/(utils)/grab-query-and-values.ts | 35 +++++ utils/{get.ts => get/index.ts} | 62 +++----- 11 files changed, 290 insertions(+), 48 deletions(-) create mode 100644 dist/utils/get/(utils)/grab-query-and-values.d.ts create mode 100644 dist/utils/get/(utils)/grab-query-and-values.js create mode 100644 dist/utils/get/index.d.ts create mode 100644 dist/utils/get/index.js create mode 100644 utils/get/(utils)/grab-query-and-values.ts rename utils/{get.ts => get/index.ts} (68%) diff --git a/dist/package-shared/functions/api/query/get.js b/dist/package-shared/functions/api/query/get.js index 3368808..1402a52 100644 --- a/dist/package-shared/functions/api/query/get.js +++ b/dist/package-shared/functions/api/query/get.js @@ -17,11 +17,16 @@ exports.default = apiGet; const lodash_1 = __importDefault(require("lodash")); const serverError_1 = __importDefault(require("../../backend/serverError")); const runQuery_1 = __importDefault(require("../../backend/db/runQuery")); +const grab_query_and_values_1 = __importDefault(require("../../../../utils/get/(utils)/grab-query-and-values")); /** * # Get Function FOr API */ function apiGet(_a) { return __awaiter(this, arguments, void 0, function* ({ query, dbFullName, queryValues, tableName, dbSchema, useLocal, debug, }) { + const queryAndValues = (0, grab_query_and_values_1.default)({ + query, + values: queryValues, + }); if (typeof query == "string" && query.match(/^alter|^delete|information_schema|databases|^create/i)) { return { success: false, msg: "Wrong Input." }; @@ -30,8 +35,8 @@ function apiGet(_a) { try { let { result, error } = yield (0, runQuery_1.default)({ dbFullName: dbFullName, - query: query, - queryValuesArray: queryValues, + query: queryAndValues.query, + queryValuesArray: queryAndValues.values, readOnly: true, dbSchema, tableName, diff --git a/dist/package-shared/types/index.d.ts b/dist/package-shared/types/index.d.ts index f12fea1..47b6797 100644 --- a/dist/package-shared/types/index.d.ts +++ b/dist/package-shared/types/index.d.ts @@ -917,9 +917,13 @@ export type FetchApiReturn = { }; export declare const ServerQueryOperators: readonly ["AND", "OR"]; export declare const ServerQueryEqualities: readonly ["EQUAL", "LIKE", "NOT EQUAL"]; -export type ServerQueryParam = { +export type ServerQueryParam = { selectFields?: string[]; - query?: ServerQueryQueryObject; + query?: ServerQueryQueryObject; limit?: number; offset?: number; order?: { diff --git a/dist/utils/get/(utils)/grab-query-and-values.d.ts b/dist/utils/get/(utils)/grab-query-and-values.d.ts new file mode 100644 index 0000000..1456fed --- /dev/null +++ b/dist/utils/get/(utils)/grab-query-and-values.d.ts @@ -0,0 +1,11 @@ +import { ApiGetQueryObject } from ".."; +type Param = { + query: string | ApiGetQueryObject; + values?: (string | number)[]; +}; +export default function apiGetGrabQueryAndValues({ query, values }: Param): { + query: string; + values: (string | number)[] | undefined; + valuesString: string | undefined; +}; +export {}; diff --git a/dist/utils/get/(utils)/grab-query-and-values.js b/dist/utils/get/(utils)/grab-query-and-values.js new file mode 100644 index 0000000..49b8c4f --- /dev/null +++ b/dist/utils/get/(utils)/grab-query-and-values.js @@ -0,0 +1,29 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = apiGetGrabQueryAndValues; +const sql_generator_1 = __importDefault(require("../../../package-shared/functions/dsql/sql/sql-generator")); +function apiGetGrabQueryAndValues({ query, values }) { + const queryGenObject = typeof query == "string" + ? undefined + : (0, sql_generator_1.default)({ + tableName: query.table, + genObject: query.query, + dbFullName: query.dbFullName || "__db", + }); + return { + query: typeof query == "string" + ? String(query.replace(/\n|\r|\n\r/g, "").replace(/ {2,}/g, " ")) + : (queryGenObject === null || queryGenObject === void 0 ? void 0 : queryGenObject.string) || "", + values: values || (queryGenObject === null || queryGenObject === void 0 ? void 0 : queryGenObject.values), + valuesString: typeof query == "string" + ? values + ? JSON.stringify(values) + : undefined + : (queryGenObject === null || queryGenObject === void 0 ? void 0 : queryGenObject.values) + ? JSON.stringify(queryGenObject.values) + : undefined, + }; +} diff --git a/dist/utils/get/index.d.ts b/dist/utils/get/index.d.ts new file mode 100644 index 0000000..e007348 --- /dev/null +++ b/dist/utils/get/index.d.ts @@ -0,0 +1,34 @@ +import { GetReturn, ServerQueryParam } from "../../package-shared/types"; +export type ApiGetQueryObject = { + query: ServerQueryParam; + table: string; + dbFullName?: string; +}; +type Param = { + key?: string; + db?: string; + query: string | ApiGetQueryObject; + queryValues?: string[]; + tableName?: string; + useLocal?: boolean; + user_id?: string | number; + debug?: boolean; +}; +export type ApiGetParams = Param; +/** + * # Make a get request to Datasquirel API + */ +export default function get({ key, db, query, queryValues, tableName, useLocal, user_id, debug, }: Param): Promise; +export {}; diff --git a/dist/utils/get/index.js b/dist/utils/get/index.js new file mode 100644 index 0000000..65b526e --- /dev/null +++ b/dist/utils/get/index.js @@ -0,0 +1,132 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = get; +const path_1 = __importDefault(require("path")); +const fs_1 = __importDefault(require("fs")); +const grab_host_names_1 = __importDefault(require("../../package-shared/utils/grab-host-names")); +const get_1 = __importDefault(require("../../package-shared/functions/api/query/get")); +const serialize_query_1 = __importDefault(require("../../package-shared/utils/serialize-query")); +const grab_query_and_values_1 = __importDefault(require("./(utils)/grab-query-and-values")); +/** + * # Make a get request to Datasquirel API + */ +function get(_a) { + return __awaiter(this, arguments, void 0, function* ({ key, db, query, queryValues, tableName, useLocal, user_id, debug, }) { + const grabedHostNames = (0, grab_host_names_1.default)(); + const { host, port, scheme } = grabedHostNames; + /** + * Check for local DB settings + * + * @description Look for local db settings in `.env` file and by pass the http request if available + */ + const { DSQL_DB_HOST, DSQL_DB_USERNAME, DSQL_DB_PASSWORD, DSQL_DB_NAME } = process.env; + if ((DSQL_DB_HOST === null || DSQL_DB_HOST === void 0 ? void 0 : DSQL_DB_HOST.match(/./)) && + (DSQL_DB_USERNAME === null || DSQL_DB_USERNAME === void 0 ? void 0 : DSQL_DB_USERNAME.match(/./)) && + (DSQL_DB_PASSWORD === null || DSQL_DB_PASSWORD === void 0 ? void 0 : DSQL_DB_PASSWORD.match(/./)) && + (DSQL_DB_NAME === null || DSQL_DB_NAME === void 0 ? void 0 : DSQL_DB_NAME.match(/./)) && + useLocal) { + let dbSchema; + try { + const localDbSchemaPath = path_1.default.resolve(process.cwd(), "dsql.schema.json"); + dbSchema = JSON.parse(fs_1.default.readFileSync(localDbSchemaPath, "utf8")); + } + catch (error) { } + if (debug) { + console.log("apiGet:Running Locally ..."); + } + return yield (0, get_1.default)({ + dbFullName: DSQL_DB_NAME, + query, + queryValues, + tableName, + dbSchema, + useLocal, + debug, + }); + } + /** + * Make https request + * + * @description make a request to datasquirel.com + */ + const httpResponse = yield new Promise((resolve, reject) => { + const queryAndValues = (0, grab_query_and_values_1.default)({ + query, + values: queryValues, + }); + const queryObject = { + db: process.env.DSQL_API_DB_NAME || String(db), + query: queryAndValues.query, + queryValues: queryAndValues.valuesString, + tableName, + debug, + }; + if (debug) { + console.log("apiGet:queryObject", queryObject); + } + const queryString = (0, serialize_query_1.default)(Object.assign({}, queryObject)); + if (debug) { + console.log("apiGet:queryString", queryString); + } + let path = `/api/query/${user_id || grabedHostNames.user_id}/get${queryString}`; + if (debug) { + console.log("apiGet:path", path); + } + const requestObject = { + method: "GET", + headers: { + "Content-Type": "application/json", + Authorization: key || + process.env.DSQL_READ_ONLY_API_KEY || + process.env.DSQL_FULL_ACCESS_API_KEY || + process.env.DSQL_API_KEY, + }, + port, + hostname: host, + path, + }; + scheme + .request(requestObject, + /** + * Callback Function + * + * @description https request callback + */ + (response) => { + var str = ""; + response.on("data", function (chunk) { + str += chunk; + }); + response.on("end", function () { + try { + resolve(JSON.parse(str)); + } + catch ( /** @type {any} */error) { + reject({ + error: error.message, + result: str, + }); + } + }); + response.on("error", (err) => { + console.log("DSQL get Error,", err.message); + resolve(null); + }); + }) + .end(); + }); + return httpResponse; + }); +} diff --git a/package-shared/functions/api/query/get.ts b/package-shared/functions/api/query/get.ts index 6ae1b66..fce59b4 100644 --- a/package-shared/functions/api/query/get.ts +++ b/package-shared/functions/api/query/get.ts @@ -8,6 +8,7 @@ import { GetReturn, ServerQueryParam, } from "../../../types"; +import apiGetGrabQueryAndValues from "../../../../utils/get/(utils)/grab-query-and-values"; type Param = { query: @@ -36,6 +37,11 @@ export default async function apiGet({ useLocal, debug, }: Param): Promise { + const queryAndValues = apiGetGrabQueryAndValues({ + query, + values: queryValues, + }); + if ( typeof query == "string" && query.match(/^alter|^delete|information_schema|databases|^create/i) @@ -48,8 +54,8 @@ export default async function apiGet({ try { let { result, error } = await runQuery({ dbFullName: dbFullName, - query: query, - queryValuesArray: queryValues, + query: queryAndValues.query, + queryValuesArray: queryAndValues.values, readOnly: true, dbSchema, tableName, diff --git a/package-shared/types/index.ts b/package-shared/types/index.ts index 95c43fc..665aa76 100644 --- a/package-shared/types/index.ts +++ b/package-shared/types/index.ts @@ -1084,9 +1084,11 @@ export type FetchApiReturn = { export const ServerQueryOperators = ["AND", "OR"] as const; export const ServerQueryEqualities = ["EQUAL", "LIKE", "NOT EQUAL"] as const; -export type ServerQueryParam = { +export type ServerQueryParam< + T extends { [k: string]: any } = { [k: string]: any } +> = { selectFields?: string[]; - query?: ServerQueryQueryObject; + query?: ServerQueryQueryObject; limit?: number; offset?: number; order?: { diff --git a/package.json b/package.json index 50fcf65..e519d09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/datasquirel", - "version": "3.6.8", + "version": "3.7.0", "description": "Cloud-based SQL data management tool", "main": "dist/index.js", "bin": { diff --git a/utils/get/(utils)/grab-query-and-values.ts b/utils/get/(utils)/grab-query-and-values.ts new file mode 100644 index 0000000..7189a4c --- /dev/null +++ b/utils/get/(utils)/grab-query-and-values.ts @@ -0,0 +1,35 @@ +import { ApiGetQueryObject } from ".."; +import sqlGenerator from "../../../package-shared/functions/dsql/sql/sql-generator"; + +type Param = { + query: string | ApiGetQueryObject; + values?: (string | number)[]; +}; +export default function apiGetGrabQueryAndValues({ query, values }: Param) { + const queryGenObject = + typeof query == "string" + ? undefined + : sqlGenerator({ + tableName: query.table, + genObject: query.query, + dbFullName: query.dbFullName || "__db", + }); + + return { + query: + typeof query == "string" + ? String( + query.replace(/\n|\r|\n\r/g, "").replace(/ {2,}/g, " ") + ) + : queryGenObject?.string || "", + values: values || queryGenObject?.values, + valuesString: + typeof query == "string" + ? values + ? JSON.stringify(values) + : undefined + : queryGenObject?.values + ? JSON.stringify(queryGenObject.values) + : undefined, + }; +} diff --git a/utils/get.ts b/utils/get/index.ts similarity index 68% rename from utils/get.ts rename to utils/get/index.ts index f8a0dfa..977a526 100644 --- a/utils/get.ts +++ b/utils/get/index.ts @@ -1,26 +1,29 @@ import https from "node:https"; import path from "path"; import fs from "fs"; -import grabHostNames from "../package-shared/utils/grab-host-names"; -import apiGet from "../package-shared/functions/api/query/get"; -import serializeQuery from "../package-shared/utils/serialize-query"; +import grabHostNames from "../../package-shared/utils/grab-host-names"; +import apiGet from "../../package-shared/functions/api/query/get"; +import serializeQuery from "../../package-shared/utils/serialize-query"; import { + DSQL_DatabaseSchemaType, GetReqQueryObject, GetReturn, ServerQueryParam, -} from "../package-shared/types"; -import sqlGenerator from "../package-shared/functions/dsql/sql/sql-generator"; +} from "../../package-shared/types"; +import apiGetGrabQueryAndValues from "./(utils)/grab-query-and-values"; -export type ApiGetQueryObject = { - query: ServerQueryParam; +export type ApiGetQueryObject< + T extends { [k: string]: any } = { [k: string]: any } +> = { + query: ServerQueryParam; table: string; dbFullName?: string; }; -type Param = { +type Param = { key?: string; db?: string; - query: string | ApiGetQueryObject; + query: string | ApiGetQueryObject; queryValues?: string[]; tableName?: string; useLocal?: boolean; @@ -33,7 +36,9 @@ export type ApiGetParams = Param; /** * # Make a get request to Datasquirel API */ -export default async function get({ +export default async function get< + T extends { [k: string]: any } = { [k: string]: any } +>({ key, db, query, @@ -42,7 +47,7 @@ export default async function get({ useLocal, user_id, debug, -}: Param): Promise { +}: Param): Promise { const grabedHostNames = grabHostNames(); const { host, port, scheme } = grabedHostNames; @@ -61,10 +66,7 @@ export default async function get({ DSQL_DB_NAME?.match(/./) && useLocal ) { - /** @type {import("../package-shared/types").DSQL_DatabaseSchemaType | undefined} */ - let dbSchema: - | import("../package-shared/types").DSQL_DatabaseSchemaType - | undefined; + let dbSchema: DSQL_DatabaseSchemaType | undefined; try { const localDbSchemaPath = path.resolve( @@ -95,33 +97,15 @@ export default async function get({ * @description make a request to datasquirel.com */ const httpResponse = await new Promise((resolve, reject) => { - const queryGenObject = - typeof query == "string" - ? undefined - : sqlGenerator({ - tableName: query.table, - genObject: query.query, - dbFullName: query.dbFullName || "__db", - }); + const queryAndValues = apiGetGrabQueryAndValues({ + query, + values: queryValues, + }); const queryObject: GetReqQueryObject = { db: process.env.DSQL_API_DB_NAME || String(db), - query: - typeof query == "string" - ? String( - query - .replace(/\n|\r|\n\r/g, "") - .replace(/ {2,}/g, " ") - ) - : queryGenObject?.string || "", - queryValues: - typeof query == "string" - ? queryValues - ? JSON.stringify(queryValues) - : undefined - : queryGenObject?.values - ? JSON.stringify(queryGenObject.values) - : undefined, + query: queryAndValues.query, + queryValues: queryAndValues.valuesString, tableName, debug, };