@nest-util/nest-crud 1.1.5 → 1.2.2

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 (30) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -0
  4. package/dist/lib/controllers/nest-crud.controller.d.ts +9 -0
  5. package/dist/lib/controllers/nest-crud.controller.d.ts.map +1 -1
  6. package/dist/lib/controllers/nest-crud.controller.js +92 -0
  7. package/dist/lib/dtos/request-modification.dto.d.ts +11 -0
  8. package/dist/lib/dtos/request-modification.dto.d.ts.map +1 -0
  9. package/dist/lib/dtos/request-modification.dto.js +57 -0
  10. package/dist/lib/entities/approval-status.entity.d.ts +29 -0
  11. package/dist/lib/entities/approval-status.entity.d.ts.map +1 -0
  12. package/dist/lib/entities/approval-status.entity.js +72 -0
  13. package/dist/lib/entities/modification-request-history.entity.d.ts +20 -0
  14. package/dist/lib/entities/modification-request-history.entity.d.ts.map +1 -0
  15. package/dist/lib/entities/modification-request-history.entity.js +48 -0
  16. package/dist/lib/interfaces/approval-pipeline.interface.d.ts +90 -0
  17. package/dist/lib/interfaces/approval-pipeline.interface.d.ts.map +1 -0
  18. package/dist/lib/interfaces/approval-pipeline.interface.js +20 -0
  19. package/dist/lib/interfaces/crud.interface.d.ts +10 -1
  20. package/dist/lib/interfaces/crud.interface.d.ts.map +1 -1
  21. package/dist/lib/nest-crud.module.d.ts.map +1 -1
  22. package/dist/lib/nest-crud.module.js +9 -1
  23. package/dist/lib/services/nest-crud.service.d.ts +25 -0
  24. package/dist/lib/services/nest-crud.service.d.ts.map +1 -1
  25. package/dist/lib/services/nest-crud.service.js +214 -1
  26. package/dist/lib/testing/mock-repository.d.ts.map +1 -1
  27. package/dist/lib/testing/mock-repository.js +2 -0
  28. package/dist/lib/testing/testing.interface.d.ts +1 -0
  29. package/dist/lib/testing/testing.interface.d.ts.map +1 -1
  30. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from './lib/dtos/pagination.dto';
6
6
  export * from './lib/dtos/cursor-pagination.dto';
7
7
  export * from './lib/dtos/list-audit-logs.dto';
8
8
  export * from './lib/dtos/status-change.dto';
9
+ export * from './lib/dtos/request-modification.dto';
9
10
  export * from './lib/decorators/response-message.decorator';
10
11
  export * from './lib/decorators/audit-log.decorator';
11
12
  export * from './lib/interceptors/response.interceptor';
@@ -15,10 +16,13 @@ export * from './lib/interfaces/cursor-strategy.interface';
15
16
  export * from './lib/interfaces/hooks.interface';
16
17
  export * from './lib/interfaces/find-mine.interface';
17
18
  export * from './lib/interfaces/status-pipeline.interface';
19
+ export * from './lib/interfaces/approval-pipeline.interface';
18
20
  export * from './lib/interfaces/audit-log.interface';
19
21
  export * from './lib/helpers/exception-filter.helper';
20
22
  export * from './lib/helpers/cursor-pagination.helper';
21
23
  export * from './lib/entities/audit-log.entity';
24
+ export * from './lib/entities/approval-status.entity';
25
+ export * from './lib/entities/modification-request-history.entity';
22
26
  export * from './lib/services/audit-log.service';
23
27
  export * from './lib/events';
24
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oDAAoD,CAAC;AACnE,cAAc,kCAAkC,CAAC;AACjD,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ tslib_1.__exportStar(require("./lib/dtos/pagination.dto"), exports);
9
9
  tslib_1.__exportStar(require("./lib/dtos/cursor-pagination.dto"), exports);
10
10
  tslib_1.__exportStar(require("./lib/dtos/list-audit-logs.dto"), exports);
11
11
  tslib_1.__exportStar(require("./lib/dtos/status-change.dto"), exports);
12
+ tslib_1.__exportStar(require("./lib/dtos/request-modification.dto"), exports);
12
13
  tslib_1.__exportStar(require("./lib/decorators/response-message.decorator"), exports);
13
14
  tslib_1.__exportStar(require("./lib/decorators/audit-log.decorator"), exports);
14
15
  tslib_1.__exportStar(require("./lib/interceptors/response.interceptor"), exports);
