This commit is contained in:
Benjamin Toby
2025-01-13 09:00:21 +01:00
parent 6364f6a312
commit e0a030f10d
859 changed files with 5397 additions and 10163 deletions
@@ -1,16 +1,22 @@
// @ts-check
const { scryptSync, createDecipheriv } = require("crypto");
const { Buffer } = require("buffer");
import { scryptSync, createDecipheriv } from "crypto";
import { Buffer } from "buffer";
type Param = {
encryptedString: string;
encryptionKey?: string;
encryptionSalt?: string;
};
/**
* @param {object} param0
* @param {string} param0.encryptedString
* @param {string} [param0.encryptionKey]
* @param {string} [param0.encryptionSalt]
* @returns
* # Decrypt Function
*/
const decrypt = ({ encryptedString, encryptionKey, encryptionSalt }) => {
export default function decrypt({
encryptedString,
encryptionKey,
encryptionSalt,
}: Param) {
if (!encryptedString?.match(/./)) {
console.log("Encrypted string is invalid");
return encryptedString;
@@ -38,17 +44,15 @@ const decrypt = ({ encryptedString, encryptionKey, encryptionSalt }) => {
let key = scryptSync(finalEncryptionKey, finalEncryptionSalt, finalKeyLen);
let iv = Buffer.alloc(16, 0);
// @ts-ignore
const decipher = createDecipheriv(algorithm, key, iv);
try {
let decrypted = decipher.update(encryptedString, "hex", "utf8");
decrypted += decipher.final("utf8");
return decrypted;
} catch (/** @type {*} */ error) {
} catch (error: any) {
console.log("Error in decrypting =>", error.message);
return encryptedString;
}
};
module.exports = decrypt;
}
@@ -1,17 +1,22 @@
// @ts-check
const { scryptSync, createCipheriv } = require("crypto");
const { Buffer } = require("buffer");
import { scryptSync, createCipheriv } from "crypto";
import { Buffer } from "buffer";
type Param = {
data: string;
encryptionKey?: string;
encryptionSalt?: string;
};
/**
*
* @param {object} param0
* @param {string} param0.data
* @param {string} [param0.encryptionKey]
* @param {string} [param0.encryptionSalt]
* @returns {string | null}
* # Encrypt String
*/
const encrypt = ({ data, encryptionKey, encryptionSalt }) => {
export default function encrypt({
data,
encryptionKey,
encryptionSalt,
}: Param): string | null {
if (!data?.match(/./)) {
console.log("Encryption string is invalid");
return data;
@@ -46,10 +51,8 @@ const encrypt = ({ data, encryptionKey, encryptionSalt }) => {
let encrypted = cipher.update(data, "utf8", "hex");
encrypted += cipher.final("hex");
return encrypted;
} catch (/** @type {*} */ error) {
} catch (/** @type {*} */ error: any) {
console.log("Error in encrypting =>", error.message);
return data;
}
};
module.exports = encrypt;
}
@@ -1,15 +1,17 @@
// @ts-check
import { createHmac } from "crypto";
const { createHmac } = require("crypto");
type Param = {
password: string;
encryptionKey?: string;
};
/**
* # Hash password Function
* @param {object} param0
* @param {string} param0.password - Password to hash
* @param {string} [param0.encryptionKey] - Encryption key
* @returns {string}
*/
module.exports = function hashPassword({ password, encryptionKey }) {
export default function hashPassword({
password,
encryptionKey,
}: Param): string {
const finalEncryptionKey =
encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD;
@@ -21,4 +23,4 @@ module.exports = function hashPassword({ password, encryptionKey }) {
hmac.update(password);
let hashed = hmac.digest("base64");
return hashed;
};
}
@@ -1,41 +0,0 @@
// @ts-check
/**
* @typedef {object} SQLDeleteGenReturn
* @property {string} query
* @property {string[]} values
*/
/**
* @param {object} param0
* @param {any} param0.data
* @param {string} param0.tableName
*
* @return {SQLDeleteGenReturn | undefined}
*/
function sqlDeleteGenerator({ tableName, data }) {
try {
let queryStr = `DELETE FROM ${tableName}`;
/** @type {string[]} */
let deleteBatch = [];
/** @type {string[]} */
let queryArr = [];
Object.keys(data).forEach((ky) => {
deleteBatch.push(`${ky}=?`);
queryArr.push(data[ky]);
});
queryStr += ` WHERE ${deleteBatch.join(" AND ")}`;
return {
query: queryStr,
values: queryArr,
};
} catch (/** @type {any} */ error) {
console.log(`SQL delete gen ERROR: ${error.message}`);
return undefined;
}
}
module.exports = sqlDeleteGenerator;
@@ -0,0 +1,36 @@
interface SQLDeleteGenReturn {
query: string;
values: string[];
}
/**
* # SQL Delete Generator
*/
export default function sqlDeleteGenerator({
tableName,
data,
}: {
data: any;
tableName: string;
}): SQLDeleteGenReturn | undefined {
try {
let queryStr = `DELETE FROM ${tableName}`;
let deleteBatch: string[] = [];
let queryArr: string[] = [];
Object.keys(data).forEach((ky) => {
deleteBatch.push(`${ky}=?`);
queryArr.push(data[ky]);
});
queryStr += ` WHERE ${deleteBatch.join(" AND ")}`;
return {
query: queryStr,
values: queryArr,
};
} catch (/** @type {any} */ error: any) {
console.log(`SQL delete gen ERROR: ${error.message}`);
return undefined;
}
}
@@ -1,28 +1,51 @@
// @ts-check
import {
ServerQueryParam,
ServerQueryParamsJoin,
ServerQueryQueryObject,
} from "../../../types";
type Param = {
genObject?: ServerQueryParam;
tableName: string;
};
type Return =
| {
string: string;
values: string[];
}
| undefined;
/**
* # SQL Query Generator
* @description Generates an SQL Query for node module `mysql` or `serverless-mysql`
* @type {import("../../../types").SqlGeneratorFn}
*/
function sqlGenerator({ tableName, genObject }) {
export default function sqlGenerator({ tableName, genObject }: Param): Return {
if (!genObject) return undefined;
const finalQuery = genObject.query ? genObject.query : undefined;
const queryKeys = finalQuery ? Object.keys(finalQuery) : undefined;
/** @type {string[]} */
const sqlSearhValues = [];
const sqlSearhString = queryKeys?.map((field) => {
const queryObj = finalQuery?.[field];
if (!queryObj) return;
const sqlSearhValues: string[] = [];
/**
* # Generate Query
*/
function genSqlSrchStr({
queryObj,
join,
field,
}: {
queryObj: ServerQueryQueryObject[string];
join?: ServerQueryParamsJoin[];
field?: string;
}) {
const finalFieldName = (() => {
if (queryObj?.tableName) {
return `${queryObj.tableName}.${field}`;
}
if (genObject.join) {
if (join) {
return `${tableName}.${field}`;
}
return field;
@@ -35,20 +58,27 @@ function sqlGenerator({ tableName, genObject }) {
typeof queryObj.value == "number"
) {
const valueParsed = String(queryObj.value);
if (queryObj.equality == "LIKE") {
str = `LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`;
} else if (queryObj.equality == "NOT EQUAL") {
str = `${finalFieldName} != ?`;
sqlSearhValues.push(valueParsed);
} else {
sqlSearhValues.push(valueParsed);
}
} else if (Array.isArray(queryObj.value)) {
/** @type {string[]} */
const strArray = [];
const strArray: string[] = [];
queryObj.value.forEach((val) => {
const valueParsed = val;
if (queryObj.equality == "LIKE") {
strArray.push(
`LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`
);
} else if (queryObj.equality == "NOT EQUAL") {
strArray.push(`${finalFieldName} != ?`);
sqlSearhValues.push(valueParsed);
} else {
strArray.push(`${finalFieldName} = ?`);
sqlSearhValues.push(valueParsed);
@@ -59,11 +89,44 @@ function sqlGenerator({ tableName, genObject }) {
}
return str;
}
const sqlSearhString = queryKeys?.map((field) => {
const queryObj =
/** @type {import("../../../types").ServerQueryQueryObject} */ finalQuery?.[
field
];
if (!queryObj) return;
if (queryObj.__query) {
const subQueryGroup =
/** @type {import("../../../types").ServerQueryQueryObject}} */ queryObj.__query;
const subSearchKeys = Object.keys(subQueryGroup);
const subSearchString = subSearchKeys.map((_field) => {
const newSubQueryObj = subQueryGroup?.[_field];
return genSqlSrchStr({
queryObj: newSubQueryObj,
field: _field,
join: genObject.join,
});
});
console.log("queryObj.operator", queryObj.operator);
return (
"(" +
subSearchString.join(` ${queryObj.operator || "AND"} `) +
")"
);
}
return genSqlSrchStr({ queryObj, field, join: genObject.join });
});
function generateJoinStr(
/** @type {import("../../../types").ServerQueryParamsJoinMatchObject} */ mtch,
/** @type {import("../../../types").ServerQueryParamsJoin} */ join
/** @type {import("../../../types").ServerQueryParamsJoinMatchObject} */ mtch: import("../../../types").ServerQueryParamsJoinMatchObject,
/** @type {import("../../../types").ServerQueryParamsJoin} */ join: import("../../../types").ServerQueryParamsJoin
) {
return `${
typeof mtch.source == "object" ? mtch.source.tableName : tableName
@@ -74,6 +137,18 @@ function sqlGenerator({ tableName, genObject }) {
return `'${mtch.targetLiteral}'`;
}
if (join.alias) {
return `${
typeof mtch.target == "object"
? mtch.target.tableName
: join.alias
}.${
typeof mtch.target == "object"
? mtch.target.fieldName
: mtch.target
}`;
}
return `${
typeof mtch.target == "object"
? mtch.target.tableName
@@ -106,31 +181,37 @@ function sqlGenerator({ tableName, genObject }) {
if (genObject.join) {
/** @type {string[]} */
const existingJoinTableNames = [tableName];
const existingJoinTableNames: string[] = [tableName];
str +=
"," +
genObject.join
.map((joinObj) => {
if (existingJoinTableNames.includes(joinObj.tableName))
const joinTableName = joinObj.alias
? joinObj.alias
: joinObj.tableName;
if (existingJoinTableNames.includes(joinTableName))
return null;
existingJoinTableNames.push(joinObj.tableName);
existingJoinTableNames.push(joinTableName);
if (joinObj.selectFields) {
return joinObj.selectFields
.map((slFld) => {
if (typeof slFld == "string") {
return `${joinObj.tableName}.${slFld}`;
} else if (typeof slFld == "object") {
let aliasSlctFld = `${joinObj.tableName}.${slFld.field}`;
if (slFld.alias)
aliasSlctFld += ` as ${slFld.alias}`;
return aliasSlctFld;
.map((selectField) => {
if (typeof selectField == "string") {
return `${joinTableName}.${selectField}`;
} else if (typeof selectField == "object") {
let aliasSelectField = selectField.count
? `COUNT(${joinTableName}.${selectField.field})`
: `${joinTableName}.${selectField.field}`;
if (selectField.alias)
aliasSelectField += ` AS ${selectField.alias}`;
return aliasSelectField;
}
})
.join(",");
} else {
return `${joinObj.tableName}.*`;
return `${joinTableName}.*`;
}
})
.filter((_) => Boolean(_))
@@ -147,7 +228,9 @@ function sqlGenerator({ tableName, genObject }) {
return (
join.joinType +
" " +
join.tableName +
(join.alias
? join.tableName + " " + join.alias
: join.tableName) +
" ON " +
(() => {
if (Array.isArray(join.match)) {
@@ -157,7 +240,11 @@ function sqlGenerator({ tableName, genObject }) {
.map((mtch) =>
generateJoinStr(mtch, join)
)
.join(" AND ") +
.join(
join.operator
? ` ${join.operator} `
: " AND "
) +
")"
);
} else if (typeof join.match == "object") {
@@ -172,7 +259,7 @@ function sqlGenerator({ tableName, genObject }) {
return str;
})();
if (sqlSearhString) {
if (sqlSearhString?.[0] && sqlSearhString.find((str) => str)) {
const stringOperator = genObject?.searchOperator || "AND";
queryString += ` WHERE ${sqlSearhString.join(` ${stringOperator} `)} `;
}
@@ -183,12 +270,12 @@ function sqlGenerator({ tableName, genObject }) {
? `${tableName}.${genObject.order.field}`
: genObject.order.field
} ${genObject.order.strategy}`;
if (genObject.limit) queryString += ` LIMIT ${genObject.limit}`;
if (genObject.offset) queryString += ` OFFSET ${genObject.offset}`;
return {
string: queryString,
values: sqlSearhValues,
};
}
module.exports = sqlGenerator;
@@ -1,23 +1,24 @@
// @ts-check
/**
* @typedef {object} SQLInsertGenReturn
* @property {string} query
* @property {string[]} values
*/
interface SQLInsertGenReturn {
query: string;
values: string[];
}
/**
* @param {object} param0
* @param {any[]} param0.data
* @param {string} param0.tableName
*
* @return {SQLInsertGenReturn | undefined}
* # SQL Insert Generator
*/
function sqlInsertGenerator({ tableName, data }) {
export default function sqlInsertGenerator({
tableName,
data,
}: {
data: any[];
tableName: string;
}): SQLInsertGenReturn | undefined {
try {
if (Array.isArray(data) && data?.[0]) {
/** @type {string[]} */
let insertKeys = [];
let insertKeys: string[] = [];
data.forEach((dt) => {
const kys = Object.keys(dt);
@@ -29,9 +30,9 @@ function sqlInsertGenerator({ tableName, data }) {
});
/** @type {string[]} */
let queryBatches = [];
let queryBatches: string[] = [];
/** @type {string[]} */
let queryValues = [];
let queryValues: string[] = [];
data.forEach((item) => {
queryBatches.push(
@@ -58,10 +59,8 @@ function sqlInsertGenerator({ tableName, data }) {
} else {
return undefined;
}
} catch (/** @type {any} */ error) {
} catch (/** @type {any} */ error: any) {
console.log(`SQL insert gen ERROR: ${error.message}`);
return undefined;
}
}
module.exports = sqlInsertGenerator;