echo-audit-log 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +568 -0
- package/dist/adapters/base-adapter.d.ts +13 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +17 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/sequelize-adapter.d.ts +22 -0
- package/dist/adapters/sequelize-adapter.d.ts.map +1 -0
- package/dist/adapters/sequelize-adapter.js +181 -0
- package/dist/adapters/sequelize-adapter.js.map +1 -0
- package/dist/core/audit-logger.d.ts +15 -0
- package/dist/core/audit-logger.d.ts.map +1 -0
- package/dist/core/audit-logger.js +36 -0
- package/dist/core/audit-logger.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/express-middleware.d.ts +10 -0
- package/dist/middleware/express-middleware.d.ts.map +1 -0
- package/dist/middleware/express-middleware.js +37 -0
- package/dist/middleware/express-middleware.js.map +1 -0
- package/dist/migrations/create-audit-logs-table.d.ts +4 -0
- package/dist/migrations/create-audit-logs-table.d.ts.map +1 -0
- package/dist/migrations/create-audit-logs-table.js +75 -0
- package/dist/migrations/create-audit-logs-table.js.map +1 -0
- package/dist/models/audit-log.model.d.ts +29 -0
- package/dist/models/audit-log.model.d.ts.map +1 -0
- package/dist/models/audit-log.model.js +80 -0
- package/dist/models/audit-log.model.js.map +1 -0
- package/dist/types/index.d.ts +72 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config-resolver.d.ts +12 -0
- package/dist/utils/config-resolver.d.ts.map +1 -0
- package/dist/utils/config-resolver.js +90 -0
- package/dist/utils/config-resolver.js.map +1 -0
- package/dist/utils/field-filter.d.ts +10 -0
- package/dist/utils/field-filter.d.ts.map +1 -0
- package/dist/utils/field-filter.js +43 -0
- package/dist/utils/field-filter.js.map +1 -0
- package/dist/utils/validation.d.ts +8 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +31 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
+
import { ConfigResolver } from '../utils/config-resolver.js';
|
|
3
|
+
import { FieldFilter } from '../utils/field-filter.js';
|
|
4
|
+
import { AuditLog } from '../models/audit-log.model.js';
|
|
5
|
+
export class SequelizeAdapter extends BaseAdapter {
|
|
6
|
+
sequelize;
|
|
7
|
+
configResolver;
|
|
8
|
+
auditLogModel;
|
|
9
|
+
hookRegistry = new Map();
|
|
10
|
+
constructor(sequelize, config) {
|
|
11
|
+
super(config);
|
|
12
|
+
this.sequelize = sequelize;
|
|
13
|
+
this.configResolver = new ConfigResolver(config);
|
|
14
|
+
const tableName = config.auditTableName || 'audit_logs';
|
|
15
|
+
this.auditLogModel = AuditLog.initModel(sequelize, tableName);
|
|
16
|
+
}
|
|
17
|
+
async initialize() {
|
|
18
|
+
try {
|
|
19
|
+
// Only create audit_logs table if it doesn't exist
|
|
20
|
+
// force: false ensures we never drop/recreate existing tables
|
|
21
|
+
await this.auditLogModel.sync({ force: false });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
// Log error but don't crash the application
|
|
25
|
+
console.error('[EchoAuditLog] Failed to initialize audit logs table:', error);
|
|
26
|
+
throw new Error(`Failed to initialize audit logs table: ${error instanceof Error ? error.message : String(error)}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
attachHooks(models) {
|
|
30
|
+
const modelArray = Array.isArray(models) ? models : Object.values(models);
|
|
31
|
+
for (const model of modelArray) {
|
|
32
|
+
const modelName = model.name;
|
|
33
|
+
const resolvedConfig = this.configResolver.resolveModelConfig(modelName);
|
|
34
|
+
if (!resolvedConfig.enabled) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const hooks = [];
|
|
38
|
+
if (resolvedConfig.operations.insert) {
|
|
39
|
+
const afterCreateHook = this.createAfterCreateHook(modelName, resolvedConfig);
|
|
40
|
+
model.addHook('afterCreate', `auditLog_afterCreate_${modelName}`, afterCreateHook);
|
|
41
|
+
hooks.push({ event: 'afterCreate', name: `auditLog_afterCreate_${modelName}` });
|
|
42
|
+
}
|
|
43
|
+
if (resolvedConfig.operations.update) {
|
|
44
|
+
const afterUpdateHook = this.createAfterUpdateHook(modelName, resolvedConfig);
|
|
45
|
+
model.addHook('afterUpdate', `auditLog_afterUpdate_${modelName}`, afterUpdateHook);
|
|
46
|
+
hooks.push({ event: 'afterUpdate', name: `auditLog_afterUpdate_${modelName}` });
|
|
47
|
+
}
|
|
48
|
+
if (resolvedConfig.operations.delete) {
|
|
49
|
+
const afterDestroyHook = this.createAfterDestroyHook(modelName, resolvedConfig);
|
|
50
|
+
model.addHook('afterDestroy', `auditLog_afterDestroy_${modelName}`, afterDestroyHook);
|
|
51
|
+
hooks.push({ event: 'afterDestroy', name: `auditLog_afterDestroy_${modelName}` });
|
|
52
|
+
}
|
|
53
|
+
this.hookRegistry.set(modelName, hooks);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
detachHooks(models) {
|
|
57
|
+
const modelArray = Array.isArray(models) ? models : Object.values(models);
|
|
58
|
+
for (const model of modelArray) {
|
|
59
|
+
const modelName = model.name;
|
|
60
|
+
const hooks = this.hookRegistry.get(modelName);
|
|
61
|
+
if (hooks) {
|
|
62
|
+
for (const hook of hooks) {
|
|
63
|
+
model.removeHook(hook.event, hook.name);
|
|
64
|
+
}
|
|
65
|
+
this.hookRegistry.delete(modelName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
createAfterCreateHook(modelName, resolvedConfig) {
|
|
70
|
+
return async (instance, _options) => {
|
|
71
|
+
try {
|
|
72
|
+
const primaryKey = this.getPrimaryKeyValue(instance);
|
|
73
|
+
const newValues = FieldFilter.filterFields(instance.get({ plain: true }), resolvedConfig);
|
|
74
|
+
const { oldValues, newValues: processedNewValues } = FieldFilter.prepareValuesForStorage(null, newValues, resolvedConfig.valueStorageMode);
|
|
75
|
+
await this.createAuditLog({
|
|
76
|
+
entityId: primaryKey,
|
|
77
|
+
entityName: modelName,
|
|
78
|
+
actionType: 'INSERT',
|
|
79
|
+
oldValues,
|
|
80
|
+
newValues: processedNewValues,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.handleError('afterCreate', modelName, error);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
createAfterUpdateHook(modelName, resolvedConfig) {
|
|
89
|
+
return async (instance, _options) => {
|
|
90
|
+
try {
|
|
91
|
+
const primaryKey = this.getPrimaryKeyValue(instance);
|
|
92
|
+
const currentValues = instance.get({ plain: true });
|
|
93
|
+
const previousValues = instance._previousDataValues || {};
|
|
94
|
+
const filteredOldValues = FieldFilter.filterFields(previousValues, resolvedConfig);
|
|
95
|
+
const filteredNewValues = FieldFilter.filterFields(currentValues, resolvedConfig);
|
|
96
|
+
const { oldValues, newValues } = FieldFilter.prepareValuesForStorage(filteredOldValues, filteredNewValues, resolvedConfig.valueStorageMode);
|
|
97
|
+
if (Object.keys(newValues || {}).length === 0) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
await this.createAuditLog({
|
|
101
|
+
entityId: primaryKey,
|
|
102
|
+
entityName: modelName,
|
|
103
|
+
actionType: 'UPDATE',
|
|
104
|
+
oldValues,
|
|
105
|
+
newValues,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
this.handleError('afterUpdate', modelName, error);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
createAfterDestroyHook(modelName, resolvedConfig) {
|
|
114
|
+
return async (instance, ptions) => {
|
|
115
|
+
try {
|
|
116
|
+
const primaryKey = this.getPrimaryKeyValue(instance);
|
|
117
|
+
const oldValues = FieldFilter.filterFields(instance.get({ plain: true }), resolvedConfig);
|
|
118
|
+
const { oldValues: processedOldValues, newValues } = FieldFilter.prepareValuesForStorage(oldValues, null, resolvedConfig.valueStorageMode);
|
|
119
|
+
await this.createAuditLog({
|
|
120
|
+
entityId: primaryKey,
|
|
121
|
+
entityName: modelName,
|
|
122
|
+
actionType: 'DELETE',
|
|
123
|
+
oldValues: processedOldValues,
|
|
124
|
+
newValues,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
this.handleError('afterDestroy', modelName, error);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async createAuditLog(data) {
|
|
133
|
+
const metadata = this.config.captureMetadata !== false ? this.getMetadataFields() : {};
|
|
134
|
+
await this.auditLogModel.create({
|
|
135
|
+
entityId: BigInt(data.entityId),
|
|
136
|
+
entityName: data.entityName,
|
|
137
|
+
actionType: data.actionType,
|
|
138
|
+
oldValues: data.oldValues,
|
|
139
|
+
newValues: data.newValues,
|
|
140
|
+
actionTimestamp: new Date(),
|
|
141
|
+
...metadata,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
getPrimaryKeyValue(instance) {
|
|
145
|
+
const model = instance.constructor;
|
|
146
|
+
const primaryKey = model.primaryKeyAttribute;
|
|
147
|
+
return instance.get(primaryKey);
|
|
148
|
+
}
|
|
149
|
+
getMetadataFields() {
|
|
150
|
+
const context = this.getAuditContext();
|
|
151
|
+
const metadata = {};
|
|
152
|
+
if (context.requestId) {
|
|
153
|
+
metadata.requestId = context.requestId;
|
|
154
|
+
}
|
|
155
|
+
if (context.ipAddress) {
|
|
156
|
+
metadata.ipAddress = this.normalizeIp(context.ipAddress);
|
|
157
|
+
}
|
|
158
|
+
if (context.userAgent) {
|
|
159
|
+
metadata.userAgent = context.userAgent;
|
|
160
|
+
}
|
|
161
|
+
if (context.userId !== undefined && context.userId !== null) {
|
|
162
|
+
metadata.actionBy = BigInt(context.userId);
|
|
163
|
+
}
|
|
164
|
+
return metadata;
|
|
165
|
+
}
|
|
166
|
+
normalizeIp(ip) {
|
|
167
|
+
if (!ip)
|
|
168
|
+
return null;
|
|
169
|
+
if (ip === '::1') {
|
|
170
|
+
return '127.0.0.1';
|
|
171
|
+
}
|
|
172
|
+
if (ip.startsWith('::ffff:')) {
|
|
173
|
+
return ip.replace('::ffff:', '');
|
|
174
|
+
}
|
|
175
|
+
return ip;
|
|
176
|
+
}
|
|
177
|
+
handleError(hookName, modelName, error) {
|
|
178
|
+
console.error(`[EchoAuditLog] Error in ${hookName} hook for model ${modelName}:`, error);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=sequelize-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize-adapter.js","sourceRoot":"","sources":["../../src/adapters/sequelize-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseAdapter } from '../adapters/base-adapter.js';
|
|
2
|
+
import { AuditContext } from '../types/index.js';
|
|
3
|
+
export declare class AuditLogger {
|
|
4
|
+
private adapter;
|
|
5
|
+
private initialized;
|
|
6
|
+
constructor(adapter: BaseAdapter);
|
|
7
|
+
initialize(): Promise<void>;
|
|
8
|
+
attachHooks(models: any): void;
|
|
9
|
+
detachHooks(models: any): void;
|
|
10
|
+
setContext(context: AuditContext): void;
|
|
11
|
+
clearContext(): void;
|
|
12
|
+
getContext(): AuditContext;
|
|
13
|
+
isInitialized(): boolean;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=audit-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/core/audit-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,WAAW,CAAkB;gBAEzB,OAAO,EAAE,WAAW;IAI1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAQ9B,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAI9B,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIvC,YAAY,IAAI,IAAI;IAIpB,UAAU,IAAI,YAAY;IAI1B,aAAa,IAAI,OAAO;CAGzB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export class AuditLogger {
|
|
2
|
+
adapter;
|
|
3
|
+
initialized = false;
|
|
4
|
+
constructor(adapter) {
|
|
5
|
+
this.adapter = adapter;
|
|
6
|
+
}
|
|
7
|
+
async initialize() {
|
|
8
|
+
if (this.initialized) {
|
|
9
|
+
throw new Error('AuditLogger is already initialized');
|
|
10
|
+
}
|
|
11
|
+
await this.adapter.initialize();
|
|
12
|
+
this.initialized = true;
|
|
13
|
+
}
|
|
14
|
+
attachHooks(models) {
|
|
15
|
+
if (!this.initialized) {
|
|
16
|
+
throw new Error('AuditLogger must be initialized before attaching hooks');
|
|
17
|
+
}
|
|
18
|
+
this.adapter.attachHooks(models);
|
|
19
|
+
}
|
|
20
|
+
detachHooks(models) {
|
|
21
|
+
this.adapter.detachHooks(models);
|
|
22
|
+
}
|
|
23
|
+
setContext(context) {
|
|
24
|
+
this.adapter.setAuditContext(context);
|
|
25
|
+
}
|
|
26
|
+
clearContext() {
|
|
27
|
+
this.adapter.clearAuditContext();
|
|
28
|
+
}
|
|
29
|
+
getContext() {
|
|
30
|
+
return this.adapter.getAuditContext();
|
|
31
|
+
}
|
|
32
|
+
isInitialized() {
|
|
33
|
+
return this.initialized;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=audit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/core/audit-logger.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,WAAW;IACd,OAAO,CAAc;IACrB,WAAW,GAAY,KAAK,CAAC;IAErC,YAAY,OAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,MAAW;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,WAAW,CAAC,MAAW;QACrB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,UAAU,CAAC,OAAqB;QAC9B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IACnC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { AuditLogger } from './core/audit-logger.js';
|
|
2
|
+
export { BaseAdapter } from './adapters/base-adapter.js';
|
|
3
|
+
export { SequelizeAdapter } from './adapters/sequelize-adapter.js';
|
|
4
|
+
export { AuditLog } from './models/audit-log.model.js';
|
|
5
|
+
export { createAuditMiddleware } from './middleware/express-middleware.js';
|
|
6
|
+
export { up as createAuditLogsTable, down as dropAuditLogsTable } from './migrations/create-audit-logs-table.js';
|
|
7
|
+
export { ConfigResolver } from './utils/config-resolver.js';
|
|
8
|
+
export { FieldFilter } from './utils/field-filter.js';
|
|
9
|
+
export type { ActionType, ValueStorageMode, ColumnConfig, OperationConfig, ModelConfig, GlobalConfig, AuditLogConfig, ResolvedModelConfig, AuditLogEntry, AuditContext, HookContext, } from './types/index.js';
|
|
10
|
+
export type { AuditMiddlewareOptions } from './middleware/express-middleware.js';
|
|
11
|
+
export type { AuditLogAttributes } from './models/audit-log.model.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,EAAE,IAAI,oBAAoB,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { AuditLogger } from './core/audit-logger.js';
|
|
2
|
+
export { BaseAdapter } from './adapters/base-adapter.js';
|
|
3
|
+
export { SequelizeAdapter } from './adapters/sequelize-adapter.js';
|
|
4
|
+
export { AuditLog } from './models/audit-log.model.js';
|
|
5
|
+
export { createAuditMiddleware } from './middleware/express-middleware.js';
|
|
6
|
+
export { up as createAuditLogsTable, down as dropAuditLogsTable } from './migrations/create-audit-logs-table.js';
|
|
7
|
+
export { ConfigResolver } from './utils/config-resolver.js';
|
|
8
|
+
export { FieldFilter } from './utils/field-filter.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,EAAE,IAAI,oBAAoB,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { AuditLogger } from '../core/audit-logger.js';
|
|
3
|
+
export interface AuditMiddlewareOptions {
|
|
4
|
+
getUserId?: (req: Request) => number | null | undefined;
|
|
5
|
+
getRequestId?: (req: Request) => string | undefined;
|
|
6
|
+
captureIp?: boolean;
|
|
7
|
+
captureUserAgent?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function createAuditMiddleware(auditLogger: AuditLogger, options?: AuditMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => void;
|
|
10
|
+
//# sourceMappingURL=express-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/express-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,sBAA2B,GACnC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CA8C3D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
export function createAuditMiddleware(auditLogger, options = {}) {
|
|
3
|
+
const { getUserId, getRequestId, captureIp = true, captureUserAgent = true, } = options;
|
|
4
|
+
return (req, res, next) => {
|
|
5
|
+
const context = {};
|
|
6
|
+
if (getUserId) {
|
|
7
|
+
const userId = getUserId(req);
|
|
8
|
+
if (userId !== undefined && userId !== null) {
|
|
9
|
+
context.userId = userId;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (getRequestId) {
|
|
13
|
+
context.requestId = getRequestId(req);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
context.requestId = randomUUID();
|
|
17
|
+
}
|
|
18
|
+
if (captureIp) {
|
|
19
|
+
const ip = req.ip || req.socket.remoteAddress;
|
|
20
|
+
if (ip) {
|
|
21
|
+
context.ipAddress = ip;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (captureUserAgent) {
|
|
25
|
+
const userAgent = req.get('user-agent');
|
|
26
|
+
if (userAgent) {
|
|
27
|
+
context.userAgent = userAgent;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
auditLogger.setContext(context);
|
|
31
|
+
res.on('finish', () => {
|
|
32
|
+
auditLogger.clearContext();
|
|
33
|
+
});
|
|
34
|
+
next();
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=express-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-middleware.js","sourceRoot":"","sources":["../../src/middleware/express-middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AASpC,MAAM,UAAU,qBAAqB,CACnC,WAAwB,EACxB,UAAkC,EAAE;IAEpC,MAAM,EACJ,SAAS,EACT,YAAY,EACZ,SAAS,GAAG,IAAI,EAChB,gBAAgB,GAAG,IAAI,GACxB,GAAG,OAAO,CAAC;IAEZ,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,MAAM,OAAO,GAAQ,EAAE,CAAC;QAExB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC5C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;YAC9C,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;YAChC,CAAC;QACH,CAAC;QAED,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEhC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,WAAW,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { QueryInterface } from 'sequelize';
|
|
2
|
+
export declare function up(queryInterface: QueryInterface, tableName?: string): Promise<void>;
|
|
3
|
+
export declare function down(queryInterface: QueryInterface, tableName?: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=create-audit-logs-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-audit-logs-table.d.ts","sourceRoot":"","sources":["../../src/migrations/create-audit-logs-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAa,MAAM,WAAW,CAAC;AAEtD,wBAAsB,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,GAAE,MAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwExG;AAED,wBAAsB,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,GAAE,MAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1G"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DataTypes } from 'sequelize';
|
|
2
|
+
export async function up(queryInterface, tableName = 'audit_logs') {
|
|
3
|
+
await queryInterface.createTable(tableName, {
|
|
4
|
+
id: {
|
|
5
|
+
type: DataTypes.BIGINT,
|
|
6
|
+
primaryKey: true,
|
|
7
|
+
autoIncrement: true,
|
|
8
|
+
allowNull: false,
|
|
9
|
+
},
|
|
10
|
+
entity_id: {
|
|
11
|
+
type: DataTypes.BIGINT,
|
|
12
|
+
allowNull: false,
|
|
13
|
+
comment: 'Primary key value of the model object',
|
|
14
|
+
},
|
|
15
|
+
entity_name: {
|
|
16
|
+
type: DataTypes.STRING(255),
|
|
17
|
+
allowNull: false,
|
|
18
|
+
comment: 'Name of model on which operation was performed',
|
|
19
|
+
},
|
|
20
|
+
action_type: {
|
|
21
|
+
type: DataTypes.ENUM('INSERT', 'UPDATE', 'DELETE'),
|
|
22
|
+
allowNull: false,
|
|
23
|
+
comment: 'Type of operation that was performed',
|
|
24
|
+
},
|
|
25
|
+
old_values: {
|
|
26
|
+
type: DataTypes.JSON,
|
|
27
|
+
allowNull: true,
|
|
28
|
+
comment: 'JSON object of column values before operation (NULL for INSERT)',
|
|
29
|
+
},
|
|
30
|
+
new_values: {
|
|
31
|
+
type: DataTypes.JSON,
|
|
32
|
+
allowNull: true,
|
|
33
|
+
comment: 'JSON object of column values after operation (NULL for DELETE)',
|
|
34
|
+
},
|
|
35
|
+
request_id: {
|
|
36
|
+
type: DataTypes.STRING(64),
|
|
37
|
+
allowNull: true,
|
|
38
|
+
comment: 'Request ID for tracing',
|
|
39
|
+
},
|
|
40
|
+
ip_address: {
|
|
41
|
+
type: DataTypes.STRING(45),
|
|
42
|
+
allowNull: true,
|
|
43
|
+
comment: 'IP address of the client (supports IPv4 and IPv6)',
|
|
44
|
+
},
|
|
45
|
+
user_agent: {
|
|
46
|
+
type: DataTypes.STRING(255),
|
|
47
|
+
allowNull: true,
|
|
48
|
+
comment: 'User agent string',
|
|
49
|
+
},
|
|
50
|
+
action_by: {
|
|
51
|
+
type: DataTypes.BIGINT,
|
|
52
|
+
allowNull: true,
|
|
53
|
+
comment: 'ID of the user who performed this operation (NULL for background jobs)',
|
|
54
|
+
},
|
|
55
|
+
action_timestamp: {
|
|
56
|
+
type: DataTypes.DATE,
|
|
57
|
+
allowNull: false,
|
|
58
|
+
defaultValue: DataTypes.NOW,
|
|
59
|
+
comment: 'Timestamp when the operation was performed',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
await queryInterface.addIndex(tableName, ['entity_name', 'entity_id'], {
|
|
63
|
+
name: `idx_${tableName}_entity`,
|
|
64
|
+
});
|
|
65
|
+
await queryInterface.addIndex(tableName, ['action_timestamp'], {
|
|
66
|
+
name: `idx_${tableName}_timestamp`,
|
|
67
|
+
});
|
|
68
|
+
await queryInterface.addIndex(tableName, ['action_by'], {
|
|
69
|
+
name: `idx_${tableName}_action_by`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export async function down(queryInterface, tableName = 'audit_logs') {
|
|
73
|
+
await queryInterface.dropTable(tableName);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=create-audit-logs-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-audit-logs-table.js","sourceRoot":"","sources":["../../src/migrations/create-audit-logs-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,cAA8B,EAAE,YAAoB,YAAY;IACvF,MAAM,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE;QAC1C,EAAE,EAAE;YACF,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,KAAK;SACjB;QACD,SAAS,EAAE;YACT,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,uCAAuC;SACjD;QACD,WAAW,EAAE;YACX,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3B,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,gDAAgD;SAC1D;QACD,WAAW,EAAE;YACX,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;YAClD,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,sCAAsC;SAChD;QACD,UAAU,EAAE;YACV,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,iEAAiE;SAC3E;QACD,UAAU,EAAE;YACV,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,gEAAgE;SAC1E;QACD,UAAU,EAAE;YACV,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,wBAAwB;SAClC;QACD,UAAU,EAAE;YACV,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,mDAAmD;SAC7D;QACD,UAAU,EAAE;YACV,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,mBAAmB;SAC7B;QACD,SAAS,EAAE;YACT,IAAI,EAAE,SAAS,CAAC,MAAM;YACtB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,wEAAwE;SAClF;QACD,gBAAgB,EAAE;YAChB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,SAAS,CAAC,GAAG;YAC3B,OAAO,EAAE,4CAA4C;SACtD;KACF,CAAC,CAAC;IAEH,MAAM,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE;QACrE,IAAI,EAAE,OAAO,SAAS,SAAS;KAChC,CAAC,CAAC;IAEH,MAAM,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC,EAAE;QAC7D,IAAI,EAAE,OAAO,SAAS,YAAY;KACnC,CAAC,CAAC;IAEH,MAAM,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE;QACtD,IAAI,EAAE,OAAO,SAAS,YAAY;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,cAA8B,EAAE,YAAoB,YAAY;IACzF,MAAM,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Sequelize, Model } from 'sequelize';
|
|
2
|
+
export interface AuditLogAttributes {
|
|
3
|
+
id?: bigint;
|
|
4
|
+
entityId: bigint;
|
|
5
|
+
entityName: string;
|
|
6
|
+
actionType: 'INSERT' | 'UPDATE' | 'DELETE';
|
|
7
|
+
oldValues: object | null;
|
|
8
|
+
newValues: object | null;
|
|
9
|
+
requestId?: string | null;
|
|
10
|
+
ipAddress?: string | null;
|
|
11
|
+
userAgent?: string | null;
|
|
12
|
+
actionBy?: bigint | null;
|
|
13
|
+
actionTimestamp?: Date;
|
|
14
|
+
}
|
|
15
|
+
export declare class AuditLog extends Model<AuditLogAttributes> implements AuditLogAttributes {
|
|
16
|
+
id?: bigint;
|
|
17
|
+
entityId: bigint;
|
|
18
|
+
entityName: string;
|
|
19
|
+
actionType: 'INSERT' | 'UPDATE' | 'DELETE';
|
|
20
|
+
oldValues: object | null;
|
|
21
|
+
newValues: object | null;
|
|
22
|
+
requestId?: string | null;
|
|
23
|
+
ipAddress?: string | null;
|
|
24
|
+
userAgent?: string | null;
|
|
25
|
+
actionBy?: bigint | null;
|
|
26
|
+
actionTimestamp?: Date;
|
|
27
|
+
static initModel(sequelize: Sequelize, tableName?: string): typeof AuditLog;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=audit-log.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.model.d.ts","sourceRoot":"","sources":["../../src/models/audit-log.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,IAAI,CAAC;CACxB;AAED,qBAAa,QAAS,SAAQ,KAAK,CAAC,kBAAkB,CAAE,YAAW,kBAAkB;IAC3E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,IAAI,CAAC;IAE/B,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,GAAE,MAAqB,GAAG,OAAO,QAAQ;CAgF1F"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { DataTypes, Model } from 'sequelize';
|
|
2
|
+
export class AuditLog extends Model {
|
|
3
|
+
static initModel(sequelize, tableName = 'audit_logs') {
|
|
4
|
+
AuditLog.init({
|
|
5
|
+
id: {
|
|
6
|
+
type: DataTypes.BIGINT,
|
|
7
|
+
primaryKey: true,
|
|
8
|
+
autoIncrement: true,
|
|
9
|
+
},
|
|
10
|
+
entityId: {
|
|
11
|
+
type: DataTypes.BIGINT,
|
|
12
|
+
allowNull: false,
|
|
13
|
+
field: 'entity_id',
|
|
14
|
+
},
|
|
15
|
+
entityName: {
|
|
16
|
+
type: DataTypes.STRING(255),
|
|
17
|
+
allowNull: false,
|
|
18
|
+
field: 'entity_name',
|
|
19
|
+
},
|
|
20
|
+
actionType: {
|
|
21
|
+
type: DataTypes.ENUM('INSERT', 'UPDATE', 'DELETE'),
|
|
22
|
+
allowNull: false,
|
|
23
|
+
field: 'action_type',
|
|
24
|
+
},
|
|
25
|
+
oldValues: {
|
|
26
|
+
type: DataTypes.JSON,
|
|
27
|
+
allowNull: true,
|
|
28
|
+
field: 'old_values',
|
|
29
|
+
},
|
|
30
|
+
newValues: {
|
|
31
|
+
type: DataTypes.JSON,
|
|
32
|
+
allowNull: true,
|
|
33
|
+
field: 'new_values',
|
|
34
|
+
},
|
|
35
|
+
requestId: {
|
|
36
|
+
type: DataTypes.STRING(64),
|
|
37
|
+
allowNull: true,
|
|
38
|
+
field: 'request_id',
|
|
39
|
+
},
|
|
40
|
+
ipAddress: {
|
|
41
|
+
type: DataTypes.STRING(45),
|
|
42
|
+
allowNull: true,
|
|
43
|
+
field: 'ip_address',
|
|
44
|
+
},
|
|
45
|
+
userAgent: {
|
|
46
|
+
type: DataTypes.STRING(255),
|
|
47
|
+
allowNull: true,
|
|
48
|
+
field: 'user_agent',
|
|
49
|
+
},
|
|
50
|
+
actionBy: {
|
|
51
|
+
type: DataTypes.BIGINT,
|
|
52
|
+
allowNull: true,
|
|
53
|
+
field: 'action_by',
|
|
54
|
+
},
|
|
55
|
+
actionTimestamp: {
|
|
56
|
+
type: DataTypes.DATE,
|
|
57
|
+
allowNull: false,
|
|
58
|
+
defaultValue: DataTypes.NOW,
|
|
59
|
+
field: 'action_timestamp',
|
|
60
|
+
},
|
|
61
|
+
}, {
|
|
62
|
+
sequelize,
|
|
63
|
+
tableName,
|
|
64
|
+
timestamps: false,
|
|
65
|
+
indexes: [
|
|
66
|
+
{
|
|
67
|
+
fields: ['entity_name', 'entity_id'],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
fields: ['action_timestamp'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
fields: ['action_by'],
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
});
|
|
77
|
+
return AuditLog;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=audit-log.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.model.js","sourceRoot":"","sources":["../../src/models/audit-log.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,KAAK,EAAE,MAAM,WAAW,CAAC;AAgBxD,MAAM,OAAO,QAAS,SAAQ,KAAyB;IAarD,MAAM,CAAC,SAAS,CAAC,SAAoB,EAAE,YAAoB,YAAY;QACrE,QAAQ,CAAC,IAAI,CACX;YACE,EAAE,EAAE;gBACF,IAAI,EAAE,SAAS,CAAC,MAAM;gBACtB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS,CAAC,MAAM;gBACtB,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,WAAW;aACnB;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC3B,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,aAAa;aACrB;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBAClD,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,aAAa;aACrB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,YAAY;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,YAAY;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,YAAY;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,YAAY;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC3B,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,YAAY;aACpB;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS,CAAC,MAAM;gBACtB,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,WAAW;aACnB;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,YAAY,EAAE,SAAS,CAAC,GAAG;gBAC3B,KAAK,EAAE,kBAAkB;aAC1B;SACF,EACD;YACE,SAAS;YACT,SAAS;YACT,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE;gBACP;oBACE,MAAM,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;iBACrC;gBACD;oBACE,MAAM,EAAE,CAAC,kBAAkB,CAAC;iBAC7B;gBACD;oBACE,MAAM,EAAE,CAAC,WAAW,CAAC;iBACtB;aACF;SACF,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export type ActionType = 'INSERT' | 'UPDATE' | 'DELETE';
|
|
2
|
+
export type ValueStorageMode = 'all' | 'changed';
|
|
3
|
+
export interface ColumnConfig {
|
|
4
|
+
include?: string[];
|
|
5
|
+
exclude?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface OperationConfig {
|
|
8
|
+
insert?: boolean;
|
|
9
|
+
update?: boolean;
|
|
10
|
+
delete?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ModelConfig {
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
columns?: ColumnConfig;
|
|
15
|
+
operations?: OperationConfig;
|
|
16
|
+
valueStorageMode?: ValueStorageMode;
|
|
17
|
+
}
|
|
18
|
+
export interface GlobalConfig {
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
columns?: ColumnConfig;
|
|
21
|
+
operations?: OperationConfig;
|
|
22
|
+
valueStorageMode?: ValueStorageMode;
|
|
23
|
+
}
|
|
24
|
+
export interface AuditLogConfig {
|
|
25
|
+
global?: GlobalConfig;
|
|
26
|
+
models?: {
|
|
27
|
+
[modelName: string]: ModelConfig;
|
|
28
|
+
};
|
|
29
|
+
auditTableName?: string;
|
|
30
|
+
captureMetadata?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface ResolvedModelConfig {
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
columns: {
|
|
35
|
+
include: string[] | null;
|
|
36
|
+
exclude: string[];
|
|
37
|
+
};
|
|
38
|
+
operations: {
|
|
39
|
+
insert: boolean;
|
|
40
|
+
update: boolean;
|
|
41
|
+
delete: boolean;
|
|
42
|
+
};
|
|
43
|
+
valueStorageMode: ValueStorageMode;
|
|
44
|
+
}
|
|
45
|
+
export interface AuditLogEntry {
|
|
46
|
+
entityId: string | number;
|
|
47
|
+
entityName: string;
|
|
48
|
+
actionType: ActionType;
|
|
49
|
+
oldValues: Record<string, any> | null;
|
|
50
|
+
newValues: Record<string, any> | null;
|
|
51
|
+
requestId?: string | null;
|
|
52
|
+
ipAddress?: string | null;
|
|
53
|
+
userAgent?: string | null;
|
|
54
|
+
actionBy?: number | null;
|
|
55
|
+
actionTimestamp: Date;
|
|
56
|
+
}
|
|
57
|
+
export interface AuditContext {
|
|
58
|
+
userId?: number | null;
|
|
59
|
+
requestId?: string | null;
|
|
60
|
+
ipAddress?: string | null;
|
|
61
|
+
userAgent?: string | null;
|
|
62
|
+
}
|
|
63
|
+
export interface HookContext {
|
|
64
|
+
modelName: string;
|
|
65
|
+
operation: ActionType;
|
|
66
|
+
instance?: any;
|
|
67
|
+
instances?: any[];
|
|
68
|
+
previousValues?: Record<string, any>;
|
|
69
|
+
currentValues?: Record<string, any>;
|
|
70
|
+
context?: AuditContext;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|