@@ -18,9 +19,12 @@ tslib_1.__exportStar(require("./lib/interfaces/cursor-strategy.interface"), expo
18
19
  tslib_1.__exportStar(require("./lib/interfaces/hooks.interface"), exports);
19
20
  tslib_1.__exportStar(require("./lib/interfaces/find-mine.interface"), exports);
20
21
  tslib_1.__exportStar(require("./lib/interfaces/status-pipeline.interface"), exports);
22
+ tslib_1.__exportStar(require("./lib/interfaces/approval-pipeline.interface"), exports);
21
23
  tslib_1.__exportStar(require("./lib/interfaces/audit-log.interface"), exports);
22
24
  tslib_1.__exportStar(require("./lib/helpers/exception-filter.helper"), exports);
23
25
  tslib_1.__exportStar(require("./lib/helpers/cursor-pagination.helper"), exports);
24
26
  tslib_1.__exportStar(require("./lib/entities/audit-log.entity"), exports);
27
+ tslib_1.__exportStar(require("./lib/entities/approval-status.entity"), exports);
28
+ tslib_1.__exportStar(require("./lib/entities/modification-request-history.entity"), exports);
25
29
  tslib_1.__exportStar(require("./lib/services/audit-log.service"), exports);
26
30
  tslib_1.__exportStar(require("./lib/events"), exports);
@@ -5,6 +5,7 @@ import { FilterDto } from '../dtos/filter.dto';
5
5
  import { ListAuditLogsDto } from '../dtos/list-audit-logs.dto';
6
6
  import { StatusChangeDto } from '../dtos/status-change.dto';
7
7
  import type { OwnershipUser } from '../interfaces/find-mine.interface';
8
+ import type { ApprovalHistoryView, ApprovalStatusView, RequestModificationPayload } from '../interfaces/approval-pipeline.interface';
8
9
  export declare const AUTH_PERMISSIONS_METADATA_KEY = "auth:permissions";
9
10
  export type CrudEndpointPermissions = string | readonly string[];
10
11
  export type CrudPermissionsMap = Partial<Record<CrudEndpoint, CrudEndpointPermissions>>;
@@ -24,6 +25,14 @@ export interface IBaseController<CD, UD, RD> {
24
25
  changeStatus?(id: number, dto: StatusChangeDto, user?: OwnershipUser): Promise<RD>;
25
26
  remove(id: number, user?: OwnershipUser): Promise<boolean>;
26
27
  findAuditLogs?(query: ListAuditLogsDto): Promise<unknown>;
28
+ getApproval?(id: number, user?: OwnershipUser): Promise<{
29
+ approval: ApprovalStatusView;
30
+ history: ApprovalHistoryView[];
31
+ }>;
32
+ approveApproval?(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
33
+ rejectApproval?(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
34
+ requestModification?(id: number, dto: RequestModificationPayload, user?: OwnershipUser): Promise<ApprovalStatusView>;
35
+ resubmitApproval?(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
27
36
  }
28
37
  export declare function CreateNestedCrudController<CD, UD, RD>(createDto: Type<CD>, updateDto: Type<UD>, responseDto: Type<RD>, options?: CrudControllerFactoryOptions): Type<IBaseController<CD, UD, RD>>;
29
38
  //# sourceMappingURL=nest-crud.controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nest-crud.controller.d.ts","sourceRoot":"","sources":["../../../src/lib/controllers/nest-crud.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,IAAI,EACL,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACtC,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAC9C,CAAC;AAEF,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IACzC,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,CACL,KAAK,EAAE,aAAa,GAAG,SAAS,GAC/B,OAAO,CAAC;QAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/D,YAAY,CAAC,CACX,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,eAAe,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,aAAa,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAyDD,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EACnD,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EACnB,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EACnB,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,EACrB,OAAO,CAAC,EAAE,4BAA4B,GACrC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CA2JnC"}
1
+ {"version":3,"file":"nest-crud.controller.d.ts","sourceRoot":"","sources":["../../../src/lib/controllers/nest-crud.controller.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ const response_message_decorator_1 = require("../decorators/response-message.dec
9
9
  const audit_log_decorator_1 = require("../decorators/audit-log.decorator");
10
10
  const list_audit_logs_dto_1 = require("../dtos/list-audit-logs.dto");
11
11
  const status_change_dto_1 = require("../dtos/status-change.dto");
12
+ const request_modification_dto_1 = require("../dtos/request-modification.dto");
12
13
  const nest_auth_1 = require("@nest-util/nest-auth");
13
14
  exports.AUTH_PERMISSIONS_METADATA_KEY = 'auth:permissions';
14
15
  const toPermissionList = (permissionValue) => {
@@ -84,6 +85,41 @@ function CreateNestedCrudController(createDto, updateDto, responseDto, options)
84
85
  }
85
86
  return this.service.changeStatus(id, dto.status, user);
86
87
  }
88
+ getApproval(id, user) {
89
+ this.ensureEndpointEnabled('getApproval');
90
+ if (!this.service.getApproval) {
91
+ throw new common_1.NotFoundException('Resource not found');
92
+ }
93
+ return this.service.getApproval(id, user);
94
+ }
95
+ approveApproval(id, user) {
96
+ this.ensureEndpointEnabled('approveApproval');
97
+ if (!this.service.approveApproval) {
98
+ throw new common_1.NotFoundException('Resource not found');
99
+ }
100
+ return this.service.approveApproval(id, user);
101
+ }
102
+ rejectApproval(id, user) {
103
+ this.ensureEndpointEnabled('rejectApproval');
104
+ if (!this.service.rejectApproval) {
105
+ throw new common_1.NotFoundException('Resource not found');
106
+ }
107
+ return this.service.rejectApproval(id, user);
108
+ }
109
+ requestModification(id, dto, user) {
110
+ this.ensureEndpointEnabled('requestModification');
111
+ if (!this.service.requestModification) {
112
+ throw new common_1.NotFoundException('Resource not found');
113
+ }
114
+ return this.service.requestModification(id, dto, user);
115
+ }
116
+ resubmitApproval(id, user) {
117
+ this.ensureEndpointEnabled('resubmitApproval');
118
+ if (!this.service.resubmitApproval) {
119
+ throw new common_1.NotFoundException('Resource not found');
120
+ }
121
+ return this.service.resubmitApproval(id, user);
122
+ }
87
123
  remove(id, user) {
88
124
  this.ensureEndpointEnabled('remove');
89
125
  return this.service.remove(id, user);
@@ -187,6 +223,62 @@ function CreateNestedCrudController(createDto, updateDto, responseDto, options)
187
223
  tslib_1.__metadata("design:paramtypes", [Number, status_change_dto_1.StatusChangeDto, Object]),
188
224
  tslib_1.__metadata("design:returntype", void 0)
189
225
  ], BaseController.prototype, "changeStatus", null);
226
+ tslib_1.__decorate([
227
+ (0, common_1.Get)(':id/approval'),
228
+ (0, response_message_decorator_1.Message)('fetched approval'),
229
+ (0, swagger_1.ApiResponse)({ description: 'Approval status and modification history' }),
230
+ tslib_1.__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
231
+ tslib_1.__param(1, (0, nest_auth_1.CurrentUser)()),
232
+ tslib_1.__metadata("design:type", Function),
233
+ tslib_1.__metadata("design:paramtypes", [Number, Object]),
234
+ tslib_1.__metadata("design:returntype", void 0)
235
+ ], BaseController.prototype, "getApproval", null);
236
+ tslib_1.__decorate([
237
+ (0, common_1.Post)(':id/approval/approve'),
238
+ (0, response_message_decorator_1.Message)('approved'),
239
+ (0, audit_log_decorator_1.Audit)({ action: 'APPROVE' }),
240
+ (0, swagger_1.ApiResponse)({ description: 'The updated approval status' }),
241
+ tslib_1.__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
242
+ tslib_1.__param(1, (0, nest_auth_1.CurrentUser)()),
243
+ tslib_1.__metadata("design:type", Function),
244
+ tslib_1.__metadata("design:paramtypes", [Number, Object]),
245
+ tslib_1.__metadata("design:returntype", void 0)
246
+ ], BaseController.prototype, "approveApproval", null);
247
+ tslib_1.__decorate([
248
+ (0, common_1.Post)(':id/approval/reject'),
249
+ (0, response_message_decorator_1.Message)('rejected'),
250
+ (0, audit_log_decorator_1.Audit)({ action: 'REJECT' }),
251
+ (0, swagger_1.ApiResponse)({ description: 'The updated approval status' }),
252
+ tslib_1.__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
253
+ tslib_1.__param(1, (0, nest_auth_1.CurrentUser)()),
254
+ tslib_1.__metadata("design:type", Function),
255
+ tslib_1.__metadata("design:paramtypes", [Number, Object]),
256
+ tslib_1.__metadata("design:returntype", void 0)
257
+ ], BaseController.prototype, "rejectApproval", null);
258
+ tslib_1.__decorate([
259
+ (0, common_1.Post)(':id/approval/request-modification'),
260
+ (0, response_message_decorator_1.Message)('modification requested'),
261
+ (0, audit_log_decorator_1.Audit)({ action: 'REQUEST_MODIFICATION' }),
262
+ (0, swagger_1.ApiBody)({ type: request_modification_dto_1.RequestModificationDto }),
263
+ (0, swagger_1.ApiResponse)({ description: 'The updated approval status' }),
264
+ tslib_1.__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
265
+ tslib_1.__param(1, (0, common_1.Body)()),
266
+ tslib_1.__param(2, (0, nest_auth_1.CurrentUser)()),
267
+ tslib_1.__metadata("design:type", Function),
268
+ tslib_1.__metadata("design:paramtypes", [Number, request_modification_dto_1.RequestModificationDto, Object]),
269
+ tslib_1.__metadata("design:returntype", void 0)
270
+ ], BaseController.prototype, "requestModification", null);
271
+ tslib_1.__decorate([
272
+ (0, common_1.Post)(':id/approval/resubmit'),
273
+ (0, response_message_decorator_1.Message)('resubmitted'),
274
+ (0, audit_log_decorator_1.Audit)({ action: 'RESUBMIT' }),
275
+ (0, swagger_1.ApiResponse)({ description: 'The updated approval status' }),
276
+ tslib_1.__param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)),
277
+ tslib_1.__param(1, (0, nest_auth_1.CurrentUser)()),
278
+ tslib_1.__metadata("design:type", Function),
279
+ tslib_1.__metadata("design:paramtypes", [Number, Object]),
280
+ tslib_1.__metadata("design:returntype", void 0)
281
+ ], BaseController.prototype, "resubmitApproval", null);
190
282
  tslib_1.__decorate([
191
283
  (0, common_1.Delete)(':id'),
192
284
  (0, response_message_decorator_1.Message)('deleted'),
@@ -0,0 +1,11 @@
1
+ export declare class ModificationItemDto {
2
+ field: string;
3
+ currentValue?: unknown;
4
+ wantedValue: unknown;
5
+ note?: string;
6
+ }
7
+ export declare class RequestModificationDto {
8
+ modifications: ModificationItemDto[];
9
+ note?: string;
10
+ }
11
+ //# sourceMappingURL=request-modification.dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-modification.dto.d.ts","sourceRoot":"","sources":["../../../src/lib/dtos/request-modification.dto.ts"],"names":[],"mappings":"AAWA,qBAAa,mBAAmB;IAG9B,KAAK,EAAG,MAAM,CAAC;IAOf,YAAY,CAAC,EAAE,OAAO,CAAC;IAIvB,WAAW,EAAG,OAAO,CAAC;IAKtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,sBAAsB;IASjC,aAAa,EAAG,mBAAmB,EAAE,CAAC;IAQtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RequestModificationDto = exports.ModificationItemDto = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const swagger_1 = require("@nestjs/swagger");
6
+ const class_validator_1 = require("class-validator");
7
+ const class_transformer_1 = require("class-transformer");
8
+ class ModificationItemDto {
9
+ }
10
+ exports.ModificationItemDto = ModificationItemDto;
11
+ tslib_1.__decorate([
12
+ (0, swagger_1.ApiProperty)({ description: 'Entity field to modify, e.g. "title"' }),
13
+ (0, class_validator_1.IsString)(),
14
+ tslib_1.__metadata("design:type", String)
15
+ ], ModificationItemDto.prototype, "field", void 0);
16
+ tslib_1.__decorate([
17
+ (0, swagger_1.ApiProperty)({
18
+ description: 'Value currently stored on the record (captured at request time)',
19
+ required: false,
20
+ }),
21
+ (0, class_validator_1.IsOptional)(),
22
+ tslib_1.__metadata("design:type", Object)
23
+ ], ModificationItemDto.prototype, "currentValue", void 0);
24
+ tslib_1.__decorate([
25
+ (0, swagger_1.ApiProperty)({ description: 'Value the reviewer wants instead' }),
26
+ (0, class_validator_1.IsDefined)(),
27
+ tslib_1.__metadata("design:type", Object)
28
+ ], ModificationItemDto.prototype, "wantedValue", void 0);
29
+ tslib_1.__decorate([
30
+ (0, swagger_1.ApiProperty)({ description: 'Optional explanation', required: false }),
31
+ (0, class_validator_1.IsOptional)(),
32
+ (0, class_validator_1.IsString)(),
33
+ tslib_1.__metadata("design:type", String)
34
+ ], ModificationItemDto.prototype, "note", void 0);
35
+ class RequestModificationDto {
36
+ }
37
+ exports.RequestModificationDto = RequestModificationDto;
38
+ tslib_1.__decorate([
39
+ (0, swagger_1.ApiProperty)({
40
+ description: 'List of requested modifications',
41
+ type: [ModificationItemDto],
42
+ }),
43
+ (0, class_validator_1.IsArray)(),
44
+ (0, class_validator_1.ArrayMinSize)(1),
45
+ (0, class_validator_1.ValidateNested)({ each: true }),
46
+ (0, class_transformer_1.Type)(() => ModificationItemDto),
47
+ tslib_1.__metadata("design:type", Array)
48
+ ], RequestModificationDto.prototype, "modifications", void 0);
49
+ tslib_1.__decorate([
50
+ (0, swagger_1.ApiProperty)({
51
+ description: 'Optional overall note explaining the requested changes',
52
+ required: false,
53
+ }),
54
+ (0, class_validator_1.IsOptional)(),
55
+ (0, class_validator_1.IsString)(),
56
+ tslib_1.__metadata("design:type", String)
57
+ ], RequestModificationDto.prototype, "note", void 0);
@@ -0,0 +1,29 @@
1
+ import type { ModificationItem } from '../interfaces/approval-pipeline.interface';
2
+ /**
3
+ * Tracks the approval lifecycle of a created record. One row per approved-or-
4
+ * pending entity, polymorphically referencing the target row via the table
5
+ * name (`entity`) and its primary key (`entityId`).
6
+ */
7
+ export declare class ApprovalStatusEntity {
8
+ id: number;
9
+ /** Target table name, e.g. 'posts'. */
10
+ entity: string;
11
+ /** Stringified primary key of the target row (works for int and uuid). */
12
+ entityId: string;
13
+ /** pending | approved | rejected | modification_requested | resubmitted */
14
+ status: string;
15
+ /** User who submitted the record for approval. */
16
+ requestedBy?: string | null;
17
+ requestedAt: Date;
18
+ /** Active list of requested modifications: { field, wantedValue, ... }. */
19
+ currentModifications?: ModificationItem[] | null;
20
+ /** User who approved or rejected the record. */
21
+ decidedBy?: string | null;
22
+ decidedAt?: Date | null;
23
+ /** User who resubmitted the record after modifications. */
24
+ resubmittedBy?: string | null;
25
+ resubmittedAt?: Date | null;
26
+ createdAt: Date;
27
+ updatedAt: Date;
28
+ }
29
+ //# sourceMappingURL=approval-status.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-status.entity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/approval-status.entity.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAElF;;;;GAIG;AACH,qBACa,oBAAoB;IAE/B,EAAE,EAAG,MAAM,CAAC;IAEZ,uCAAuC;IAGvC,MAAM,EAAG,MAAM,CAAC;IAEhB,0EAA0E;IAG1E,QAAQ,EAAG,MAAM,CAAC;IAElB,2EAA2E;IAG3E,MAAM,EAAG,MAAM,CAAC;IAEhB,kDAAkD;IAGlD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,WAAW,EAAG,IAAI,CAAC;IAEnB,2EAA2E;IAE3E,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAEjD,gDAAgD;IAEhD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAExB,2DAA2D;IAE3D,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG9B,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAG5B,SAAS,EAAG,IAAI,CAAC;IAGjB,SAAS,EAAG,IAAI,CAAC;CAClB"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApprovalStatusEntity = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ /**
7
+ * Tracks the approval lifecycle of a created record. One row per approved-or-
8
+ * pending entity, polymorphically referencing the target row via the table
9
+ * name (`entity`) and its primary key (`entityId`).
10
+ */
11
+ let ApprovalStatusEntity = class ApprovalStatusEntity {
12
+ };
13
+ exports.ApprovalStatusEntity = ApprovalStatusEntity;
14
+ tslib_1.__decorate([
15
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
16
+ tslib_1.__metadata("design:type", Number)
17
+ ], ApprovalStatusEntity.prototype, "id", void 0);
18
+ tslib_1.__decorate([
19
+ (0, typeorm_1.Index)(),
20
+ (0, typeorm_1.Column)(),
21
+ tslib_1.__metadata("design:type", String)
22
+ ], ApprovalStatusEntity.prototype, "entity", void 0);
23
+ tslib_1.__decorate([
24
+ (0, typeorm_1.Index)(),
25
+ (0, typeorm_1.Column)(),
26
+ tslib_1.__metadata("design:type", String)
27
+ ], ApprovalStatusEntity.prototype, "entityId", void 0);
28
+ tslib_1.__decorate([
29
+ (0, typeorm_1.Index)(),
30
+ (0, typeorm_1.Column)({ default: 'pending' }),
31
+ tslib_1.__metadata("design:type", String)
32
+ ], ApprovalStatusEntity.prototype, "status", void 0);
33
+ tslib_1.__decorate([
34
+ (0, typeorm_1.Index)(),
35
+ (0, typeorm_1.Column)({ type: 'varchar', nullable: true }),
36
+ tslib_1.__metadata("design:type", Object)
37
+ ], ApprovalStatusEntity.prototype, "requestedBy", void 0);
38
+ tslib_1.__decorate([
39
+ (0, typeorm_1.CreateDateColumn)({ type: 'timestamptz' }),
40
+ tslib_1.__metadata("design:type", Date)
41
+ ], ApprovalStatusEntity.prototype, "requestedAt", void 0);
42
+ tslib_1.__decorate([
43
+ (0, typeorm_1.Column)({ type: 'jsonb', nullable: true }),
44
+ tslib_1.__metadata("design:type", Object)
45
+ ], ApprovalStatusEntity.prototype, "currentModifications", void 0);
46
+ tslib_1.__decorate([
47
+ (0, typeorm_1.Column)({ type: 'varchar', nullable: true }),
48
+ tslib_1.__metadata("design:type", Object)
49
+ ], ApprovalStatusEntity.prototype, "decidedBy", void 0);
50
+ tslib_1.__decorate([
51
+ (0, typeorm_1.Column)({ type: 'timestamptz', nullable: true }),
52
+ tslib_1.__metadata("design:type", Object)
53
+ ], ApprovalStatusEntity.prototype, "decidedAt", void 0);
54
+ tslib_1.__decorate([
55
+ (0, typeorm_1.Column)({ type: 'varchar', nullable: true }),
56
+ tslib_1.__metadata("design:type", Object)
57
+ ], ApprovalStatusEntity.prototype, "resubmittedBy", void 0);
58
+ tslib_1.__decorate([
59
+ (0, typeorm_1.Column)({ type: 'timestamptz', nullable: true }),
60
+ tslib_1.__metadata("design:type", Object)
61
+ ], ApprovalStatusEntity.prototype, "resubmittedAt", void 0);
62
+ tslib_1.__decorate([
63
+ (0, typeorm_1.CreateDateColumn)({ type: 'timestamptz' }),
64
+ tslib_1.__metadata("design:type", Date)
65
+ ], ApprovalStatusEntity.prototype, "createdAt", void 0);
66
+ tslib_1.__decorate([
67
+ (0, typeorm_1.UpdateDateColumn)({ type: 'timestamptz' }),
68
+ tslib_1.__metadata("design:type", Date)
69
+ ], ApprovalStatusEntity.prototype, "updatedAt", void 0);
70
+ exports.ApprovalStatusEntity = ApprovalStatusEntity = tslib_1.__decorate([
71
+ (0, typeorm_1.Entity)('approval_statuses')
72
+ ], ApprovalStatusEntity);
@@ -0,0 +1,20 @@
1
+ import type { ModificationItem } from '../interfaces/approval-pipeline.interface';
2
+ import { ApprovalStatusEntity } from './approval-status.entity';
3
+ /**
4
+ * Immutable record of every modification request ever made against an
5
+ * approval status. A new row is appended each time modifications are
6
+ * requested.
7
+ */
8
+ export declare class ModificationRequestHistoryEntity {
9
+ id: number;
10
+ approvalStatus: ApprovalStatusEntity;
11
+ approvalStatusId: number;
12
+ /** The requested modifications: { field, wantedValue, ... }. */
13
+ modifications: ModificationItem[];
14
+ /** User who requested the modifications. */
15
+ requestedBy?: string | null;
16
+ /** Optional overall note explaining the requested changes. */
17
+ note?: string | null;
18
+ requestedAt: Date;
19
+ }
20
+ //# sourceMappingURL=modification-request-history.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modification-request-history.entity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/modification-request-history.entity.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;GAIG;AACH,qBACa,gCAAgC;IAE3C,EAAE,EAAG,MAAM,CAAC;IAKZ,cAAc,EAAG,oBAAoB,CAAC;IAGtC,gBAAgB,EAAG,MAAM,CAAC;IAE1B,gEAAgE;IAEhE,aAAa,EAAG,gBAAgB,EAAE,CAAC;IAEnC,4CAA4C;IAG5C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,8DAA8D;IAE9D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAG,IAAI,CAAC;CACpB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModificationRequestHistoryEntity = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const approval_status_entity_1 = require("./approval-status.entity");
7
+ /**
8
+ * Immutable record of every modification request ever made against an
9
+ * approval status. A new row is appended each time modifications are
10
+ * requested.
11
+ */
12
+ let ModificationRequestHistoryEntity = class ModificationRequestHistoryEntity {
13
+ };
14
+ exports.ModificationRequestHistoryEntity = ModificationRequestHistoryEntity;
15
+ tslib_1.__decorate([
16
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
17
+ tslib_1.__metadata("design:type", Number)
18
+ ], ModificationRequestHistoryEntity.prototype, "id", void 0);
19
+ tslib_1.__decorate([
20
+ (0, typeorm_1.Index)(),
21
+ (0, typeorm_1.ManyToOne)(() => approval_status_entity_1.ApprovalStatusEntity, { onDelete: 'CASCADE' }),
22
+ (0, typeorm_1.JoinColumn)({ name: 'approvalStatusId' }),
23
+ tslib_1.__metadata("design:type", approval_status_entity_1.ApprovalStatusEntity)
24
+ ], ModificationRequestHistoryEntity.prototype, "approvalStatus", void 0);
25
+ tslib_1.__decorate([
26
+ (0, typeorm_1.Column)({ name: 'approvalStatusId' }),
27
+ tslib_1.__metadata("design:type", Number)
28
+ ], ModificationRequestHistoryEntity.prototype, "approvalStatusId", void 0);
29
+ tslib_1.__decorate([
30
+ (0, typeorm_1.Column)({ type: 'jsonb' }),
31
+ tslib_1.__metadata("design:type", Array)
32
+ ], ModificationRequestHistoryEntity.prototype, "modifications", void 0);
33
+ tslib_1.__decorate([
34
+ (0, typeorm_1.Index)(),
35
+ (0, typeorm_1.Column)({ type: 'varchar', nullable: true }),
36
+ tslib_1.__metadata("design:type", Object)
37
+ ], ModificationRequestHistoryEntity.prototype, "requestedBy", void 0);
38
+ tslib_1.__decorate([
39
+ (0, typeorm_1.Column)({ type: 'varchar', nullable: true }),
40
+ tslib_1.__metadata("design:type", Object)
41
+ ], ModificationRequestHistoryEntity.prototype, "note", void 0);
42
+ tslib_1.__decorate([
43
+ (0, typeorm_1.CreateDateColumn)({ type: 'timestamptz' }),
44
+ tslib_1.__metadata("design:type", Date)
45
+ ], ModificationRequestHistoryEntity.prototype, "requestedAt", void 0);
46
+ exports.ModificationRequestHistoryEntity = ModificationRequestHistoryEntity = tslib_1.__decorate([
47
+ (0, typeorm_1.Entity)('approval_modification_history')
48
+ ], ModificationRequestHistoryEntity);
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Lifecycle of an approval status row.
3
+ *
4
+ * pending ──────────> approved
5
+ * │ └───────────> rejected
6
+ * └─> modification_requested ──> resubmitted ──> approved / rejected
7
+ * │ │
8
+ * └────────────────────────────────────┘
9
+ * (modifications may be requested again)
10
+ */
11
+ export declare const APPROVAL_STATUS: {
12
+ readonly pending: "pending";
13
+ readonly approved: "approved";
14
+ readonly rejected: "rejected";
15
+ readonly modificationRequested: "modification_requested";
16
+ readonly resubmitted: "resubmitted";
17
+ };
18
+ export type ApprovalStatus = (typeof APPROVAL_STATUS)[keyof typeof APPROVAL_STATUS];
19
+ /**
20
+ * A single requested modification on a pending record. Each item names the
21
+ * field to change and the value the reviewer wants instead.
22
+ */
23
+ export interface ModificationItem {
24
+ /** Entity field to modify, e.g. 'title'. */
25
+ field: string;
26
+ /** Value currently stored on the record (captured at request time). */
27
+ currentValue?: unknown;
28
+ /** Value the reviewer wants instead. */
29
+ wantedValue: unknown;
30
+ /** Optional human-readable explanation. */
31
+ note?: string;
32
+ }
33
+ export interface ApprovalStatusView {
34
+ id: number;
35
+ entity: string;
36
+ entityId: string;
37
+ status: ApprovalStatus;
38
+ requestedBy?: string | null;
39
+ requestedAt: Date;
40
+ currentModifications?: ModificationItem[] | null;
41
+ decidedBy?: string | null;
42
+ decidedAt?: Date | null;
43
+ resubmittedBy?: string | null;
44
+ resubmittedAt?: Date | null;
45
+ createdAt: Date;
46
+ updatedAt: Date;
47
+ }
48
+ export interface ApprovalHistoryView {
49
+ id: number;
50
+ approvalStatusId: number;
51
+ modifications: ModificationItem[];
52
+ requestedBy?: string | null;
53
+ requestedAt: Date;
54
+ note?: string | null;
55
+ }
56
+ export interface ApprovalPipelinePermissions {
57
+ /** Required permission to approve (pending/resubmitted -> approved). */
58
+ approve?: string;
59
+ /** Required permission to reject (pending/resubmitted -> rejected). */
60
+ reject?: string;
61
+ /** Required permission to request modifications. */
62
+ requestModification?: string;
63
+ /** Required permission to resubmit after modifications. */
64
+ resubmit?: string;
65
+ }
66
+ export interface ApprovalPipelineConfig {
67
+ /**
68
+ * When true, every created record also gets a pending approval status row
69
+ * (created in the same transaction). Defaults to true when the option is
70
+ * provided.
71
+ */
72
+ enabled?: boolean;
73
+ /**
74
+ * Optional permission strings required to perform each action. When unset,
75
+ * the action is allowed for any authenticated (or anonymous) caller.
76
+ */
77
+ permissions?: ApprovalPipelinePermissions;
78
+ /**
79
+ * When set, read endpoints (findAll / findOne / findMine /
80
+ * findAllWithCursor) only return records whose approval status is in this
81
+ * list, e.g. ['approved']. When unset, all records are visible regardless
82
+ * of approval state.
83
+ */
84
+ visibleStatuses?: readonly ApprovalStatus[];
85
+ }
86
+ export interface RequestModificationPayload {
87
+ modifications: ModificationItem[];
88
+ note?: string;
89
+ }
90
+ //# sourceMappingURL=approval-pipeline.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-pipeline.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/approval-pipeline.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAEpF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,WAAW,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,IAAI,CAAC;IAClB,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,IAAI,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,WAAW,CAAC,EAAE,2BAA2B,CAAC;IAE1C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APPROVAL_STATUS = void 0;
4
+ /**
5
+ * Lifecycle of an approval status row.
6
+ *
7
+ * pending ──────────> approved
8
+ * │ └───────────> rejected
9
+ * └─> modification_requested ──> resubmitted ──> approved / rejected
10
+ * │ │
11
+ * └────────────────────────────────────┘
12
+ * (modifications may be requested again)
13
+ */
14
+ exports.APPROVAL_STATUS = {
15
+ pending: 'pending',
16
+ approved: 'approved',
17
+ rejected: 'rejected',
18
+ modificationRequested: 'modification_requested',
19
+ resubmitted: 'resubmitted',
20
+ };
@@ -3,7 +3,8 @@ import { PaginationDto } from '../dtos/pagination.dto';
3
3
  import { CursorPaginationDto } from '../dtos/cursor-pagination.dto';
4
4
  import { OwnershipUser } from './find-mine.interface';
5
5
  import { StatusValue } from './status-pipeline.interface';
6
- export type CrudEndpoint = 'findAll' | 'findOne' | 'create' | 'update' | 'changeStatus' | 'remove' | 'findAuditLogs' | 'findMine';
6
+ import { ApprovalHistoryView, ApprovalStatusView, RequestModificationPayload } from './approval-pipeline.interface';
7
+ export type CrudEndpoint = 'findAll' | 'findOne' | 'create' | 'update' | 'changeStatus' | 'remove' | 'findAuditLogs' | 'findMine' | 'getApproval' | 'approveApproval' | 'rejectApproval' | 'requestModification' | 'resubmitApproval';
7
8
  export interface AuditLogQuery {
8
9
  user_id?: string;
9
10
  start_date?: string;
@@ -37,5 +38,13 @@ export interface CrudInterface<CreateDto, UpdateDto, ResponseDto> {
37
38
  data: ResponseDto[];
38
39
  meta?: unknown;
39
40
  }>;
41
+ getApproval?(id: number, user?: OwnershipUser): Promise<{
42
+ approval: ApprovalStatusView;
43
+ history: ApprovalHistoryView[];
44
+ }>;
45
+ approveApproval?(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
46
+ rejectApproval?(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
47
+ requestModification?(id: number, dto: RequestModificationPayload, user?: OwnershipUser): Promise<ApprovalStatusView>;
48
+ resubmitApproval?(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
40
49
  }
41
50
  //# sourceMappingURL=crud.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crud.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/crud.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,QAAQ,GACR,eAAe,GACf,UAAU,CAAC;AAEf,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW;IAC9D,iBAAiB,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAE5C,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;QACjD,IAAI,EAAE,WAAW,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC,CAAC;IAEH,iBAAiB,CAAC,CAChB,KAAK,EAAE,mBAAmB,GAAG,SAAS,GACrC,OAAO,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC;IAEhD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEhE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/E,YAAY,CAAC,CACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D,aAAa,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD,QAAQ,CAAC,CACP,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,KAAK,EAAE,aAAa,GAAG,SAAS,GAC/B,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrD"}
1
+ {"version":3,"file":"crud.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/crud.interface.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"nest-crud.module.d.ts","sourceRoot":"","sources":["../../src/lib/nest-crud.module.ts"],"names":[],"mappings":"AAKA,qBAKa,cAAc;CAAG"}
1
+ {"version":3,"file":"nest-crud.module.d.ts","sourceRoot":"","sources":["../../src/lib/nest-crud.module.ts"],"names":[],"mappings":"AAOA,qBAWa,cAAc;CAAG"}
@@ -5,13 +5,21 @@ const tslib_1 = require("tslib");
5
5
  const common_1 = require("@nestjs/common");
6
6
  const typeorm_1 = require("@nestjs/typeorm");
7
7
  const audit_log_entity_1 = require("./entities/audit-log.entity");
8
+ const approval_status_entity_1 = require("./entities/approval-status.entity");
9
+ const modification_request_history_entity_1 = require("./entities/modification-request-history.entity");
8
10
  const audit_log_service_1 = require("./services/audit-log.service");
9
11
  let NestCrudModule = class NestCrudModule {
10
12
  };
11
13
  exports.NestCrudModule = NestCrudModule;
12
14
  exports.NestCrudModule = NestCrudModule = tslib_1.__decorate([
13
15
  (0, common_1.Module)({
14
- imports: [typeorm_1.TypeOrmModule.forFeature([audit_log_entity_1.AuditLogEntity])],
16
+ imports: [
17
+ typeorm_1.TypeOrmModule.forFeature([
18
+ audit_log_entity_1.AuditLogEntity,
19
+ approval_status_entity_1.ApprovalStatusEntity,
20
+ modification_request_history_entity_1.ModificationRequestHistoryEntity,
21
+ ]),
22
+ ],
15
23
  providers: [audit_log_service_1.AuditService],
16
24
  exports: [audit_log_service_1.AuditService],
17
25
  })
@@ -9,6 +9,7 @@ import { CursorStrategy } from '../interfaces/cursor-strategy.interface';
9
9
  import { CrudHooks, TransactionConfig } from '../interfaces/hooks.interface';
10
10
  import { FindMineConfig, OwnershipUser } from '../interfaces/find-mine.interface';
11
11
  import { StatusPipelineConfig, StatusTransitionAction, StatusValue } from '../interfaces/status-pipeline.interface';
12
+ import { ApprovalPipelineConfig, ApprovalStatusView, ApprovalHistoryView, RequestModificationPayload } from '../interfaces/approval-pipeline.interface';
12
13
  export interface CrudServiceOptions<Entity extends ObjectLiteral, ResponseDto> extends FindMineConfig<Entity> {
13
14
  repository: Repository<Entity>;
14
15
  allowedFilters?: readonly (keyof Entity | (string & {}))[];
@@ -27,6 +28,7 @@ export interface CrudServiceOptions<Entity extends ObjectLiteral, ResponseDto> e
27
28
  hooks?: CrudHooks<Entity, any, any>;
28
29
  transactionConfig?: TransactionConfig;
29
30
  statusPipeline?: StatusPipelineConfig<Entity>;
31
+ approvalPipeline?: ApprovalPipelineConfig;
30
32
  }
31
33
  export declare class NestCrudService<Entity extends ObjectLiteral, CreateDto = Partial<Entity>, UpdateDto = Partial<Entity>, ResponseDto = Entity> implements CrudInterface<CreateDto, UpdateDto, ResponseDto> {
32
34
  protected readonly repo: Repository<Entity>;
@@ -60,6 +62,7 @@ export declare class NestCrudService<Entity extends ObjectLiteral, CreateDto = P
60
62
  permission?: string;
61
63
  action?: StatusTransitionAction<Entity>;
62
64
  }>;
65
+ protected readonly approvalPipeline?: ApprovalPipelineConfig;
63
66
  constructor(options: CrudServiceOptions<Entity, ResponseDto>);
64
67
  private normalizeStatusTransitions;
65
68
  private resolveRelations;
@@ -99,6 +102,28 @@ export declare class NestCrudService<Entity extends ObjectLiteral, CreateDto = P
99
102
  create(payload: CreateDto, user?: OwnershipUser): Promise<ResponseDto>;
100
103
  update(id: number, payload: UpdateDto, user?: OwnershipUser): Promise<ResponseDto>;
101
104
  changeStatus(id: number, status: StatusValue, user?: OwnershipUser): Promise<ResponseDto>;
105
+ getApproval(id: number, user?: OwnershipUser): Promise<{
106
+ approval: ApprovalStatusView;
107
+ history: ApprovalHistoryView[];
108
+ }>;
109
+ approveApproval(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
110
+ rejectApproval(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
111
+ requestModification(id: number, payload: RequestModificationPayload, user?: OwnershipUser): Promise<ApprovalStatusView>;
112
+ resubmitApproval(id: number, user?: OwnershipUser): Promise<ApprovalStatusView>;
113
+ private isApprovalPipelineConfigured;
114
+ private hasApprovalVisibilityFilter;
115
+ private getApprovalRepository;
116
+ private getHistoryRepository;
117
+ private createWithApproval;
118
+ private resolveEntityForApproval;
119
+ private loadApprovalStatus;
120
+ private transitionApproval;
121
+ private assertTransitionAllowed;
122
+ private userHasPermission;
123
+ private applyApprovalVisibility;
124
+ private approvalIdCastExpression;
125
+ private toApprovalStatusView;
126
+ private toApprovalHistoryView;
102
127
  private applyUpdateCore;
103
128
  remove(id: number, user?: OwnershipUser): Promise<boolean>;
104
129
  findAuditLogs(query: {
@@ -1 +1 @@
1
- {"version":3,"file":"nest-crud.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/nest-crud.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nest-crud.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/nest-crud.service.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,9 @@ const audit_log_entity_1 = require("../entities/audit-log.entity");
7
7
  const filter_helper_1 = require("../helpers/filter.helper");
8
8
  const pagination_helper_1 = require("../helpers/pagination.helper");
9
9
  const cursor_pagination_helper_1 = require("../helpers/cursor-pagination.helper");
10
+ const approval_status_entity_1 = require("../entities/approval-status.entity");
11
+ const modification_request_history_entity_1 = require("../entities/modification-request-history.entity");
12
+ const approval_pipeline_interface_1 = require("../interfaces/approval-pipeline.interface");
10
13
  let NestCrudService = class NestCrudService {
11
14
  constructor(options) {
12
15
  this.statusTransitions = new Map();
@@ -41,6 +44,7 @@ let NestCrudService = class NestCrudService {
41
44
  if (options.statusPipeline?.transitions) {
42
45
  this.statusTransitions = this.normalizeStatusTransitions(options.statusPipeline.transitions);
43
46
  }
47
+ this.approvalPipeline = options.approvalPipeline;
44
48
  }
45
49
  normalizeStatusTransitions(transitions) {
46
50
  const result = new Map();
@@ -318,6 +322,7 @@ let NestCrudService = class NestCrudService {
318
322
  async findAll(query) {
319
323
  const qb = this.repo.createQueryBuilder('e');
320
324
  this.applyIncludeJoins(qb);
325
+ this.applyApprovalVisibility(qb);
321
326
  (0, filter_helper_1.applyFilters)(qb, query.filter, this.allowedFilters, this.include);
322
327
  const paginationMeta = (0, pagination_helper_1.applyPagination)(qb, query);
323
328
  this.applyOrderBy(qb, query.orderBy, query.orderDirection === 'ASC' ? 'ASC' : 'DESC');
@@ -336,6 +341,7 @@ let NestCrudService = class NestCrudService {
336
341
  const qb = this.repo.createQueryBuilder('e');
337
342
  this.applyOwnershipCondition(qb, userId);
338
343
  this.applyIncludeJoins(qb);
344
+ this.applyApprovalVisibility(qb);
339
345
  (0, filter_helper_1.applyFilters)(qb, query.filter, this.allowedFilters, this.include);
340
346
  const paginationMeta = (0, pagination_helper_1.applyPagination)(qb, query);
341
347
  this.applyOrderBy(qb, query.orderBy, query.orderDirection === 'ASC' ? 'ASC' : 'DESC');
@@ -354,6 +360,7 @@ let NestCrudService = class NestCrudService {
354
360
  const qb = this.repo.createQueryBuilder('e');
355
361
  // Join relations
356
362
  this.applyIncludeJoins(qb);
363
+ this.applyApprovalVisibility(qb);
357
364
  // Apply filters
358
365
  (0, filter_helper_1.applyFilters)(qb, query.filter, this.allowedFilters, this.include);
359
366
  // Apply cursor filter
@@ -376,6 +383,7 @@ let NestCrudService = class NestCrudService {
376
383
  // Build a clean count query (reuse same filters but no cursor/order/take)
377
384
  const countQb = this.repo.createQueryBuilder('e');
378
385
  this.applyIncludeJoins(countQb, false);
386
+ this.applyApprovalVisibility(countQb);
379
387
  (0, filter_helper_1.applyFilters)(countQb, query.filter, this.allowedFilters, this.include);
380
388
  total = await countQb.getCount();
381
389
  }
@@ -398,6 +406,13 @@ let NestCrudService = class NestCrudService {
398
406
  if (this.enforceOwnershipFor(user)) {
399
407
  entity = await this.findOwnedEntity(id, user);
400
408
  }
409
+ else if (this.hasApprovalVisibilityFilter()) {
410
+ const qb = this.repo.createQueryBuilder('e');
411
+ this.applyIncludeJoins(qb);
412
+ this.applyApprovalVisibility(qb);
413
+ qb.andWhere('e.id = :id', { id });
414
+ entity = await qb.getOne();
415
+ }
401
416
  else {
402
417
  const relationsObj = this.include.length > 0
403
418
  ? this.buildRelationsObject(this.include)
@@ -448,7 +463,9 @@ let NestCrudService = class NestCrudService {
448
463
  await this.executeHook(this.hooks.beforeCreate, { payload });
449
464
  const payloadSnapshot = { ...payload };
450
465
  const resolved = await this.resolveRelations(payload);
451
- const entity = await this.repo.save(resolved);
466
+ const entity = this.isApprovalPipelineConfigured()
467
+ ? await this.createWithApproval(resolved, user)
468
+ : await this.repo.save(resolved);
452
469
  const result = this.toResponseDto
453
470
  ? this.toResponseDto(entity)
454
471
  : entity;
@@ -465,6 +482,202 @@ let NestCrudService = class NestCrudService {
465
482
  const payload = { [String(this.statusField)]: status };
466
483
  return this.applyUpdateCore(id, payload, user);
467
484
  }
485
+ async getApproval(id, user) {
486
+ if (!this.isApprovalPipelineConfigured()) {
487
+ throw new common_1.NotFoundException('Resource not found');
488
+ }
489
+ const approval = await this.loadApprovalStatus(id, user);
490
+ if (!approval) {
491
+ throw new common_1.NotFoundException('Resource not found');
492
+ }
493
+ const history = await this.getHistoryRepository().find({
494
+ where: { approvalStatusId: approval.id },
495
+ order: { requestedAt: 'DESC' },
496
+ });
497
+ return {
498
+ approval: this.toApprovalStatusView(approval),
499
+ history: history.map((entry) => this.toApprovalHistoryView(entry)),
500
+ };
501
+ }
502
+ async approveApproval(id, user) {
503
+ return this.transitionApproval(id, 'approve', user);
504
+ }
505
+ async rejectApproval(id, user) {
506
+ return this.transitionApproval(id, 'reject', user);
507
+ }
508
+ async requestModification(id, payload, user) {
509
+ return this.transitionApproval(id, 'requestModification', user, payload.modifications, payload.note);
510
+ }
511
+ async resubmitApproval(id, user) {
512
+ return this.transitionApproval(id, 'resubmit', user);
513
+ }
514
+ isApprovalPipelineConfigured() {
515
+ return Boolean(this.approvalPipeline && this.approvalPipeline.enabled !== false);
516
+ }
517
+ hasApprovalVisibilityFilter() {
518
+ if (!this.isApprovalPipelineConfigured()) {
519
+ return false;
520
+ }
521
+ const visible = this.approvalPipeline?.visibleStatuses;
522
+ return Boolean(visible && visible.length > 0);
523
+ }
524
+ getApprovalRepository() {
525
+ return this.repo.manager.getRepository(approval_status_entity_1.ApprovalStatusEntity);
526
+ }
527
+ getHistoryRepository() {
528
+ return this.repo.manager.getRepository(modification_request_history_entity_1.ModificationRequestHistoryEntity);
529
+ }
530
+ async createWithApproval(resolved, user) {
531
+ const entity = await this.repo.manager.transaction(async (manager) => {
532
+ const entityRepo = manager.getRepository(this.repo.target);
533
+ const saved = await entityRepo.save(resolved);
534
+ const approvalRepo = manager.getRepository(approval_status_entity_1.ApprovalStatusEntity);
535
+ const approval = approvalRepo.create({
536
+ entity: this.repo.metadata.tableName,
537
+ entityId: String(saved.id),
538
+ status: approval_pipeline_interface_1.APPROVAL_STATUS.pending,
539
+ requestedBy: user?.id != null ? String(user.id) : null,
540
+ });
541
+ await approvalRepo.save(approval);
542
+ return saved;
543
+ });
544
+ return entity;
545
+ }
546
+ async resolveEntityForApproval(id, user) {
547
+ if (this.enforceOwnershipFor(user)) {
548
+ return this.findOwnedEntity(id, user);
549
+ }
550
+ return this.repo.findOneBy({ id });
551
+ }
552
+ async loadApprovalStatus(id, user) {
553
+ const entity = await this.resolveEntityForApproval(id, user);
554
+ if (!entity) {
555
+ return null;
556
+ }
557
+ const approval = await this.getApprovalRepository().findOneBy({
558
+ entity: this.repo.metadata.tableName,
559
+ entityId: String(id),
560
+ });
561
+ return approval ?? null;
562
+ }
563
+ async transitionApproval(id, action, user, modifications, note) {
564
+ if (!this.isApprovalPipelineConfigured()) {
565
+ throw new common_1.NotFoundException('Resource not found');
566
+ }
567
+ const permission = this.approvalPipeline?.permissions?.[action];
568
+ if (permission && !this.userHasPermission(user, permission)) {
569
+ throw new common_1.ForbiddenException(`Missing required permission '${permission}' for ${action}`);
570
+ }
571
+ const approval = await this.loadApprovalStatus(id, user);
572
+ if (!approval) {
573
+ throw new common_1.NotFoundException('Resource not found');
574
+ }
575
+ const current = approval.status;
576
+ const now = new Date();
577
+ const userId = user?.id != null ? String(user.id) : null;
578
+ const transitionable = [
579
+ approval_pipeline_interface_1.APPROVAL_STATUS.pending,
580
+ approval_pipeline_interface_1.APPROVAL_STATUS.resubmitted,
581
+ ];
582
+ switch (action) {
583
+ case 'approve':
584
+ this.assertTransitionAllowed(action, current, transitionable);
585
+ approval.status = approval_pipeline_interface_1.APPROVAL_STATUS.approved;
586
+ approval.decidedBy = userId;
587
+ approval.decidedAt = now;
588
+ approval.currentModifications = null;
589
+ break;
590
+ case 'reject':
591
+ this.assertTransitionAllowed(action, current, transitionable);
592
+ approval.status = approval_pipeline_interface_1.APPROVAL_STATUS.rejected;
593
+ approval.decidedBy = userId;
594
+ approval.decidedAt = now;
595
+ approval.currentModifications = null;
596
+ break;
597
+ case 'requestModification':
598
+ this.assertTransitionAllowed(action, current, transitionable);
599
+ approval.status = approval_pipeline_interface_1.APPROVAL_STATUS.modificationRequested;
600
+ approval.currentModifications = modifications ?? [];
601
+ await this.getHistoryRepository().save(this.getHistoryRepository().create({
602
+ approvalStatusId: approval.id,
603
+ modifications: modifications ?? [],
604
+ requestedBy: userId,
605
+ note: note ?? null,
606
+ }));
607
+ break;
608
+ case 'resubmit':
609
+ if (current !== approval_pipeline_interface_1.APPROVAL_STATUS.modificationRequested) {
610
+ throw new common_1.BadRequestException(`Cannot resubmit approval from status '${current}'`);
611
+ }
612
+ approval.status = approval_pipeline_interface_1.APPROVAL_STATUS.resubmitted;
613
+ approval.currentModifications = null;
614
+ approval.resubmittedBy = userId;
615
+ approval.resubmittedAt = now;
616
+ break;
617
+ }
618
+ const saved = await this.getApprovalRepository().save(approval);
619
+ return this.toApprovalStatusView(saved);
620
+ }
621
+ assertTransitionAllowed(action, current, allowedFrom) {
622
+ if (!allowedFrom.includes(current)) {
623
+ throw new common_1.BadRequestException(`Cannot ${action} approval from status '${current}'`);
624
+ }
625
+ }
626
+ userHasPermission(user, permission) {
627
+ if (!user) {
628
+ return false;
629
+ }
630
+ const permissions = this.resolveUserPermissions(user);
631
+ return permissions.includes(permission);
632
+ }
633
+ applyApprovalVisibility(qb) {
634
+ if (!this.hasApprovalVisibilityFilter()) {
635
+ return;
636
+ }
637
+ const visible = this.approvalPipeline?.visibleStatuses;
638
+ const tableName = this.repo.metadata.tableName;
639
+ qb.innerJoin(approval_status_entity_1.ApprovalStatusEntity, 'approvalStatus', `approvalStatus.entity = :approvalEntityName AND approvalStatus.entityId = ${this.approvalIdCastExpression()} AND approvalStatus.status IN (:...approvalVisibleStatuses)`, {
640
+ approvalEntityName: tableName,
641
+ approvalVisibleStatuses: [...visible],
642
+ });
643
+ }
644
+ approvalIdCastExpression() {
645
+ const type = this.repo.manager.connection.options.type;
646
+ if (type === 'mysql' || type === 'mariadb' || type === 'aurora-mysql') {
647
+ return 'CAST(e.id AS CHAR)';
648
+ }
649
+ if (type === 'better-sqlite3' || type === 'sqljs' || type === 'capacitor') {
650
+ return 'CAST(e.id AS TEXT)';
651
+ }
652
+ return 'CAST(e.id AS varchar)';
653
+ }
654
+ toApprovalStatusView(entity) {
655
+ return {
656
+ id: entity.id,
657
+ entity: entity.entity,
658
+ entityId: entity.entityId,
659
+ status: entity.status,
660
+ requestedBy: entity.requestedBy,
661
+ requestedAt: entity.requestedAt,
662
+ currentModifications: entity.currentModifications,
663
+ decidedBy: entity.decidedBy,
664
+ decidedAt: entity.decidedAt,
665
+ resubmittedBy: entity.resubmittedBy,
666
+ resubmittedAt: entity.resubmittedAt,
667
+ createdAt: entity.createdAt,
668
+ updatedAt: entity.updatedAt,
669
+ };
670
+ }
671
+ toApprovalHistoryView(entity) {
672
+ return {
673
+ id: entity.id,
674
+ approvalStatusId: entity.approvalStatusId,
675
+ modifications: entity.modifications,
676
+ requestedBy: entity.requestedBy,
677
+ note: entity.note,
678
+ requestedAt: entity.requestedAt,
679
+ };
680
+ }
468
681
  async applyUpdateCore(id, payload, user) {
469
682
  let existing;
470
683
  if (this.enforceOwnershipFor(user)) {
@@ -1 +1 @@
1
- {"version":3,"file":"mock-repository.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/mock-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,YAAY,IAAI,gBAAgB,CAgB/C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,aAAa,EAChE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GACpD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAiClC;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAS,aAAa,EACnE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GACpB,OAAO,CAuCT"}
1
+ {"version":3,"file":"mock-repository.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/mock-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,YAAY,IAAI,gBAAgB,CAiB/C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,aAAa,EAChE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GACpD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAkClC;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAS,aAAa,EACnE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GACpB,OAAO,CAuCT"}
@@ -7,6 +7,7 @@ function createMockQb() {
7
7
  const qb = {
8
8
  where: jest.fn().mockReturnThis(),
9
9
  andWhere: jest.fn().mockReturnThis(),
10
+ innerJoin: jest.fn().mockReturnThis(),
10
11
  leftJoinAndSelect: jest.fn().mockReturnThis(),
11
12
  leftJoin: jest.fn().mockReturnThis(),
12
13
  orderBy: jest.fn().mockReturnThis(),
@@ -33,6 +34,7 @@ function createMockRepository(entity, overrides) {
33
34
  find: jest.fn().mockResolvedValue([mockEntity]),
34
35
  metadata: {
35
36
  name: entity.name,
37
+ tableName: entity.name.toLowerCase(),
36
38
  primaryColumns: [{ propertyPath: 'id', type: () => Number }],
37
39
  },
38
40
  manager: {
@@ -39,6 +39,7 @@ export interface CrudTestContext {
39
39
  export interface MockQueryBuilder {
40
40
  where: jest.Mock;
41
41
  andWhere: jest.Mock;
42
+ innerJoin: jest.Mock;
42
43
  leftJoinAndSelect: jest.Mock;
43
44
  leftJoin: jest.Mock;
44
45
  orderBy: jest.Mock;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/testing.interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/testing.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,cAAc,CAC7B,OAAO,SAAS,aAAa,EAC7B,UAAU,EACV,UAAU,EACV,YAAY;IAEZ,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5D,iBAAiB,CAAC,EAAE,SAAS,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3D,iBAAiB,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,KAAK,CAAC,EAAE,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,KACxB,YAAY,GAAG,YAAY,EAAE,CAAC;IACnC,SAAS,CAAC,EAAE,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IACnE,IAAI,EAAE;QACJ,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC;QACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KAC/D,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB,CACvC,OAAO,SAAS,aAAa,EAC7B,UAAU,EACV,UAAU,EACV,YAAY,CACZ,SAAQ,IAAI,CACV,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,EAC7D,cAAc,CACf;IACD,iBAAiB,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,GAAG,CAAC;IACZ,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,gBAAgB,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;IACrB,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC;IAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;IACpB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC;IAC3B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;IACnB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-util/nest-crud",
3
- "version": "1.1.5",
3
+ "version": "1.2.2",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",