128 lines
5.1 KiB
JavaScript
128 lines
5.1 KiB
JavaScript
import sanitizeHtml from "sanitize-html";
|
|
import sanitizeHtmlOptions from "../html/sanitizeHtmlOptions";
|
|
import encrypt from "../../dsql/encrypt";
|
|
import checkIfIsMaster from "../../../utils/check-if-is-master";
|
|
import connDbHandler from "../../../utils/db/conn-db-handler";
|
|
import _ from "lodash";
|
|
import purgeDefaultFields from "../../../utils/purge-default-fields";
|
|
/**
|
|
* # Update DB Function
|
|
* @description
|
|
*/
|
|
export default async function updateDbEntry({ dbContext, dbFullName, tableName, data, tableSchema, identifierColumnName, identifierValue, encryptionKey, encryptionSalt, forceLocal, }) {
|
|
var _a;
|
|
/**
|
|
* Check if data is valid
|
|
*/
|
|
if (!data || !Object.keys(data).length) {
|
|
return {
|
|
success: false,
|
|
payload: undefined,
|
|
msg: "No data provided",
|
|
};
|
|
}
|
|
const isMaster = forceLocal
|
|
? true
|
|
: checkIfIsMaster({ dbContext, dbFullName });
|
|
const DB_CONN = isMaster
|
|
? global.DSQL_DB_CONN
|
|
: global.DSQL_FULL_ACCESS_DB_CONN || global.DSQL_DB_CONN;
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
let newData = _.cloneDeep(data);
|
|
newData = purgeDefaultFields(newData);
|
|
/**
|
|
* Declare variables
|
|
*
|
|
* @description Declare "results" variable
|
|
*/
|
|
const dataKeys = Object.keys(newData);
|
|
let updateKeyValueArray = [];
|
|
let updateValues = [];
|
|
for (let i = 0; i < dataKeys.length; i++) {
|
|
try {
|
|
const dataKey = dataKeys[i];
|
|
let value = newData[dataKey];
|
|
const targetFieldSchemaArray = tableSchema
|
|
? (_a = tableSchema === null || tableSchema === void 0 ? void 0 : tableSchema.fields) === null || _a === void 0 ? void 0 : _a.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 === null || targetFieldSchema === void 0 ? void 0 : targetFieldSchema.richText) || String(value).match(htmlRegex)) {
|
|
value = sanitizeHtml(value, sanitizeHtmlOptions);
|
|
}
|
|
if (targetFieldSchema === null || targetFieldSchema === void 0 ? void 0 : targetFieldSchema.encrypted) {
|
|
value = encrypt({
|
|
data: value,
|
|
encryptionKey,
|
|
encryptionSalt,
|
|
});
|
|
}
|
|
if (typeof value === "object") {
|
|
value = JSON.stringify(value);
|
|
}
|
|
if (targetFieldSchema === null || targetFieldSchema === void 0 ? void 0 : 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) {
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
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 ${isMaster && !dbFullName ? "" : `\`${dbFullName}\`.`}\`${tableName}\` SET ${updateKeyValueArray.join(",")} WHERE \`${identifierColumnName}\`=?`;
|
|
updateValues.push(identifierValue);
|
|
const updatedEntry = await connDbHandler(DB_CONN, query, updateValues);
|
|
/**
|
|
* Return statement
|
|
*/
|
|
return {
|
|
success: Boolean(updatedEntry === null || updatedEntry === void 0 ? void 0 : updatedEntry.affectedRows),
|
|
payload: updatedEntry,
|
|
queryObject: {
|
|
sql: query,
|
|
params: updateValues,
|
|
},
|
|
};
|
|
}
|