First version without typescript errors
This commit is contained in:
@@ -4,37 +4,45 @@ type Params = {
|
||||
data: any | any[];
|
||||
};
|
||||
|
||||
export default async function ({ sql: passed_sql, table, data }: Params) {
|
||||
let sql = passed_sql;
|
||||
function quoteIdentifier(identifier: string): string {
|
||||
return `\`${identifier.replace(/`/g, "``")}\``;
|
||||
}
|
||||
|
||||
export default async function ({ sql: passedSql, table, data }: Params) {
|
||||
const config = global.CONFIG;
|
||||
const dbSchema = global.DB_SCHEMA;
|
||||
|
||||
const table_schema = dbSchema.tables.find((t) => t.tableName == table);
|
||||
const now = Date.now();
|
||||
const tableSchema = dbSchema?.tables.find(
|
||||
(t: { tableName: string }) => t.tableName == table,
|
||||
);
|
||||
|
||||
if (table_schema?.tableName) {
|
||||
const set_sql_arr = Object.keys(
|
||||
Array.isArray(data) ? data[0] : data,
|
||||
).map((field) => `${field} = excluded.${field}`);
|
||||
|
||||
set_sql_arr.push(`updated_at = ${now}`);
|
||||
|
||||
const set_sql = set_sql_arr.join(", ");
|
||||
|
||||
const unique_fields = table_schema.fields.filter((f) => f.unique);
|
||||
|
||||
for (let i = 0; i < unique_fields.length; i++) {
|
||||
const field = unique_fields[i];
|
||||
sql += ` ON CONFLICT(${field?.fieldName}) DO UPDATE SET ${set_sql}`;
|
||||
}
|
||||
|
||||
if (table_schema.uniqueConstraints?.[0]) {
|
||||
for (let i = 0; i < table_schema.uniqueConstraints.length; i++) {
|
||||
const constraint = table_schema.uniqueConstraints[i];
|
||||
sql += ` ON CONFLICT(${constraint?.constraintTableFields?.map((c) => c.value)?.join(", ")}) DO UPDATE SET ${set_sql}`;
|
||||
}
|
||||
}
|
||||
if (!tableSchema?.tableName) {
|
||||
return passedSql;
|
||||
}
|
||||
|
||||
return sql;
|
||||
const dataObject = Array.isArray(data) ? data[0] : data;
|
||||
const dataKeys = Object.keys(dataObject || {});
|
||||
|
||||
if (dataKeys.length === 0) {
|
||||
return passedSql;
|
||||
}
|
||||
|
||||
const hasUniqueField =
|
||||
tableSchema.fields.some((field) => field.unique) ||
|
||||
Boolean(tableSchema.uniqueConstraints?.length);
|
||||
|
||||
if (!hasUniqueField) {
|
||||
return passedSql;
|
||||
}
|
||||
|
||||
const setSql = dataKeys
|
||||
.filter((field: string) => field !== "updated_at")
|
||||
.map(
|
||||
(field: string) =>
|
||||
`${quoteIdentifier(field)} = VALUES(${quoteIdentifier(field)})`,
|
||||
);
|
||||
|
||||
setSql.push(`updated_at = ${Date.now()}`);
|
||||
|
||||
return `${passedSql} ON DUPLICATE KEY UPDATE ${setSql.join(", ")}`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user