UNPKG

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
"use strict"; 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