tspace-mysql
Version:
Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.
182 lines • 7.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Audit = void 0;
const Model_1 = require("../Model");
const Blueprint_1 = require("../Blueprint");
const schema = {
id: Blueprint_1.Blueprint.int().notNull().primary().autoIncrement(),
uuid: Blueprint_1.Blueprint.varchar(50).null(),
model: Blueprint_1.Blueprint.varchar(100).notNull(),
query: Blueprint_1.Blueprint.longText().notNull(),
event: Blueprint_1.Blueprint.varchar(20).notNull(),
user_id: Blueprint_1.Blueprint.int().notNull(),
metadata: Blueprint_1.Blueprint.json().null(),
auditable_ids: Blueprint_1.Blueprint.longText().null(),
old_values: Blueprint_1.Blueprint.json().null(),
new_values: Blueprint_1.Blueprint.json().null(),
created_at: Blueprint_1.Blueprint.timestamp().null(),
updated_at: Blueprint_1.Blueprint.timestamp().null(),
};
class Audit extends Model_1.Model {
boot() {
this.useUUID();
this.useSchema(schema);
this.useTimestamp();
this.useTable(this.$state.get("TABLE_AUDIT"));
}
static async tracking(instance, { sql, fn }) {
try {
const selectRegex = /^SELECT\b/i;
const updateRegex = /^UPDATE\b/i;
const insertRegex = /^INSERT\b/i;
const deleteRegex = /^DELETE\b/i;
await new this().sync({ force: true });
const userId = Number.isNaN(Number(instance['$state'].get('AUDIT')))
? 0
: Number(instance['$state'].get('AUDIT'));
const metadata = instance['$state'].get('AUDIT_METADATA');
const modelName = instance['$state'].get("MODEL_NAME");
instance['$state'].set("AUDIT", null);
instance['$state'].set("AUDIT_METADATA", null);
const baseQuery = {
model: modelName,
query: sql,
user_id: userId,
metadata: metadata == null ? null : JSON.stringify(metadata),
};
let result = null;
if (insertRegex.test(sql)) {
result = await fn();
const values = await new Model_1.Model()
.copyModel(instance, {
select: true,
where: false,
orderBy: true,
limit: true,
})
.whereIn("id", result.$meta.insertIds)
.disableVoid()
.bind(instance['$pool'].get())
.get();
await new this()
.table(instance['$state'].get("TABLE_AUDIT"))
.create({
...baseQuery,
event: "INSERTD",
auditable_ids: (result.$meta?.insertIds ?? []).length
? JSON.stringify(result.$meta?.insertIds ?? [])
: null,
old_values: null,
new_values: values.length
? JSON.stringify(values)
: null,
})
.void()
.bind(instance['$pool'].get())
.debug(instance['$state'].get('DEBUG'))
.save();
}
if (updateRegex.test(sql)) {
const values = await new Model_1.Model()
.copyModel(instance, {
where: true,
orderBy: true,
limit: true,
})
.disableVoid()
.bind(instance['$pool'].get())
.get();
result = await fn();
const changed = await new Model_1.Model()
.copyModel(instance, {
where: true,
orderBy: true,
limit: true,
})
.disableSoftDelete()
.disableVoid()
.bind(instance['$pool'].get())
.get();
await new this()
.table(instance['$state'].get("TABLE_AUDIT"))
.create({
...baseQuery,
event: "UPDATED",
auditable_ids: values.length
? JSON.stringify(values.map((v) => v.id))
: null,
old_values: values.length
? JSON.stringify(values)
: null,
new_values: changed.length
? JSON.stringify(changed)
: null,
})
.void()
.bind(instance['$pool'].get())
.debug(instance['$state'].get('DEBUG'))
.save();
}
if (deleteRegex.test(sql)) {
let values = await new Model_1.Model()
.copyModel(instance, {
where: true,
orderBy: true,
limit: true,
})
.disableVoid()
.bind(instance['$pool'].get())
.get();
result = await fn();
await new this()
.table(instance['$state'].get("TABLE_AUDIT"))
.create({
...baseQuery,
event: "DELETED",
auditable_ids: values.length
? JSON.stringify(values.map((v) => v.id))
: null,
old_values: values.length
? JSON.stringify(values)
: null,
new_values: null
})
.void()
.bind(instance['$pool'].get())
.debug(instance['$state'].get('DEBUG'))
.save();
}
if (selectRegex.test(sql)) {
result = await fn();
let values = result;
if (Array.isArray(result?.data)) {
values = result.data;
}
if (!Array.isArray(values))
values = [result];
await new this()
.table(instance['$state'].get("TABLE_AUDIT"))
.create({
...baseQuery,
event: "SELECTED",
auditable_ids: values.length
? JSON.stringify(values
.map((v) => v?.id)
.filter(Boolean))
: null,
old_values: values.length
? JSON.stringify(values)
: null,
})
.bind(instance['$pool'].get())
.void()
.save();
}
return result == null ? await fn() : result;
}
catch (e) { }
}
}
exports.Audit = Audit;
exports.default = Audit;
//# sourceMappingURL=Audit.js.map