This commit is contained in:
Benjamin Toby
2025-01-28 19:43:16 +01:00
parent 81cf010cb5
commit 35fec57590
856 changed files with 5362 additions and 2266 deletions
@@ -1,4 +1,3 @@
import mysql from "serverless-mysql";
import grabDSQLConnection from "../../grab-dsql-connection";
/**
@@ -6,8 +6,6 @@ import grabDSQLConnection from "../../grab-dsql-connection";
export default async function LOCAL_DB_HANDLER(...args: any[]) {
const MASTER = grabDSQLConnection();
console.log("Querying ...");
try {
const results = await MASTER.query(...args);
@@ -0,0 +1,14 @@
type Param = {
dbContext?: "Master" | "Dsql User";
dbFullName?: string;
};
export default function checkIfIsMaster({ dbContext, dbFullName }: Param) {
return dbContext?.match(/dsql.user/i)
? false
: global.DSQL_USE_LOCAL
? true
: dbFullName && !dbFullName.match(/^datasquirel$/)
? false
: true;
}
@@ -0,0 +1,74 @@
import get from "../../actions/get";
import post from "../../actions/post";
import sqlGenerator from "../../functions/dsql/sql/sql-generator";
import { DsqlCrudParam, PostReturn } from "../../types";
export default async function dsqlCrud<
T extends { [key: string]: any } = { [key: string]: any }
>({
action,
data,
table,
targetId,
query,
sanitize,
}: DsqlCrudParam<T>): Promise<
| (PostReturn & {
queryObject?: ReturnType<Awaited<typeof sqlGenerator>>;
})
| null
> {
const finalData = sanitize ? sanitize(data) : data;
const finalId = targetId;
let queryObject: ReturnType<Awaited<typeof sqlGenerator>> | undefined;
switch (action) {
case "get":
queryObject = sqlGenerator({
tableName: table,
genObject: query,
});
const GET_RES = await get({
query: queryObject?.string || "",
queryValues: queryObject?.values || [],
});
return { ...GET_RES, queryObject };
case "insert":
return await post({
query: {
action: "insert",
table,
data: finalData,
},
});
case "update":
delete data?.id;
return await post({
query: {
action: "update",
table,
identifierColumnName: "id",
identifierValue: String(finalId),
data: finalData,
},
});
case "delete":
return await post({
query: {
action: "delete",
table,
identifierColumnName: "id",
identifierValue: String(finalId),
},
});
default:
return null;
}
}
@@ -0,0 +1,182 @@
import sqlGenerator from "../../functions/dsql/sql/sql-generator";
import {
DsqlCrudQueryObject,
DsqlMethodCrudParam,
ServerQueryParam,
} from "../../types";
import deserializeQuery from "../deserialize-query";
import EJSON from "../ejson";
import numberfy from "../numberfy";
import dsqlCrud from "./crud";
export type APIDataCrudQuery = ServerQueryParam & {
page?: number;
};
export type CRUDResponseObject<P extends any = any> = {
success: boolean;
payload?: P;
msg?: string;
error?: string;
queryObject?: ReturnType<Awaited<typeof sqlGenerator>>;
};
export default async function dsqlMethodCrud<
T extends { [key: string]: any } = { [key: string]: any },
P extends { [key: string]: any } = { [key: string]: any }
>({
method,
tableName,
addUser,
user,
extraData,
transform,
existingData,
body,
query,
targetId,
sanitize,
}: DsqlMethodCrudParam<T>): Promise<CRUDResponseObject<P>> {
let result: CRUDResponseObject = {
success: false,
};
try {
let finalBody = body;
let finalQuery = deserializeQuery(query as any) as
| DsqlCrudQueryObject<T>
| undefined;
let LIMIT = 10;
let PAGE = 1;
let OFFSET = (PAGE - 1) * LIMIT;
if (finalQuery) {
Object.keys(finalQuery).forEach((key) => {
const value = finalQuery[key];
if (typeof value == "string" && value.match(/^\{|^\[/)) {
finalQuery[key] = EJSON.stringify(value);
}
if (value == "true") {
finalQuery[key] = true;
}
if (value == "false") {
finalQuery[key] = false;
}
});
if (finalQuery.limit) LIMIT = numberfy(finalQuery.limit);
if (finalQuery.page) PAGE = numberfy(finalQuery.page);
OFFSET = (PAGE - 1) * LIMIT;
}
let finalData = finalBody
? ({
...finalBody,
...extraData,
} as T)
: undefined;
if (finalData && user?.id && addUser) {
finalData = {
...finalData,
[addUser.field]: String(user.id),
};
}
if (transform && finalData) {
finalData = await transform({
data: finalData,
existingData: existingData,
user,
reqMethod: method,
});
}
switch (method) {
case "GET":
const GET_RESULT = await dsqlCrud({
action: "get",
table: tableName,
query: finalQuery
? ({
...finalQuery,
query: {
...finalQuery.query,
...(user?.id && addUser
? {
[addUser.field]: {
value: String(user.id),
},
}
: undefined),
},
limit: LIMIT,
offset: OFFSET,
} as any)
: undefined,
sanitize,
});
result = {
success: Boolean(GET_RESULT?.success),
payload: GET_RESULT?.payload,
msg: GET_RESULT?.msg,
error: GET_RESULT?.error,
queryObject: GET_RESULT?.queryObject,
};
break;
case "POST":
const POST_RESULT = await dsqlCrud({
action: "insert",
table: tableName,
data: finalData,
sanitize,
});
result = {
success: Boolean(POST_RESULT?.success),
payload: POST_RESULT?.payload,
msg: POST_RESULT?.msg,
error: POST_RESULT?.error,
};
break;
case "PUT":
const PUT_RESULT = await dsqlCrud({
action: "update",
table: tableName,
data: finalData,
targetId,
sanitize,
});
result = {
success: Boolean(PUT_RESULT?.success),
payload: PUT_RESULT?.payload,
msg: PUT_RESULT?.msg,
error: PUT_RESULT?.error,
};
break;
case "DELETE":
const DELETE_RESULT = await dsqlCrud({
action: "delete",
table: tableName,
targetId,
sanitize,
});
result = {
success: Boolean(DELETE_RESULT?.success),
payload: DELETE_RESULT?.payload,
msg: DELETE_RESULT?.msg,
error: DELETE_RESULT?.error,
};
break;
default:
break;
}
return result;
} catch (error) {
return result;
}
}
@@ -16,17 +16,20 @@ export default async function connDbHandler<ReturnType = any>(
/**
* ServerlessMySQL Connection Object
*/
conn: ServerlessMysql,
conn?: ServerlessMysql,
/**
* String Or `QueryObject` Array
*/
query: QueryObject["query"] | QueryObject[],
query?: QueryObject["query"] | QueryObject[],
/**
* Array of Values to Sanitize and Inject
*/
values?: QueryObject["values"]
): Promise<Return<ReturnType>> {
try {
if (!conn) throw new Error("No Connection Found!");
if (!query) throw new Error("Query String Required!");
if (typeof query == "string") {
const res = await conn.query(trimQuery(query), values);
return JSON.parse(JSON.stringify(res));
@@ -41,7 +44,8 @@ export default async function connDbHandler<ReturnType = any>(
queryObj.values
);
resArray.push(JSON.parse(JSON.stringify(queryObjRes)));
} catch (error) {
} catch (error: any) {
console.log(`connDbHandler Query Error: ${error.message}`);
resArray.push(null);
}
}
@@ -50,10 +54,11 @@ export default async function connDbHandler<ReturnType = any>(
} else {
return null;
}
} catch (error) {
} catch (error: any) {
console.log(`connDbHandler Error: ${error.message}`);
return null;
} finally {
conn.end();
conn?.end();
}
}
@@ -8,7 +8,6 @@ export default function deserializeQuery(
): {
[s: string]: any;
} {
/** @type {Object<string,any>} */
let queryObject: { [s: string]: any } =
typeof query == "object" ? query : Object(EJSON.parse(query));
@@ -23,9 +23,29 @@ type Param = {
* # Grab General CONNECTION for DSQL
*/
export default function grabDSQLConnection(param?: Param): ServerlessMysql {
if (global.DSQL_USE_LOCAL || param?.local) {
return (
global.DSQL_DB_CONN ||
mysql({
config: {
host: process.env.DSQL_DB_HOST,
user: process.env.DSQL_DB_USERNAME,
password: process.env.DSQL_DB_PASSWORD,
database: param?.noDb
? undefined
: process.env.DSQL_DB_NAME,
port: process.env.DSQL_DB_PORT
? Number(process.env.DSQL_DB_PORT)
: undefined,
charset: "utf8mb4",
},
})
);
}
if (param?.ro) {
return (
DSQL_READ_ONLY_DB_CONN ||
global.DSQL_READ_ONLY_DB_CONN ||
mysql({
config: {
host: process.env.DSQL_DB_HOST,
@@ -0,0 +1,37 @@
import sqlGenerator from "../functions/dsql/sql/sql-generator";
import { ApiGetQueryObject } from "../types";
type Param<T extends { [key: string]: any } = { [key: string]: any }> = {
query: string | ApiGetQueryObject<T>;
values?: (string | number)[];
};
export default function apiGetGrabQueryAndValues<
T extends { [key: string]: any } = { [key: string]: any }
>({ query, values }: Param<T>) {
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,
};
}