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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +568 -0
  3. package/dist/adapters/base-adapter.d.ts +13 -0
  4. package/dist/adapters/base-adapter.d.ts.map +1 -0
  5. package/dist/adapters/base-adapter.js +17 -0
  6. package/dist/adapters/base-adapter.js.map +1 -0
  7. package/dist/adapters/sequelize-adapter.d.ts +22 -0
  8. package/dist/adapters/sequelize-adapter.d.ts.map +1 -0
  9. package/dist/adapters/sequelize-adapter.js +181 -0
  10. package/dist/adapters/sequelize-adapter.js.map +1 -0
  11. package/dist/core/audit-logger.d.ts +15 -0
  12. package/dist/core/audit-logger.d.ts.map +1 -0
  13. package/dist/core/audit-logger.js +36 -0
  14. package/dist/core/audit-logger.js.map +1 -0
  15. package/dist/index.d.ts +12 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/middleware/express-middleware.d.ts +10 -0
  20. package/dist/middleware/express-middleware.d.ts.map +1 -0
  21. package/dist/middleware/express-middleware.js +37 -0
  22. package/dist/middleware/express-middleware.js.map +1 -0
  23. package/dist/migrations/create-audit-logs-table.d.ts +4 -0
  24. package/dist/migrations/create-audit-logs-table.d.ts.map +1 -0
  25. package/dist/migrations/create-audit-logs-table.js +75 -0
  26. package/dist/migrations/create-audit-logs-table.js.map +1 -0
  27. package/dist/models/audit-log.model.d.ts +29 -0
  28. package/dist/models/audit-log.model.d.ts.map +1 -0
  29. package/dist/models/audit-log.model.js +80 -0
  30. package/dist/models/audit-log.model.js.map +1 -0
  31. package/dist/types/index.d.ts +72 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/types/index.js +2 -0
  34. package/dist/types/index.js.map +1 -0
  35. package/dist/utils/config-resolver.d.ts +12 -0
  36. package/dist/utils/config-resolver.d.ts.map +1 -0
  37. package/dist/utils/config-resolver.js +90 -0
  38. package/dist/utils/config-resolver.js.map +1 -0
  39. package/dist/utils/field-filter.d.ts +10 -0
  40. package/dist/utils/field-filter.d.ts.map +1 -0
  41. package/dist/utils/field-filter.js +43 -0
  42. package/dist/utils/field-filter.js.map +1 -0
  43. package/dist/utils/validation.d.ts +8 -0
  44. package/dist/utils/validation.d.ts.map +1 -0
  45. package/dist/utils/validation.js +31 -0
  46. package/dist/utils/validation.js.map +1 -0
  47. 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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}