This commit is contained in:
Tben
2023-07-07 14:58:14 +01:00
parent 84e6d59a4a
commit dbd66baac3
12 changed files with 1201 additions and 19 deletions
+12
View File
@@ -0,0 +1,12 @@
/**
* Regular expression to match default fields
*
* @description Regular expression to match default fields
*/
const defaultFieldsRegexp = /^id$|^date_created$|^date_created_code$|^date_created_timestamp$|^date_updated$|^date_updated_code$|^date_updated_timestamp$/;
/** ********************************************** */
/** ********************************************** */
/** ********************************************** */
module.exports = defaultFieldsRegexp;
+92
View File
@@ -0,0 +1,92 @@
const fs = require("fs");
const parseDbResults = require("./parseDbResults");
/**
* DB handler for specific database
* ==============================================================================
* @async
* @param {object} params - Single object params
* @param {string} params.queryString - SQL string
* @param {string[]?} params.queryValuesArray - Values Array
* @param {string} params.database - Database name
* @param {DSQL_TableSchemaType?} params.tableSchema - Table schema
* @param {string} params.dbHost - Database host
* @param {string} params.dbUsername - Database username
* @param {string} params.dbPassword - Database password
* @param {string?} params.encryptionKey - Encryption key
* @param {string?} params.encryptionSalt - Encryption salt
*
* @returns {Promise<object[]|null>}
*/
module.exports = async function handler({ queryString, queryValuesArray, database, tableSchema, dbHost, dbUsername, dbPassword, encryptionKey, encryptionSalt }) {
const mysql = require("serverless-mysql")({
config: {
host: dbHost,
user: dbUsername,
password: dbPassword,
database: database.toString().replace(/[^a-z0-9\_\-]/g, ""),
charset: "utf8mb4",
},
});
/**
* Declare variables
*
* @description Declare "results" variable
*/
let results;
/**
* Check if query values array is an array
*/
if (!queryString || !queryValuesArray || !Array.isArray(queryValuesArray) || !queryValuesArray[0]) {
return null;
}
/**
* Fetch from db
*
* @description Fetch data from db if no cache
*/
try {
/**
* Run Query
*/
results = await mysql.query(queryString, queryValuesArray);
/**
* Clean up
*/
await mysql.end();
} catch (error) {
/**
* Handle error and clean up
*/
console.log("\x1b[31mDSQL Database Handler ERROR\x1b[0m =>", database, error.message);
/**
* Clean up
*/
await mysql.end();
}
/**
* Return results
*
* @description Return results add to cache if "req" param is passed
*/
if (results && tableSchema) {
try {
const unparsedResults = JSON.parse(JSON.stringify(results));
const parsedResults = await parseDbResults({ unparsedResults: unparsedResults, tableSchema: tableSchema, encryptionKey, encryptionSalt });
return parsedResults;
} catch (error) {
console.log("\x1b[31mDSQL Database Handler ERROR\x1b[0m =>", database, error.message);
return null;
}
} else if (results) {
return JSON.parse(JSON.stringify(results));
} else {
console.log("\x1b[31mDSQL Database Handler No results returned\x1b[0m =>", results);
return null;
}
};
+70
View File
@@ -0,0 +1,70 @@
const decrypt = require("../../functions/decrypt");
const defaultFieldsRegexp = require("./defaultFieldsRegexp");
/**
* Parse Database results
* ==============================================================================
* @description this function takes a database results array gotten from a DB handler
* function, decrypts encrypted fields, and returns an updated array with no encrypted
* fields
*
* @param {object} params - Single object params
* @param {{}[]} params.unparsedResults - Array of data objects containing Fields(keys)
* and corresponding values of the fields(values)
* @param {DSQL_TableSchemaType} params.tableSchema - Table schema
* @returns {Promise<object[]|null>}
*/
module.exports = async function parseDbResults({ unparsedResults, tableSchema, encryptionKey, encryptionSalt }) {
/**
* Declare variables
*
* @description Declare "results" variable
*/
let parsedResults = [];
try {
/**
* Declare variables
*
* @description Declare "results" variable
*/
for (let pr = 0; pr < unparsedResults.length; pr++) {
let result = unparsedResults[pr];
let resultFieldNames = Object.keys(result);
for (let i = 0; i < resultFieldNames.length; i++) {
const resultFieldName = resultFieldNames[i];
let resultFieldSchema = tableSchema.fields[i];
if (resultFieldName?.match(defaultFieldsRegexp)) {
continue;
}
let value = result[resultFieldName];
if (typeof value !== "number" && !value) {
continue;
}
if (resultFieldSchema?.encrypted) {
if (value?.match(/./)) {
result[resultFieldName] = decrypt({ encryptedString: value, encryptionKey, encryptionSalt });
}
}
}
parsedResults.push(result);
}
/**
* Declare variables
*
* @description Declare "results" variable
*/
return parsedResults;
} catch (error) {
console.log("ERROR in parseDbResults Function =>", error.message);
return unparsedResults;
}
};
+9
View File
@@ -0,0 +1,9 @@
const sanitizeHtmlOptions = {
allowedTags: ["b", "i", "em", "strong", "a", "p", "span", "ul", "ol", "li", "h1", "h2", "h3", "h4", "h5", "h6", "img"],
allowedAttributes: {
a: ["href"],
img: ["src", "alt", "width", "height", "class", "style"],
},
};
module.exports = sanitizeHtmlOptions;