187 lines
5.5 KiB
TypeScript
187 lines
5.5 KiB
TypeScript
import sanitizeHtml from "sanitize-html";
|
|
import sanitizeHtmlOptions from "../html/sanitizeHtmlOptions";
|
|
import DB_HANDLER from "../../../utils/backend/global-db/DB_HANDLER";
|
|
import DSQL_USER_DB_HANDLER from "../../../utils/backend/global-db/DSQL_USER_DB_HANDLER";
|
|
import encrypt from "../../dsql/encrypt";
|
|
import LOCAL_DB_HANDLER from "../../../utils/backend/global-db/LOCAL_DB_HANDLER";
|
|
|
|
type Param = {
|
|
dbContext?: "Master" | "Dsql User";
|
|
paradigm?: "Read Only" | "Full Access";
|
|
dbFullName?: string;
|
|
tableName: string;
|
|
encryptionKey?: string;
|
|
encryptionSalt?: string;
|
|
data: any;
|
|
tableSchema?: import("../../../types").DSQL_TableSchemaType;
|
|
identifierColumnName: string;
|
|
identifierValue: string | number;
|
|
useLocal?: boolean;
|
|
};
|
|
|
|
/**
|
|
* # Update DB Function
|
|
* @description
|
|
*/
|
|
export default async function updateDbEntry({
|
|
dbContext,
|
|
paradigm,
|
|
dbFullName,
|
|
tableName,
|
|
data,
|
|
tableSchema,
|
|
identifierColumnName,
|
|
identifierValue,
|
|
encryptionKey,
|
|
encryptionSalt,
|
|
useLocal,
|
|
}: Param): Promise<object | null> {
|
|
/**
|
|
* Check if data is valid
|
|
*/
|
|
if (!data || !Object.keys(data).length) return null;
|
|
|
|
const isMaster = useLocal
|
|
? true
|
|
: dbContext?.match(/dsql.user/i)
|
|
? false
|
|
: dbFullName && !dbFullName.match(/^datasquirel$/)
|
|
? false
|
|
: true;
|
|
|
|
/** @type {(a1:any, a2?:any)=> any } */
|
|
const dbHandler: (a1: any, a2?: any) => any = useLocal
|
|
? LOCAL_DB_HANDLER
|
|
: isMaster
|
|
? DB_HANDLER
|
|
: DSQL_USER_DB_HANDLER;
|
|
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
|
|
/**
|
|
* Declare variables
|
|
*
|
|
* @description Declare "results" variable
|
|
*/
|
|
const dataKeys = Object.keys(data);
|
|
|
|
let updateKeyValueArray = [];
|
|
let updateValues = [];
|
|
|
|
for (let i = 0; i < dataKeys.length; i++) {
|
|
try {
|
|
const dataKey = dataKeys[i];
|
|
// @ts-ignore
|
|
let value = data[dataKey];
|
|
|
|
const targetFieldSchemaArray = tableSchema
|
|
? tableSchema?.fields?.filter(
|
|
(field) => field.fieldName === dataKey
|
|
)
|
|
: null;
|
|
const targetFieldSchema =
|
|
targetFieldSchemaArray && targetFieldSchemaArray[0]
|
|
? targetFieldSchemaArray[0]
|
|
: null;
|
|
|
|
if (value == null || value == undefined) continue;
|
|
|
|
const htmlRegex = /<[^>]+>/g;
|
|
|
|
if (targetFieldSchema?.richText || String(value).match(htmlRegex)) {
|
|
value = sanitizeHtml(value, sanitizeHtmlOptions);
|
|
}
|
|
|
|
if (targetFieldSchema?.encrypted) {
|
|
value = encrypt({
|
|
data: value,
|
|
encryptionKey,
|
|
encryptionSalt,
|
|
});
|
|
}
|
|
|
|
if (typeof value === "object") {
|
|
value = JSON.stringify(value);
|
|
}
|
|
|
|
if (targetFieldSchema?.pattern) {
|
|
const pattern = new RegExp(
|
|
targetFieldSchema.pattern,
|
|
targetFieldSchema.patternFlags || ""
|
|
);
|
|
if (!pattern.test(value)) {
|
|
console.log("DSQL: Pattern not matched =>", value);
|
|
value = "";
|
|
}
|
|
}
|
|
|
|
if (typeof value === "string" && value.match(/^null$/i)) {
|
|
value = {
|
|
toSqlString: function () {
|
|
return "NULL";
|
|
},
|
|
};
|
|
}
|
|
|
|
if (typeof value === "string" && !value.match(/./i)) {
|
|
value = {
|
|
toSqlString: function () {
|
|
return "NULL";
|
|
},
|
|
};
|
|
}
|
|
|
|
updateKeyValueArray.push(`\`${dataKey}\`=?`);
|
|
|
|
if (typeof value == "number") {
|
|
updateValues.push(String(value));
|
|
} else {
|
|
updateValues.push(value);
|
|
}
|
|
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
} catch (/** @type {any} */ error: any) {
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
|
|
console.log(
|
|
"DSQL: Error in parsing data keys in update function =>",
|
|
error.message
|
|
);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
|
|
updateKeyValueArray.push(`date_updated='${Date()}'`);
|
|
updateKeyValueArray.push(`date_updated_code='${Date.now()}'`);
|
|
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
|
|
const query = `UPDATE ${tableName} SET ${updateKeyValueArray.join(
|
|
","
|
|
)} WHERE \`${identifierColumnName}\`=?`;
|
|
|
|
updateValues.push(identifierValue);
|
|
|
|
const updatedEntry = isMaster
|
|
? await dbHandler(query, updateValues)
|
|
: await dbHandler({
|
|
paradigm,
|
|
database: dbFullName,
|
|
queryString: query,
|
|
queryValues: updateValues,
|
|
});
|
|
|
|
/**
|
|
* Return statement
|
|
*/
|
|
return updatedEntry;
|
|
}
|