@studiosonrai/nestjs-audit-log 1.1.4 → 2.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/README.md +61 -1
- package/dist/src/audit-context.interceptor.js +19 -2
- package/dist/src/audit-context.interceptor.js.map +1 -1
- package/dist/src/audit-table.initializer.d.ts +1 -0
- package/dist/src/audit-table.initializer.js +22 -4
- package/dist/src/audit-table.initializer.js.map +1 -1
- package/dist/src/audit.constants.d.ts +1 -0
- package/dist/src/audit.constants.js +2 -1
- package/dist/src/audit.constants.js.map +1 -1
- package/dist/src/audit.service.d.ts +13 -8
- package/dist/src/audit.service.js +52 -19
- package/dist/src/audit.service.js.map +1 -1
- package/dist/src/audit.subscriber.d.ts +2 -1
- package/dist/src/audit.subscriber.js +16 -8
- package/dist/src/audit.subscriber.js.map +1 -1
- package/dist/src/dto/audit-filter.dto.d.ts +1 -0
- package/dist/src/dto/audit-filter.dto.js +10 -0
- package/dist/src/dto/audit-filter.dto.js.map +1 -1
- package/dist/src/entities/audit-log.entity.js +1 -1
- package/dist/src/entities/audit-log.entity.js.map +1 -1
- package/dist/src/interfaces/audit.interfaces.d.ts +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -98,7 +98,67 @@ await this.contactRepository.delete(id);
|
|
|
98
98
|
For full control use `auditService.log({ entityType, entityId, action, changes, entityName })`.
|
|
99
99
|
`changedBy` is filled from CLS when omitted.
|
|
100
100
|
|
|
101
|
+
## Multi-Schema & Dynamic Schema Support
|
|
102
|
+
|
|
103
|
+
The package supports multi-tenant applications using dynamic database schemas (e.g. `[org_tenantA].[auditLog]`, `[org_tenantB].[auditLog]`):
|
|
104
|
+
|
|
105
|
+
### 1. Automatic Schema Resolution via Request / CLS
|
|
106
|
+
Configure `getSchema` in `AuditModule.forRootAsync()` to extract the tenant schema from each incoming request:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
AuditModule.forRootAsync({
|
|
110
|
+
useFactory: () => ({
|
|
111
|
+
// Optional: Defaults to checking req.tenantSchema, req.schemaName, header 'x-tenant-schema', or req.user.tenantSchema
|
|
112
|
+
getSchema: (req) => (req as any).tenantSchema,
|
|
113
|
+
schema: 'dbo', // Fallback default schema
|
|
114
|
+
schemas: ['tenant_a', 'tenant_b'], // Optional: Pre-ensure tables on boot for known schemas
|
|
115
|
+
}),
|
|
116
|
+
})
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
When set, `AuditContextInterceptor` stores the schema in CLS under `AUDIT_CLS_SCHEMA`. Both the subscriber and `AuditService` will automatically target `[tenantSchema].[auditLog]` for all requests without any manual parameter passing.
|
|
120
|
+
|
|
121
|
+
### 2. Explicit Schema in Service Calls
|
|
122
|
+
Pass `schemaName` directly to any `AuditService` query or command:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// Programmatic write to a tenant schema
|
|
126
|
+
await this.auditService.log({
|
|
127
|
+
entityType: 'User',
|
|
128
|
+
entityId: 10,
|
|
129
|
+
action: AuditActionType.CREATE,
|
|
130
|
+
}, 'org_varun');
|
|
131
|
+
|
|
132
|
+
// Paginated query targeting a tenant schema
|
|
133
|
+
const logs = await this.auditService.findAll({
|
|
134
|
+
page: 0,
|
|
135
|
+
limit: 20,
|
|
136
|
+
schemaName: 'org_varun',
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Filter by entity in a tenant schema
|
|
140
|
+
const entityLogs = await this.auditService.findByEntity('Project', 5, 'org_varun');
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 3. Run Within Tenant Context
|
|
144
|
+
Execute blocks of code scoped to a tenant schema:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
await this.auditService.runInSchema('org_varun', async () => {
|
|
148
|
+
// All auditable entities saved or logged here write to [org_varun].[auditLog]
|
|
149
|
+
await this.projectRepo.save(project);
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 4. Dynamic Tenant Schema Provisioning
|
|
154
|
+
When creating a brand-new tenant schema at runtime:
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// Idempotently creates [new_tenant].[auditLog] with indexes
|
|
158
|
+
await this.auditService.ensureSchemaTable('new_tenant');
|
|
159
|
+
```
|
|
160
|
+
|
|
101
161
|
## Querying
|
|
102
162
|
|
|
103
|
-
`AuditService` exposes `findAll(filter)` (paginated), `findByEntity`, `findByUser`, `findByAction`.
|
|
163
|
+
`AuditService` exposes `findAll(filter, schemaName?)` (paginated), `findByEntity(type, id, schemaName?)`, `findByUser(userId, schemaName?)`, `findByAction(action, schemaName?)`.
|
|
104
164
|
Mount your own controller with your app's guards — the package ships no routes.
|
|
@@ -20,6 +20,18 @@ function defaultGetUserId(request) {
|
|
|
20
20
|
const user = request?.user;
|
|
21
21
|
return user?.id;
|
|
22
22
|
}
|
|
23
|
+
function defaultGetSchema(request) {
|
|
24
|
+
const req = request;
|
|
25
|
+
return (req?.tenantSchema ||
|
|
26
|
+
req?.schemaName ||
|
|
27
|
+
req?.schema ||
|
|
28
|
+
(typeof req?.headers?.['x-tenant-schema'] === 'string'
|
|
29
|
+
? req.headers['x-tenant-schema']
|
|
30
|
+
: undefined) ||
|
|
31
|
+
req?.user?.tenantSchema ||
|
|
32
|
+
req?.user?.schemaName ||
|
|
33
|
+
req?.user?.schema);
|
|
34
|
+
}
|
|
23
35
|
let AuditContextInterceptor = class AuditContextInterceptor {
|
|
24
36
|
options;
|
|
25
37
|
cls;
|
|
@@ -30,11 +42,16 @@ let AuditContextInterceptor = class AuditContextInterceptor {
|
|
|
30
42
|
intercept(context, next) {
|
|
31
43
|
if (context.getType() === 'http' && this.cls.isActive()) {
|
|
32
44
|
const request = context.switchToHttp().getRequest();
|
|
33
|
-
const
|
|
34
|
-
const userId =
|
|
45
|
+
const userExtractor = this.options.getUserId ?? defaultGetUserId;
|
|
46
|
+
const userId = userExtractor(request);
|
|
35
47
|
if (userId !== undefined) {
|
|
36
48
|
this.cls.set(audit_constants_1.AUDIT_CLS_USER_ID, userId);
|
|
37
49
|
}
|
|
50
|
+
const schemaExtractor = this.options.getSchema ?? defaultGetSchema;
|
|
51
|
+
const schema = schemaExtractor(request);
|
|
52
|
+
if (schema !== undefined && schema.trim() !== '') {
|
|
53
|
+
this.cls.set(audit_constants_1.AUDIT_CLS_SCHEMA, schema.trim());
|
|
54
|
+
}
|
|
38
55
|
}
|
|
39
56
|
return next.handle();
|
|
40
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-context.interceptor.js","sourceRoot":"","sources":["../../src/audit-context.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAMwB;AAExB,2CAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"audit-context.interceptor.js","sourceRoot":"","sources":["../../src/audit-context.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAMwB;AAExB,2CAAwC;AACxC,uDAI2B;AAG3B,SAAS,gBAAgB,CAAC,OAAgB;IACxC,MAAM,IAAI,GAAI,OAAkD,EAAE,IAAI,CAAC;IACvE,OAAO,IAAI,EAAE,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,MAAM,GAAG,GAAG,OAMC,CAAC;IAEd,OAAO,CACL,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,MAAM;QACX,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,KAAK,QAAQ;YACpD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAChC,CAAC,CAAC,SAAS,CAAC;QACd,GAAG,EAAE,IAAI,EAAE,YAAY;QACvB,GAAG,EAAE,IAAI,EAAE,UAAU;QACrB,GAAG,EAAE,IAAI,EAAE,MAAM,CAClB,CAAC;AACJ,CAAC;AAQM,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAGf;IACA;IAHnB,YAEmB,OAA2B,EAC3B,GAAe;QADf,YAAO,GAAP,OAAO,CAAoB;QAC3B,QAAG,GAAH,GAAG,CAAY;IAC/B,CAAC;IAEJ,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;YAE7D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;YACjE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAiB,EAAE,MAAM,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;YACnE,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,kCAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AAzBY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,sCAAoB,CAAC,CAAA;6CAEP,uBAAU;GAJvB,uBAAuB,CAyBnC"}
|
|
@@ -8,5 +8,6 @@ export declare class AuditTableInitializer implements OnModuleInit {
|
|
|
8
8
|
private readonly logger;
|
|
9
9
|
constructor(dataSource: DataSource, options: AuditModuleOptions);
|
|
10
10
|
onModuleInit(): Promise<void>;
|
|
11
|
+
ensureTable(rawSchema: string): Promise<void>;
|
|
11
12
|
private buildCreateTableSql;
|
|
12
13
|
}
|
|
@@ -42,10 +42,23 @@ let AuditTableInitializer = class AuditTableInitializer {
|
|
|
42
42
|
if (!this.dataSource.isInitialized) {
|
|
43
43
|
await this.dataSource.initialize();
|
|
44
44
|
}
|
|
45
|
-
const
|
|
46
|
-
const
|
|
45
|
+
const primarySchema = this.options.schema ?? 'dbo';
|
|
46
|
+
const schemasToEnsure = [
|
|
47
|
+
primarySchema,
|
|
48
|
+
...(this.options.schemas ?? []).filter((s) => s && s !== primarySchema),
|
|
49
|
+
];
|
|
50
|
+
for (const schema of schemasToEnsure) {
|
|
51
|
+
await this.ensureTable(schema);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async ensureTable(rawSchema) {
|
|
55
|
+
const cleanSchema = rawSchema.replace(/[^a-zA-Z0-9_]/g, '');
|
|
56
|
+
const fullName = `[${cleanSchema}].[${AuditTableInitializer_1.TABLE}]`;
|
|
47
57
|
try {
|
|
48
|
-
|
|
58
|
+
if (!this.dataSource.isInitialized) {
|
|
59
|
+
await this.dataSource.initialize();
|
|
60
|
+
}
|
|
61
|
+
await this.dataSource.query(this.buildCreateTableSql(cleanSchema, fullName));
|
|
49
62
|
this.logger.log(`Ensured auditLog table exists at ${fullName}`);
|
|
50
63
|
}
|
|
51
64
|
catch (error) {
|
|
@@ -56,6 +69,11 @@ let AuditTableInitializer = class AuditTableInitializer {
|
|
|
56
69
|
}
|
|
57
70
|
buildCreateTableSql(schema, fullName) {
|
|
58
71
|
return `
|
|
72
|
+
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = N'${schema}')
|
|
73
|
+
BEGIN
|
|
74
|
+
EXEC('CREATE SCHEMA [${schema}]');
|
|
75
|
+
END;
|
|
76
|
+
|
|
59
77
|
IF NOT EXISTS (
|
|
60
78
|
SELECT 1 FROM sys.objects
|
|
61
79
|
WHERE object_id = OBJECT_ID(N'${fullName}') AND type = 'U'
|
|
@@ -69,7 +87,7 @@ let AuditTableInitializer = class AuditTableInitializer {
|
|
|
69
87
|
changes NVARCHAR(MAX) NULL,
|
|
70
88
|
entityName NVARCHAR(500) NULL,
|
|
71
89
|
changedBy INT NULL,
|
|
72
|
-
changedAt DATETIME2 NOT NULL DEFAULT
|
|
90
|
+
changedAt DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
|
|
73
91
|
INDEX IX_${AuditTableInitializer_1.TABLE}_entityType_entityId (entityType, entityId),
|
|
74
92
|
INDEX IX_${AuditTableInitializer_1.TABLE}_changedBy (changedBy),
|
|
75
93
|
INDEX IX_${AuditTableInitializer_1.TABLE}_action (action),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-table.initializer.js","sourceRoot":"","sources":["../../src/audit-table.initializer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAKwB;AACxB,6CAAmD;AACnD,qCAAqC;AACrC,iDAA+C;AAC/C,uDAAyD;AAgBlD,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;;IAKO;IAEpB;IANX,MAAM,CAAU,KAAK,GAAG,UAAU,CAAC;IAC1B,MAAM,CAAgB;IAEvC,YACuC,UAAsB,EAE1C,OAA2B;QAFP,eAAU,GAAV,UAAU,CAAY;QAE1C,YAAO,GAAP,OAAO,CAAoB;QAE5C,IAAI,CAAC,MAAM,GAAG,IAAA,4BAAa,EAAC,OAAO,EAAE,uBAAqB,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;QAChD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,4FAA4F,UAAU,gDAAgD,CACvJ,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-table.initializer.js","sourceRoot":"","sources":["../../src/audit-table.initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AUDIT_CLS_USER_ID = exports.AUDITABLE_METADATA = exports.AUDIT_MODULE_OPTIONS = void 0;
|
|
3
|
+
exports.AUDIT_CLS_SCHEMA = exports.AUDIT_CLS_USER_ID = exports.AUDITABLE_METADATA = exports.AUDIT_MODULE_OPTIONS = void 0;
|
|
4
4
|
exports.AUDIT_MODULE_OPTIONS = 'AUDIT_MODULE_OPTIONS';
|
|
5
5
|
exports.AUDITABLE_METADATA = 'audit:auditable';
|
|
6
6
|
exports.AUDIT_CLS_USER_ID = 'audit:userId';
|
|
7
|
+
exports.AUDIT_CLS_SCHEMA = 'audit:schema';
|
|
7
8
|
//# sourceMappingURL=audit.constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.constants.js","sourceRoot":"","sources":["../../src/audit.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAG9C,QAAA,kBAAkB,GAAG,iBAAiB,CAAC;AAGvC,QAAA,iBAAiB,GAAG,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"audit.constants.js","sourceRoot":"","sources":["../../src/audit.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAG9C,QAAA,kBAAkB,GAAG,iBAAiB,CAAC;AAGvC,QAAA,iBAAiB,GAAG,cAAc,CAAC;AAGnC,QAAA,gBAAgB,GAAG,cAAc,CAAC"}
|
|
@@ -5,19 +5,24 @@ import { AuditFilterDto } from './dto/audit-filter.dto';
|
|
|
5
5
|
import { AuditLogResponseDto } from './dto/audit-log-response.dto';
|
|
6
6
|
import { PaginatedResultDto } from './dto/paginated-result.dto';
|
|
7
7
|
import { AuditLogInput, AuditModuleOptions } from './interfaces/audit.interfaces';
|
|
8
|
+
import { AuditTableInitializer } from './audit-table.initializer';
|
|
8
9
|
export declare class AuditService {
|
|
9
10
|
private readonly dataSource;
|
|
10
11
|
private readonly options;
|
|
11
12
|
private readonly cls?;
|
|
13
|
+
private readonly tableInitializer?;
|
|
12
14
|
private readonly logger;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
constructor(dataSource: DataSource, options: AuditModuleOptions, cls?: ClsService | undefined, tableInitializer?: AuditTableInitializer | undefined);
|
|
16
|
+
private resolveTableName;
|
|
15
17
|
private currentUserId;
|
|
18
|
+
private currentSchema;
|
|
19
|
+
runInSchema<T>(schemaName: string, fn: () => Promise<T> | T): Promise<T>;
|
|
20
|
+
ensureSchemaTable(schemaName: string): Promise<void>;
|
|
16
21
|
private enrichAuditLog;
|
|
17
|
-
log(input: AuditLogInput): Promise<AuditLog | undefined>;
|
|
18
|
-
logEntity(entity: object, action: AuditActionType, changedBy?: number): Promise<AuditLog | undefined>;
|
|
19
|
-
findByEntity(entityType: string, entityId: number): Promise<AuditLogResponseDto[]>;
|
|
20
|
-
findByUser(userId: number): Promise<AuditLogResponseDto[]>;
|
|
21
|
-
findByAction(action: AuditActionType): Promise<AuditLogResponseDto[]>;
|
|
22
|
-
findAll(filterDto: AuditFilterDto): Promise<PaginatedResultDto<AuditLogResponseDto>>;
|
|
22
|
+
log(input: AuditLogInput, schemaName?: string): Promise<AuditLog | undefined>;
|
|
23
|
+
logEntity(entity: object, action: AuditActionType, changedBy?: number, schemaName?: string): Promise<AuditLog | undefined>;
|
|
24
|
+
findByEntity(entityType: string, entityId: number, schemaName?: string): Promise<AuditLogResponseDto[]>;
|
|
25
|
+
findByUser(userId: number, schemaName?: string): Promise<AuditLogResponseDto[]>;
|
|
26
|
+
findByAction(action: AuditActionType, schemaName?: string): Promise<AuditLogResponseDto[]>;
|
|
27
|
+
findAll(filterDto: AuditFilterDto, schemaName?: string): Promise<PaginatedResultDto<AuditLogResponseDto>>;
|
|
23
28
|
}
|
|
@@ -22,24 +22,49 @@ const audit_helper_1 = require("./audit.helper");
|
|
|
22
22
|
const auditable_decorator_1 = require("./decorators/auditable.decorator");
|
|
23
23
|
const audit_logger_1 = require("./audit.logger");
|
|
24
24
|
const audit_constants_1 = require("./audit.constants");
|
|
25
|
+
const audit_table_initializer_1 = require("./audit-table.initializer");
|
|
25
26
|
const SELECT_COLUMNS = 'id, entityType, entityId, action, changes, entityName, changedBy, changedAt';
|
|
26
27
|
let AuditService = AuditService_1 = class AuditService {
|
|
27
28
|
dataSource;
|
|
28
29
|
options;
|
|
29
30
|
cls;
|
|
31
|
+
tableInitializer;
|
|
30
32
|
logger;
|
|
31
|
-
|
|
32
|
-
constructor(dataSource, options, cls) {
|
|
33
|
+
constructor(dataSource, options, cls, tableInitializer) {
|
|
33
34
|
this.dataSource = dataSource;
|
|
34
35
|
this.options = options;
|
|
35
36
|
this.cls = cls;
|
|
36
|
-
|
|
37
|
-
this.tableName = `[${schema}].[auditLog]`;
|
|
37
|
+
this.tableInitializer = tableInitializer;
|
|
38
38
|
this.logger = (0, audit_logger_1.resolveLogger)(options, AuditService_1.name);
|
|
39
39
|
}
|
|
40
|
+
resolveTableName(overrideSchema) {
|
|
41
|
+
const rawSchema = overrideSchema?.trim() ||
|
|
42
|
+
this.currentSchema() ||
|
|
43
|
+
this.options.schema ||
|
|
44
|
+
'dbo';
|
|
45
|
+
const cleanSchema = rawSchema.replace(/[^a-zA-Z0-9_]/g, '');
|
|
46
|
+
return `[${cleanSchema}].[auditLog]`;
|
|
47
|
+
}
|
|
40
48
|
currentUserId() {
|
|
41
49
|
return this.cls?.get(audit_constants_1.AUDIT_CLS_USER_ID);
|
|
42
50
|
}
|
|
51
|
+
currentSchema() {
|
|
52
|
+
return this.cls?.get(audit_constants_1.AUDIT_CLS_SCHEMA);
|
|
53
|
+
}
|
|
54
|
+
async runInSchema(schemaName, fn) {
|
|
55
|
+
if (this.cls) {
|
|
56
|
+
return this.cls.run(async () => {
|
|
57
|
+
this.cls.set(audit_constants_1.AUDIT_CLS_SCHEMA, schemaName.trim());
|
|
58
|
+
return fn();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return fn();
|
|
62
|
+
}
|
|
63
|
+
async ensureSchemaTable(schemaName) {
|
|
64
|
+
if (this.tableInitializer) {
|
|
65
|
+
await this.tableInitializer.ensureTable(schemaName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
43
68
|
async enrichAuditLog(row) {
|
|
44
69
|
const response = {
|
|
45
70
|
...row,
|
|
@@ -60,12 +85,13 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
60
85
|
}
|
|
61
86
|
return response;
|
|
62
87
|
}
|
|
63
|
-
async log(input) {
|
|
88
|
+
async log(input, schemaName) {
|
|
64
89
|
try {
|
|
90
|
+
const tableName = this.resolveTableName(input.schemaName ?? schemaName);
|
|
65
91
|
const changedBy = input.changedBy ?? this.currentUserId();
|
|
66
92
|
const changes = input.changes ? JSON.stringify(input.changes) : null;
|
|
67
93
|
const sql = `
|
|
68
|
-
INSERT INTO ${
|
|
94
|
+
INSERT INTO ${tableName} (entityType, entityId, action, changes, entityName, changedBy)
|
|
69
95
|
OUTPUT INSERTED.${SELECT_COLUMNS.split(', ').join(', INSERTED.')}
|
|
70
96
|
VALUES (@0, @1, @2, @3, @4, @5)
|
|
71
97
|
`;
|
|
@@ -78,7 +104,7 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
78
104
|
changedBy ?? null,
|
|
79
105
|
]);
|
|
80
106
|
const saved = rows[0];
|
|
81
|
-
this.logger.log(`Audit: ${saved.entityType} ${saved.action} id=${saved.entityId} (log #${saved.id})`);
|
|
107
|
+
this.logger.log(`Audit: ${saved.entityType} ${saved.action} id=${saved.entityId} (log #${saved.id}) in ${tableName}`);
|
|
82
108
|
return saved;
|
|
83
109
|
}
|
|
84
110
|
catch (error) {
|
|
@@ -86,7 +112,7 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
86
112
|
return undefined;
|
|
87
113
|
}
|
|
88
114
|
}
|
|
89
|
-
async logEntity(entity, action, changedBy) {
|
|
115
|
+
async logEntity(entity, action, changedBy, schemaName) {
|
|
90
116
|
const auditable = (0, auditable_decorator_1.getAuditableOptions)(entity);
|
|
91
117
|
if (!auditable) {
|
|
92
118
|
this.logger.warn(`logEntity called for a non-@Auditable entity: ${entity?.constructor?.name}`);
|
|
@@ -103,13 +129,15 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
103
129
|
action,
|
|
104
130
|
changes: (0, audit_helper_1.extractAuditableFields)(entity, auditable.exclude),
|
|
105
131
|
changedBy,
|
|
106
|
-
|
|
132
|
+
schemaName,
|
|
133
|
+
}, schemaName);
|
|
107
134
|
}
|
|
108
|
-
async findByEntity(entityType, entityId) {
|
|
135
|
+
async findByEntity(entityType, entityId, schemaName) {
|
|
109
136
|
try {
|
|
137
|
+
const tableName = this.resolveTableName(schemaName);
|
|
110
138
|
const sql = `
|
|
111
139
|
SELECT ${SELECT_COLUMNS}
|
|
112
|
-
FROM ${
|
|
140
|
+
FROM ${tableName}
|
|
113
141
|
WHERE entityType = @0 AND entityId = @1
|
|
114
142
|
ORDER BY changedAt DESC, id DESC
|
|
115
143
|
`;
|
|
@@ -124,11 +152,12 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
124
152
|
throw new common_1.InternalServerErrorException('Failed to fetch audit logs');
|
|
125
153
|
}
|
|
126
154
|
}
|
|
127
|
-
async findByUser(userId) {
|
|
155
|
+
async findByUser(userId, schemaName) {
|
|
128
156
|
try {
|
|
157
|
+
const tableName = this.resolveTableName(schemaName);
|
|
129
158
|
const sql = `
|
|
130
159
|
SELECT ${SELECT_COLUMNS}
|
|
131
|
-
FROM ${
|
|
160
|
+
FROM ${tableName}
|
|
132
161
|
WHERE changedBy = @0
|
|
133
162
|
ORDER BY changedAt DESC, id DESC
|
|
134
163
|
`;
|
|
@@ -140,11 +169,12 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
140
169
|
throw new common_1.InternalServerErrorException('Failed to fetch audit logs');
|
|
141
170
|
}
|
|
142
171
|
}
|
|
143
|
-
async findByAction(action) {
|
|
172
|
+
async findByAction(action, schemaName) {
|
|
144
173
|
try {
|
|
174
|
+
const tableName = this.resolveTableName(schemaName);
|
|
145
175
|
const sql = `
|
|
146
176
|
SELECT ${SELECT_COLUMNS}
|
|
147
|
-
FROM ${
|
|
177
|
+
FROM ${tableName}
|
|
148
178
|
WHERE action = @0
|
|
149
179
|
ORDER BY changedAt DESC, id DESC
|
|
150
180
|
`;
|
|
@@ -156,8 +186,9 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
156
186
|
throw new common_1.InternalServerErrorException('Failed to fetch audit logs');
|
|
157
187
|
}
|
|
158
188
|
}
|
|
159
|
-
async findAll(filterDto) {
|
|
189
|
+
async findAll(filterDto, schemaName) {
|
|
160
190
|
try {
|
|
191
|
+
const tableName = this.resolveTableName(filterDto.schemaName ?? schemaName);
|
|
161
192
|
const { page: rawPage = 0, limit: rawLimit = 10, entityType, entityId, changedBy, action, search, } = filterDto;
|
|
162
193
|
const page = Math.floor(Number(rawPage));
|
|
163
194
|
const limit = Math.max(1, Math.floor(Number(rawLimit)));
|
|
@@ -187,14 +218,14 @@ let AuditService = AuditService_1 = class AuditService {
|
|
|
187
218
|
const where = conditions.length
|
|
188
219
|
? `WHERE ${conditions.join(' AND ')}`
|
|
189
220
|
: '';
|
|
190
|
-
const countRows = await this.dataSource.query(`SELECT COUNT(*) AS total FROM ${
|
|
221
|
+
const countRows = await this.dataSource.query(`SELECT COUNT(*) AS total FROM ${tableName} ${where}`, params);
|
|
191
222
|
const total = Number(countRows[0]?.total ?? 0);
|
|
192
223
|
const offset = page * limit;
|
|
193
224
|
const offsetIdx = params.length;
|
|
194
225
|
const limitIdx = params.length + 1;
|
|
195
226
|
const dataSql = `
|
|
196
227
|
SELECT ${SELECT_COLUMNS}
|
|
197
|
-
FROM ${
|
|
228
|
+
FROM ${tableName}
|
|
198
229
|
${where}
|
|
199
230
|
ORDER BY changedAt DESC, id DESC
|
|
200
231
|
OFFSET @${offsetIdx} ROWS FETCH NEXT @${limitIdx} ROWS ONLY
|
|
@@ -228,6 +259,8 @@ exports.AuditService = AuditService = AuditService_1 = __decorate([
|
|
|
228
259
|
__param(0, (0, typeorm_1.InjectDataSource)()),
|
|
229
260
|
__param(1, (0, common_1.Inject)(audit_constants_1.AUDIT_MODULE_OPTIONS)),
|
|
230
261
|
__param(2, (0, common_1.Optional)()),
|
|
231
|
-
|
|
262
|
+
__param(3, (0, common_1.Optional)()),
|
|
263
|
+
__metadata("design:paramtypes", [typeorm_2.DataSource, Object, nestjs_cls_1.ClsService,
|
|
264
|
+
audit_table_initializer_1.AuditTableInitializer])
|
|
232
265
|
], AuditService);
|
|
233
266
|
//# sourceMappingURL=audit.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.service.js","sourceRoot":"","sources":["../../src/audit.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,6CAAmD;AACnD,qCAAqC;AACrC,2CAAwC;AAKxC,iDAAwD;AACxD,0EAAuE;AACvE,iDAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"audit.service.js","sourceRoot":"","sources":["../../src/audit.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,11 @@ import { DataSource, EntitySubscriberInterface, InsertEvent, RemoveEvent, SoftRe
|
|
|
2
2
|
import { ClsService } from 'nestjs-cls';
|
|
3
3
|
import { AuditModuleOptions } from './interfaces/audit.interfaces';
|
|
4
4
|
export declare class AuditSubscriber implements EntitySubscriberInterface {
|
|
5
|
+
private readonly options;
|
|
5
6
|
private readonly cls;
|
|
6
7
|
private readonly logger;
|
|
7
|
-
private readonly tableName;
|
|
8
8
|
constructor(dataSource: DataSource, options: AuditModuleOptions, cls: ClsService);
|
|
9
|
+
private resolveTableName;
|
|
9
10
|
private currentUserId;
|
|
10
11
|
afterInsert(event: InsertEvent<object>): Promise<void>;
|
|
11
12
|
afterUpdate(event: UpdateEvent<object>): Promise<void>;
|
|
@@ -24,16 +24,23 @@ const auditable_decorator_1 = require("./decorators/auditable.decorator");
|
|
|
24
24
|
const audit_logger_1 = require("./audit.logger");
|
|
25
25
|
const audit_constants_1 = require("./audit.constants");
|
|
26
26
|
let AuditSubscriber = AuditSubscriber_1 = class AuditSubscriber {
|
|
27
|
+
options;
|
|
27
28
|
cls;
|
|
28
29
|
logger;
|
|
29
|
-
tableName;
|
|
30
30
|
constructor(dataSource, options, cls) {
|
|
31
|
+
this.options = options;
|
|
31
32
|
this.cls = cls;
|
|
32
|
-
const schema = options.schema ?? 'dbo';
|
|
33
|
-
this.tableName = `[${schema}].[auditLog]`;
|
|
34
33
|
this.logger = (0, audit_logger_1.resolveLogger)(options, AuditSubscriber_1.name);
|
|
35
34
|
dataSource.subscribers.push(this);
|
|
36
35
|
}
|
|
36
|
+
resolveTableName(eventSchema) {
|
|
37
|
+
const rawSchema = eventSchema ||
|
|
38
|
+
this.cls?.get(audit_constants_1.AUDIT_CLS_SCHEMA) ||
|
|
39
|
+
this.options.schema ||
|
|
40
|
+
'dbo';
|
|
41
|
+
const cleanSchema = rawSchema.replace(/[^a-zA-Z0-9_]/g, '');
|
|
42
|
+
return `[${cleanSchema}].[auditLog]`;
|
|
43
|
+
}
|
|
37
44
|
currentUserId() {
|
|
38
45
|
return this.cls?.get(audit_constants_1.AUDIT_CLS_USER_ID);
|
|
39
46
|
}
|
|
@@ -55,7 +62,7 @@ let AuditSubscriber = AuditSubscriber_1 = class AuditSubscriber {
|
|
|
55
62
|
: undefined,
|
|
56
63
|
action: audit_log_entity_1.AuditActionType.CREATE,
|
|
57
64
|
changes: (0, audit_helper_1.extractAuditableFields)(entity, auditable.exclude),
|
|
58
|
-
});
|
|
65
|
+
}, event.metadata?.schema);
|
|
59
66
|
this.logger.log(`Recorded CREATE audit for ${auditable.entityType} ${record.id}`);
|
|
60
67
|
}
|
|
61
68
|
async afterUpdate(event) {
|
|
@@ -84,7 +91,7 @@ let AuditSubscriber = AuditSubscriber_1 = class AuditSubscriber {
|
|
|
84
91
|
: undefined,
|
|
85
92
|
action: audit_log_entity_1.AuditActionType.UPDATE,
|
|
86
93
|
changes,
|
|
87
|
-
});
|
|
94
|
+
}, event.metadata?.schema);
|
|
88
95
|
this.logger.log(`Recorded UPDATE audit for ${auditable.entityType} ${record.id}`);
|
|
89
96
|
}
|
|
90
97
|
async afterRemove(event) {
|
|
@@ -112,13 +119,14 @@ let AuditSubscriber = AuditSubscriber_1 = class AuditSubscriber {
|
|
|
112
119
|
: undefined,
|
|
113
120
|
action: audit_log_entity_1.AuditActionType.DELETE,
|
|
114
121
|
changes: (0, audit_helper_1.extractAuditableFields)(source, auditable.exclude),
|
|
115
|
-
});
|
|
122
|
+
}, event.metadata?.schema);
|
|
116
123
|
this.logger.log(`Recorded DELETE audit for ${auditable.entityType} ${entityId}`);
|
|
117
124
|
}
|
|
118
|
-
async persist(manager, input) {
|
|
125
|
+
async persist(manager, input, eventSchema) {
|
|
119
126
|
try {
|
|
127
|
+
const tableName = this.resolveTableName(eventSchema);
|
|
120
128
|
const sql = `
|
|
121
|
-
INSERT INTO ${
|
|
129
|
+
INSERT INTO ${tableName} (entityType, entityId, action, changes, entityName, changedBy)
|
|
122
130
|
VALUES (@0, @1, @2, @3, @4, @5)
|
|
123
131
|
`;
|
|
124
132
|
await manager.query(sql, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.subscriber.js","sourceRoot":"","sources":["../../src/audit.subscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAmE;AACnE,6CAAmD;AACnD,qCAQiB;AACjB,2CAAwC;AACxC,kEAAwE;AACxE,iDAA0E;AAC1E,0EAAuE;AACvE,iDAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"audit.subscriber.js","sourceRoot":"","sources":["../../src/audit.subscriber.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ class AuditFilterDto {
|
|
|
22
22
|
changedBy;
|
|
23
23
|
action;
|
|
24
24
|
search;
|
|
25
|
+
schemaName;
|
|
25
26
|
}
|
|
26
27
|
exports.AuditFilterDto = AuditFilterDto;
|
|
27
28
|
__decorate([
|
|
@@ -98,4 +99,13 @@ __decorate([
|
|
|
98
99
|
(0, class_validator_1.IsString)(),
|
|
99
100
|
__metadata("design:type", String)
|
|
100
101
|
], AuditFilterDto.prototype, "search", void 0);
|
|
102
|
+
__decorate([
|
|
103
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
104
|
+
description: 'Tenant or database schema where audit logs are stored',
|
|
105
|
+
example: 'org_varun',
|
|
106
|
+
}),
|
|
107
|
+
(0, class_validator_1.IsOptional)(),
|
|
108
|
+
(0, class_validator_1.IsString)(),
|
|
109
|
+
__metadata("design:type", String)
|
|
110
|
+
], AuditFilterDto.prototype, "schemaName", void 0);
|
|
101
111
|
//# sourceMappingURL=audit-filter.dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-filter.dto.js","sourceRoot":"","sources":["../../../src/dto/audit-filter.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAsD;AACtD,yDAAyC;AACzC,qDAA2E;AAC3E,mEAA+D;AAE/D,MAAa,cAAc;IAUzB,IAAI,GAAY,CAAC,CAAC;IAWlB,KAAK,GAAY,EAAE,CAAC;IAQpB,UAAU,CAAU;IAUpB,QAAQ,CAAU;IAUlB,SAAS,CAAU;IASnB,MAAM,CAAmB;IAQzB,MAAM,CAAU;
|
|
1
|
+
{"version":3,"file":"audit-filter.dto.js","sourceRoot":"","sources":["../../../src/dto/audit-filter.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAsD;AACtD,yDAAyC;AACzC,qDAA2E;AAC3E,mEAA+D;AAE/D,MAAa,cAAc;IAUzB,IAAI,GAAY,CAAC,CAAC;IAWlB,KAAK,GAAY,EAAE,CAAC;IAQpB,UAAU,CAAU;IAUpB,QAAQ,CAAU;IAUlB,SAAS,CAAU;IASnB,MAAM,CAAmB;IAQzB,MAAM,CAAU;IAQhB,UAAU,CAAU;CACrB;AA3ED,wCA2EC;AAjEC;IATC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;4CACW;AAWlB;IATC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;6CACa;AAQpB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,SAAS;KACnB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;kDACS;AAUpB;IARC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;gDACW;AAUlB;IARC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;iDACY;AASnB;IAPC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,kCAAe;KACtB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,kCAAe,CAAC;;8CACC;AAQzB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,qDAAqD;QAClE,OAAO,EAAE,SAAS;KACnB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;8CACK;AAQhB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,uDAAuD;QACpE,OAAO,EAAE,WAAW;KACrB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;kDACS"}
|
|
@@ -92,7 +92,7 @@ __decorate([
|
|
|
92
92
|
description: 'Timestamp of the change',
|
|
93
93
|
example: '2024-01-01T00:00:00Z',
|
|
94
94
|
}),
|
|
95
|
-
(0, typeorm_1.Column)({ type: 'datetime2', default: () => '
|
|
95
|
+
(0, typeorm_1.Column)({ type: 'datetime2', default: () => 'SYSUTCDATETIME()' }),
|
|
96
96
|
__metadata("design:type", Date)
|
|
97
97
|
], AuditLog.prototype, "changedAt", void 0);
|
|
98
98
|
exports.AuditLog = AuditLog = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-log.entity.js","sourceRoot":"","sources":["../../../src/entities/audit-log.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAiE;AACjE,6CAA8C;AAE9C,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;AACnB,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAGM,IAAM,QAAQ,GAAd,MAAM,QAAQ;IAGnB,EAAE,CAAS;IAIX,UAAU,CAAS;IAOnB,QAAQ,CAAS;IAYjB,MAAM,CAAkB;IAQxB,OAAO,CAAU;IASjB,UAAU,CAAU;IAQpB,SAAS,CAAU;IAOnB,SAAS,CAAO;CACjB,CAAA;AA3DY,4BAAQ;AAGnB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACxD,IAAA,gCAAsB,GAAE;;oCACd;AAIX;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC7E,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACvB;AAOnB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;0CACP;AAYjB;IAVC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,eAAe;KACtB,CAAC;IACD,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,eAAe,CAAC,MAAM;KAChC,CAAC;;wCACsB;AAQxB;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,4CAA4C;QACrD,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCAC3C;AASjB;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,+EAA+E;QACjF,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACtC;AAQpB;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACrB;AAOnB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,sBAAsB;KAChC,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"audit-log.entity.js","sourceRoot":"","sources":["../../../src/entities/audit-log.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAiE;AACjE,6CAA8C;AAE9C,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;AACnB,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAGM,IAAM,QAAQ,GAAd,MAAM,QAAQ;IAGnB,EAAE,CAAS;IAIX,UAAU,CAAS;IAOnB,QAAQ,CAAS;IAYjB,MAAM,CAAkB;IAQxB,OAAO,CAAU;IASjB,UAAU,CAAU;IAQpB,SAAS,CAAU;IAOnB,SAAS,CAAO;CACjB,CAAA;AA3DY,4BAAQ;AAGnB;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACxD,IAAA,gCAAsB,GAAE;;oCACd;AAIX;IAFC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC7E,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACvB;AAOnB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;0CACP;AAYjB;IAVC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,eAAe;KACtB,CAAC;IACD,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,eAAe,CAAC,MAAM;KAChC,CAAC;;wCACsB;AAQxB;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,4CAA4C;QACrD,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCAC3C;AASjB;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,+EAA+E;QACjF,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACtC;AAQpB;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI;KACf,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACrB;AAOnB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,sBAAsB;KAChC,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC;8BACtD,IAAI;2CAAC;mBA1DL,QAAQ;IADpB,IAAA,gBAAM,EAAC,UAAU,CAAC;GACN,QAAQ,CA2DpB"}
|