@dismissible/nestjs-dismissible 0.0.2-canary.8976e84.0 → 0.0.2-canary.a611bd3.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 +58 -74
- package/package.json +19 -17
- package/src/api/dismissible-item-response.dto.d.ts +9 -0
- package/src/api/dismissible-item-response.dto.js +40 -0
- package/src/api/dismissible-item-response.dto.js.map +1 -0
- package/src/api/dismissible-item.mapper.d.ts +12 -0
- package/src/api/dismissible-item.mapper.js +30 -0
- package/src/api/dismissible-item.mapper.js.map +1 -0
- package/src/api/dismissible-item.mapper.spec.d.ts +1 -0
- package/src/api/dismissible-item.mapper.spec.js +43 -0
- package/src/api/dismissible-item.mapper.spec.js.map +1 -0
- package/src/api/{index.ts → index.d.ts} +1 -4
- package/src/api/index.js +8 -0
- package/src/api/index.js.map +1 -0
- package/src/api/use-cases/{api-tags.constants.ts → api-tags.constants.d.ts} +1 -1
- package/src/api/use-cases/api-tags.constants.js +8 -0
- package/src/api/use-cases/api-tags.constants.js.map +1 -0
- package/src/api/use-cases/dismiss/dismiss.controller.d.ts +15 -0
- package/src/api/use-cases/dismiss/dismiss.controller.js +74 -0
- package/src/api/use-cases/dismiss/dismiss.controller.js.map +1 -0
- package/src/api/use-cases/dismiss/dismiss.controller.spec.d.ts +1 -0
- package/src/api/use-cases/dismiss/dismiss.controller.spec.js +37 -0
- package/src/api/use-cases/dismiss/dismiss.controller.spec.js.map +1 -0
- package/src/api/use-cases/dismiss/dismiss.response.dto.d.ts +12 -0
- package/src/api/use-cases/dismiss/dismiss.response.dto.js +12 -0
- package/src/api/use-cases/dismiss/dismiss.response.dto.js.map +1 -0
- package/src/api/use-cases/dismiss/index.js +6 -0
- package/src/api/use-cases/dismiss/index.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.d.ts +15 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.js +70 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.d.ts +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js +32 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.d.ts +12 -0
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.js +12 -0
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.js.map +1 -0
- package/src/api/use-cases/get-or-create/{index.ts → index.d.ts} +0 -1
- package/src/api/use-cases/get-or-create/index.js +6 -0
- package/src/api/use-cases/get-or-create/index.js.map +1 -0
- package/src/api/use-cases/index.js +7 -0
- package/src/api/use-cases/index.js.map +1 -0
- package/src/api/use-cases/restore/index.js +6 -0
- package/src/api/use-cases/restore/index.js.map +1 -0
- package/src/api/use-cases/restore/restore.controller.d.ts +15 -0
- package/src/api/use-cases/restore/restore.controller.js +74 -0
- package/src/api/use-cases/restore/restore.controller.js.map +1 -0
- package/src/api/use-cases/restore/restore.controller.spec.d.ts +1 -0
- package/src/api/use-cases/restore/restore.controller.spec.js +37 -0
- package/src/api/use-cases/restore/restore.controller.spec.js.map +1 -0
- package/src/api/use-cases/restore/restore.response.dto.d.ts +12 -0
- package/src/api/use-cases/restore/restore.response.dto.js +12 -0
- package/src/api/use-cases/restore/restore.response.dto.js.map +1 -0
- package/src/api/validation/index.d.ts +2 -0
- package/src/api/validation/index.js +6 -0
- package/src/api/validation/index.js.map +1 -0
- package/src/api/validation/param-validation.pipe.d.ts +11 -0
- package/src/api/validation/param-validation.pipe.js +36 -0
- package/src/api/validation/param-validation.pipe.js.map +1 -0
- package/src/api/validation/param-validation.pipe.spec.d.ts +1 -0
- package/src/api/validation/param-validation.pipe.spec.js +269 -0
- package/src/api/validation/param-validation.pipe.spec.js.map +1 -0
- package/src/api/validation/param.decorators.d.ts +28 -0
- package/src/api/validation/param.decorators.js +36 -0
- package/src/api/validation/param.decorators.js.map +1 -0
- package/src/core/dismissible-core.service.d.ts +56 -0
- package/src/core/dismissible-core.service.js +147 -0
- package/src/core/dismissible-core.service.js.map +1 -0
- package/src/core/dismissible-core.service.spec.d.ts +1 -0
- package/src/core/dismissible-core.service.spec.js +309 -0
- package/src/core/dismissible-core.service.spec.js.map +1 -0
- package/src/core/dismissible.service.d.ts +45 -0
- package/src/core/dismissible.service.js +127 -0
- package/src/core/dismissible.service.js.map +1 -0
- package/src/core/dismissible.service.spec.d.ts +1 -0
- package/src/core/dismissible.service.spec.js +159 -0
- package/src/core/dismissible.service.spec.js.map +1 -0
- package/src/core/hook-runner.service.d.ts +88 -0
- package/src/core/hook-runner.service.js +226 -0
- package/src/core/hook-runner.service.js.map +1 -0
- package/src/core/hook-runner.service.spec.d.ts +1 -0
- package/src/core/hook-runner.service.spec.js +538 -0
- package/src/core/hook-runner.service.spec.js.map +1 -0
- package/src/core/{index.ts → index.d.ts} +0 -1
- package/src/core/index.js +9 -0
- package/src/core/index.js.map +1 -0
- package/src/core/lifecycle-hook.interface.d.ts +1 -0
- package/src/core/lifecycle-hook.interface.js +7 -0
- package/src/core/lifecycle-hook.interface.js.map +1 -0
- package/src/core/service-responses.interface.d.ts +28 -0
- package/src/core/service-responses.interface.js +3 -0
- package/src/core/service-responses.interface.js.map +1 -0
- package/src/dismissible.module.d.ts +13 -0
- package/src/dismissible.module.integration.spec.d.ts +1 -0
- package/src/dismissible.module.integration.spec.js +529 -0
- package/src/dismissible.module.integration.spec.js.map +1 -0
- package/src/dismissible.module.js +77 -0
- package/src/dismissible.module.js.map +1 -0
- package/src/events/dismissible.events.d.ts +45 -0
- package/src/events/dismissible.events.js +53 -0
- package/src/events/dismissible.events.js.map +1 -0
- package/src/events/events.constants.d.ts +17 -0
- package/src/events/events.constants.js +17 -0
- package/src/events/events.constants.js.map +1 -0
- package/src/events/index.js +6 -0
- package/src/events/index.js.map +1 -0
- package/src/exceptions/dismissible.exceptions.d.ts +26 -0
- package/src/exceptions/dismissible.exceptions.js +49 -0
- package/src/exceptions/dismissible.exceptions.js.map +1 -0
- package/src/exceptions/dismissible.exceptions.spec.d.ts +1 -0
- package/src/exceptions/dismissible.exceptions.spec.js +40 -0
- package/src/exceptions/dismissible.exceptions.spec.js.map +1 -0
- package/src/exceptions/index.js +5 -0
- package/src/exceptions/index.js.map +1 -0
- package/src/{index.ts → index.d.ts} +1 -1
- package/src/index.js +12 -0
- package/src/index.js.map +1 -0
- package/src/response/dtos/base-response.dto.d.ts +6 -0
- package/src/response/dtos/base-response.dto.js +18 -0
- package/src/response/dtos/base-response.dto.js.map +1 -0
- package/src/response/dtos/error-response.dto.d.ts +19 -0
- package/src/response/dtos/error-response.dto.js +39 -0
- package/src/response/dtos/error-response.dto.js.map +1 -0
- package/src/response/dtos/index.js +7 -0
- package/src/response/dtos/index.js.map +1 -0
- package/src/response/dtos/{success-response.dto.ts → success-response.dto.d.ts} +6 -12
- package/src/response/dtos/success-response.dto.js +34 -0
- package/src/response/dtos/success-response.dto.js.map +1 -0
- package/src/response/http-exception-filter.d.ts +4 -0
- package/src/response/http-exception-filter.js +24 -0
- package/src/response/http-exception-filter.js.map +1 -0
- package/src/response/http-exception-filter.spec.d.ts +1 -0
- package/src/response/http-exception-filter.spec.js +137 -0
- package/src/response/http-exception-filter.spec.js.map +1 -0
- package/src/response/index.js +8 -0
- package/src/response/index.js.map +1 -0
- package/src/response/response.module.d.ts +2 -0
- package/src/response/response.module.js +17 -0
- package/src/response/response.module.js.map +1 -0
- package/src/response/response.service.d.ts +6 -0
- package/src/response/response.service.js +25 -0
- package/src/response/response.service.js.map +1 -0
- package/src/response/response.service.spec.d.ts +1 -0
- package/src/response/response.service.spec.js +58 -0
- package/src/response/response.service.spec.js.map +1 -0
- package/src/testing/factories.d.ts +14 -0
- package/src/testing/factories.js +58 -0
- package/src/testing/factories.js.map +1 -0
- package/src/testing/index.js +5 -0
- package/src/testing/index.js.map +1 -0
- package/src/utils/date/date.service.d.ts +8 -0
- package/src/utils/date/date.service.js +24 -0
- package/src/utils/date/date.service.js.map +1 -0
- package/src/utils/date/date.service.spec.d.ts +1 -0
- package/src/utils/date/date.service.spec.js +83 -0
- package/src/utils/date/date.service.spec.js.map +1 -0
- package/src/utils/date/index.js +5 -0
- package/src/utils/date/index.js.map +1 -0
- package/src/utils/dismissible.helper.d.ts +4 -0
- package/src/utils/dismissible.helper.js +15 -0
- package/src/utils/dismissible.helper.js.map +1 -0
- package/src/utils/index.js +7 -0
- package/src/utils/index.js.map +1 -0
- package/src/validation/dismissible-input.dto.d.ts +21 -0
- package/src/validation/dismissible-input.dto.js +54 -0
- package/src/validation/dismissible-input.dto.js.map +1 -0
- package/src/validation/index.d.ts +1 -0
- package/src/validation/index.js +5 -0
- package/src/validation/index.js.map +1 -0
- package/jest.config.ts +0 -29
- package/project.json +0 -42
- package/src/api/dismissible-item-response.dto.ts +0 -38
- package/src/api/dismissible-item.mapper.spec.ts +0 -63
- package/src/api/dismissible-item.mapper.ts +0 -33
- package/src/api/use-cases/dismiss/dismiss.controller.spec.ts +0 -42
- package/src/api/use-cases/dismiss/dismiss.controller.ts +0 -63
- package/src/api/use-cases/dismiss/dismiss.response.dto.ts +0 -7
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.ts +0 -76
- package/src/api/use-cases/get-or-create/get-or-create.controller.ts +0 -106
- package/src/api/use-cases/get-or-create/get-or-create.request.dto.ts +0 -17
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.ts +0 -7
- package/src/api/use-cases/restore/restore.controller.spec.ts +0 -42
- package/src/api/use-cases/restore/restore.controller.ts +0 -63
- package/src/api/use-cases/restore/restore.response.dto.ts +0 -7
- package/src/core/create-options.ts +0 -9
- package/src/core/dismissible-core.service.spec.ts +0 -357
- package/src/core/dismissible-core.service.ts +0 -161
- package/src/core/dismissible.service.spec.ts +0 -144
- package/src/core/dismissible.service.ts +0 -188
- package/src/core/hook-runner.service.spec.ts +0 -304
- package/src/core/hook-runner.service.ts +0 -267
- package/src/core/lifecycle-hook.interface.ts +0 -122
- package/src/core/service-responses.interface.ts +0 -34
- package/src/dismissible.module.ts +0 -83
- package/src/events/dismissible.events.ts +0 -105
- package/src/events/events.constants.ts +0 -21
- package/src/exceptions/dismissible.exceptions.spec.ts +0 -50
- package/src/exceptions/dismissible.exceptions.ts +0 -69
- package/src/request/index.ts +0 -2
- package/src/request/request-context.decorator.ts +0 -14
- package/src/request/request-context.interface.ts +0 -6
- package/src/response/dtos/base-response.dto.ts +0 -11
- package/src/response/dtos/error-response.dto.ts +0 -36
- package/src/response/http-exception-filter.ts +0 -21
- package/src/response/response.module.ts +0 -9
- package/src/response/response.service.spec.ts +0 -86
- package/src/response/response.service.ts +0 -20
- package/src/testing/factories.ts +0 -45
- package/src/utils/date/date.service.spec.ts +0 -104
- package/src/utils/date/date.service.ts +0 -19
- package/src/utils/dismissible.helper.ts +0 -9
- package/tsconfig.json +0 -13
- package/tsconfig.lib.json +0 -14
- /package/src/api/use-cases/dismiss/{index.ts → index.d.ts} +0 -0
- /package/src/api/use-cases/{index.ts → index.d.ts} +0 -0
- /package/src/api/use-cases/restore/{index.ts → index.d.ts} +0 -0
- /package/src/events/{index.ts → index.d.ts} +0 -0
- /package/src/exceptions/{index.ts → index.d.ts} +0 -0
- /package/src/response/dtos/{index.ts → index.d.ts} +0 -0
- /package/src/response/{index.ts → index.d.ts} +0 -0
- /package/src/testing/{index.ts → index.d.ts} +0 -0
- /package/src/utils/date/{index.ts → index.d.ts} +0 -0
- /package/src/utils/{index.ts → index.d.ts} +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ts_jest_mocker_1 = require("ts-jest-mocker");
|
|
4
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
5
|
+
const dismissible_service_1 = require("./dismissible.service");
|
|
6
|
+
const dismissible_core_service_1 = require("./dismissible-core.service");
|
|
7
|
+
const hook_runner_service_1 = require("./hook-runner.service");
|
|
8
|
+
const nestjs_validation_1 = require("@dismissible/nestjs-validation");
|
|
9
|
+
const events_1 = require("../events");
|
|
10
|
+
const factories_1 = require("../testing/factories");
|
|
11
|
+
describe('DismissibleService', () => {
|
|
12
|
+
let service;
|
|
13
|
+
let mockCoreService;
|
|
14
|
+
let mockHookRunner;
|
|
15
|
+
let mockEventEmitter;
|
|
16
|
+
let mockLogger;
|
|
17
|
+
let mockValidationService;
|
|
18
|
+
const testUserId = 'test-user-id';
|
|
19
|
+
const createHookResult = (id, userId = testUserId) => ({
|
|
20
|
+
proceed: true,
|
|
21
|
+
id,
|
|
22
|
+
userId,
|
|
23
|
+
context: (0, factories_1.createTestContext)(),
|
|
24
|
+
});
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
mockCoreService = (0, ts_jest_mocker_1.mock)(dismissible_core_service_1.DismissibleCoreService, { failIfMockNotProvided: false });
|
|
27
|
+
mockHookRunner = (0, ts_jest_mocker_1.mock)(hook_runner_service_1.HookRunner, { failIfMockNotProvided: false });
|
|
28
|
+
mockEventEmitter = (0, ts_jest_mocker_1.mock)(event_emitter_1.EventEmitter2, { failIfMockNotProvided: false });
|
|
29
|
+
mockLogger = (0, ts_jest_mocker_1.mock)({ failIfMockNotProvided: false });
|
|
30
|
+
mockValidationService = (0, ts_jest_mocker_1.mock)(nestjs_validation_1.ValidationService, { failIfMockNotProvided: false });
|
|
31
|
+
mockValidationService.validateDto.mockResolvedValue({});
|
|
32
|
+
service = new dismissible_service_1.DismissibleService(mockCoreService, mockHookRunner, mockEventEmitter, mockLogger, mockValidationService);
|
|
33
|
+
});
|
|
34
|
+
describe('getOrCreate', () => {
|
|
35
|
+
it('should run request and get hooks for existing item', async () => {
|
|
36
|
+
const item = (0, factories_1.createTestItem)({ id: 'existing-item' });
|
|
37
|
+
const context = (0, factories_1.createTestContext)();
|
|
38
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('existing-item'));
|
|
39
|
+
mockHookRunner.runPreGet.mockResolvedValue(createHookResult('existing-item'));
|
|
40
|
+
mockCoreService.get.mockResolvedValue(item);
|
|
41
|
+
const result = await service.getOrCreate('existing-item', testUserId, context);
|
|
42
|
+
expect(mockHookRunner.runPreRequest).toHaveBeenCalled();
|
|
43
|
+
expect(mockCoreService.get).toHaveBeenCalledWith('existing-item', testUserId);
|
|
44
|
+
expect(mockHookRunner.runPreGet).toHaveBeenCalledWith('existing-item', item, testUserId, expect.anything());
|
|
45
|
+
expect(mockHookRunner.runPostGet).toHaveBeenCalled();
|
|
46
|
+
expect(mockHookRunner.runPostRequest).toHaveBeenCalled();
|
|
47
|
+
expect(mockCoreService.create).not.toHaveBeenCalled();
|
|
48
|
+
expect(mockHookRunner.runPreCreate).not.toHaveBeenCalled();
|
|
49
|
+
expect(mockEventEmitter.emit).toHaveBeenCalledWith(events_1.DismissibleEvents.ITEM_RETRIEVED, expect.anything());
|
|
50
|
+
expect(result.created).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
it('should run pre-create hooks BEFORE creating for new item', async () => {
|
|
53
|
+
const item = (0, factories_1.createTestItem)({ id: 'new-item' });
|
|
54
|
+
const context = (0, factories_1.createTestContext)();
|
|
55
|
+
const callOrder = [];
|
|
56
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('new-item'));
|
|
57
|
+
mockCoreService.get.mockResolvedValue(null);
|
|
58
|
+
mockHookRunner.runPreCreate.mockImplementation(async () => {
|
|
59
|
+
callOrder.push('runPreCreate');
|
|
60
|
+
return createHookResult('new-item');
|
|
61
|
+
});
|
|
62
|
+
mockCoreService.create.mockImplementation(async () => {
|
|
63
|
+
callOrder.push('create');
|
|
64
|
+
return item;
|
|
65
|
+
});
|
|
66
|
+
const result = await service.getOrCreate('new-item', testUserId, context);
|
|
67
|
+
expect(callOrder).toEqual(['runPreCreate', 'create']);
|
|
68
|
+
expect(mockHookRunner.runPreRequest).toHaveBeenCalled();
|
|
69
|
+
expect(mockHookRunner.runPreCreate).toHaveBeenCalled();
|
|
70
|
+
expect(mockCoreService.create).toHaveBeenCalledWith('new-item', testUserId);
|
|
71
|
+
expect(mockHookRunner.runPostCreate).toHaveBeenCalled();
|
|
72
|
+
expect(mockHookRunner.runPostRequest).toHaveBeenCalled();
|
|
73
|
+
expect(mockEventEmitter.emit).toHaveBeenCalledWith(events_1.DismissibleEvents.ITEM_CREATED, expect.anything());
|
|
74
|
+
expect(result.created).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it('should NOT create item when pre-create hook blocks the operation', async () => {
|
|
77
|
+
const context = (0, factories_1.createTestContext)();
|
|
78
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('new-item'));
|
|
79
|
+
mockCoreService.get.mockResolvedValue(null);
|
|
80
|
+
mockHookRunner.runPreCreate.mockResolvedValue({
|
|
81
|
+
proceed: false,
|
|
82
|
+
reason: 'Plan limit reached',
|
|
83
|
+
id: 'new-item',
|
|
84
|
+
userId: testUserId,
|
|
85
|
+
context: (0, factories_1.createTestContext)(),
|
|
86
|
+
});
|
|
87
|
+
await expect(service.getOrCreate('new-item', testUserId, context)).rejects.toThrow();
|
|
88
|
+
expect(mockCoreService.create).not.toHaveBeenCalled();
|
|
89
|
+
expect(mockHookRunner.runPostCreate).not.toHaveBeenCalled();
|
|
90
|
+
expect(mockEventEmitter.emit).not.toHaveBeenCalledWith(events_1.DismissibleEvents.ITEM_CREATED, expect.anything());
|
|
91
|
+
});
|
|
92
|
+
it('should NOT return existing item when pre-get hook blocks the operation', async () => {
|
|
93
|
+
const item = (0, factories_1.createTestItem)({ id: 'existing-item' });
|
|
94
|
+
const context = (0, factories_1.createTestContext)();
|
|
95
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('existing-item'));
|
|
96
|
+
mockCoreService.get.mockResolvedValue(item);
|
|
97
|
+
mockHookRunner.runPreGet.mockResolvedValue({
|
|
98
|
+
proceed: false,
|
|
99
|
+
reason: 'Item access denied',
|
|
100
|
+
id: 'existing-item',
|
|
101
|
+
userId: testUserId,
|
|
102
|
+
context: (0, factories_1.createTestContext)(),
|
|
103
|
+
});
|
|
104
|
+
await expect(service.getOrCreate('existing-item', testUserId, context)).rejects.toThrow();
|
|
105
|
+
expect(mockHookRunner.runPostGet).not.toHaveBeenCalled();
|
|
106
|
+
expect(mockHookRunner.runPostRequest).not.toHaveBeenCalled();
|
|
107
|
+
expect(mockEventEmitter.emit).not.toHaveBeenCalledWith(events_1.DismissibleEvents.ITEM_RETRIEVED, expect.anything());
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('dismiss', () => {
|
|
111
|
+
it('should run hooks, call core service, and emit ITEM_DISMISSED event', async () => {
|
|
112
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
113
|
+
const previousItem = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
114
|
+
const context = (0, factories_1.createTestContext)();
|
|
115
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('test-item'));
|
|
116
|
+
mockHookRunner.runPreDismiss.mockResolvedValue(createHookResult('test-item'));
|
|
117
|
+
mockCoreService.dismiss.mockResolvedValue({ item, previousItem });
|
|
118
|
+
const result = await service.dismiss('test-item', testUserId, context);
|
|
119
|
+
expect(mockHookRunner.runPreRequest).toHaveBeenCalled();
|
|
120
|
+
expect(mockHookRunner.runPreDismiss).toHaveBeenCalled();
|
|
121
|
+
expect(mockCoreService.dismiss).toHaveBeenCalledWith('test-item', testUserId);
|
|
122
|
+
expect(mockHookRunner.runPostDismiss).toHaveBeenCalled();
|
|
123
|
+
expect(mockHookRunner.runPostRequest).toHaveBeenCalled();
|
|
124
|
+
expect(mockEventEmitter.emit).toHaveBeenCalledWith(events_1.DismissibleEvents.ITEM_DISMISSED, expect.anything());
|
|
125
|
+
expect(result.item).toEqual(item);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('restore', () => {
|
|
129
|
+
it('should run hooks, call core service, and emit ITEM_RESTORED event', async () => {
|
|
130
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
131
|
+
const previousItem = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
132
|
+
const context = (0, factories_1.createTestContext)();
|
|
133
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('test-item'));
|
|
134
|
+
mockHookRunner.runPreRestore.mockResolvedValue(createHookResult('test-item'));
|
|
135
|
+
mockCoreService.restore.mockResolvedValue({ item, previousItem });
|
|
136
|
+
const result = await service.restore('test-item', testUserId, context);
|
|
137
|
+
expect(mockHookRunner.runPreRequest).toHaveBeenCalled();
|
|
138
|
+
expect(mockHookRunner.runPreRestore).toHaveBeenCalled();
|
|
139
|
+
expect(mockCoreService.restore).toHaveBeenCalledWith('test-item', testUserId);
|
|
140
|
+
expect(mockHookRunner.runPostRestore).toHaveBeenCalled();
|
|
141
|
+
expect(mockHookRunner.runPostRequest).toHaveBeenCalled();
|
|
142
|
+
expect(mockEventEmitter.emit).toHaveBeenCalledWith(events_1.DismissibleEvents.ITEM_RESTORED, expect.anything());
|
|
143
|
+
expect(result.item).toEqual(item);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('logging', () => {
|
|
147
|
+
it('should log debug messages for operations', async () => {
|
|
148
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
149
|
+
const context = (0, factories_1.createTestContext)();
|
|
150
|
+
mockHookRunner.runPreRequest.mockResolvedValue(createHookResult('test-item'));
|
|
151
|
+
mockHookRunner.runPreGet.mockResolvedValue(createHookResult('test-item'));
|
|
152
|
+
mockCoreService.get.mockResolvedValue(item);
|
|
153
|
+
await service.getOrCreate('test-item', testUserId, context);
|
|
154
|
+
expect(mockLogger.debug).toHaveBeenCalledWith(expect.stringContaining('getOrCreate called'), expect.any(Object));
|
|
155
|
+
expect(mockLogger.debug).toHaveBeenCalledWith(expect.stringContaining('getOrCreate completed'), expect.any(Object));
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=dismissible.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissible.service.spec.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/core/dismissible.service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { IDismissibleLifecycleHook } from '@dismissible/nestjs-dismissible-hooks';
|
|
2
|
+
import { IDismissibleLogger } from '@dismissible/nestjs-logger';
|
|
3
|
+
import { DismissibleItemDto } from '@dismissible/nestjs-dismissible-item';
|
|
4
|
+
import { IRequestContext } from '@dismissible/nestjs-dismissible-request';
|
|
5
|
+
/**
|
|
6
|
+
* Result from running pre-hooks.
|
|
7
|
+
*/
|
|
8
|
+
export interface IHookRunResult {
|
|
9
|
+
/** Whether the operation should proceed */
|
|
10
|
+
proceed: boolean;
|
|
11
|
+
/** The (potentially mutated) item ID */
|
|
12
|
+
id: string;
|
|
13
|
+
/** The (potentially mutated) user ID */
|
|
14
|
+
userId: string;
|
|
15
|
+
/** The (potentially mutated) request context */
|
|
16
|
+
context?: IRequestContext;
|
|
17
|
+
/** Reason for blocking (if proceed is false) */
|
|
18
|
+
reason?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Service responsible for running lifecycle hooks.
|
|
22
|
+
*/
|
|
23
|
+
export declare class HookRunner {
|
|
24
|
+
private readonly logger;
|
|
25
|
+
private readonly sortedHooks;
|
|
26
|
+
constructor(hooks: IDismissibleLifecycleHook[], logger: IDismissibleLogger);
|
|
27
|
+
/**
|
|
28
|
+
* Run pre-request hooks (global - runs at start of any operation).
|
|
29
|
+
* Use for authentication, rate limiting, request validation.
|
|
30
|
+
*/
|
|
31
|
+
runPreRequest(itemId: string, userId: string, context?: IRequestContext): Promise<IHookRunResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Run post-request hooks (global - runs at end of any operation).
|
|
34
|
+
* Use for audit logging, metrics, cleanup.
|
|
35
|
+
*/
|
|
36
|
+
runPostRequest(itemId: string, item: DismissibleItemDto, userId: string, context?: IRequestContext): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Run pre-get hooks (when item exists and is about to be returned).
|
|
39
|
+
* Receives the item for access control based on item state.
|
|
40
|
+
*/
|
|
41
|
+
runPreGet(itemId: string, item: DismissibleItemDto, userId: string, context?: IRequestContext): Promise<IHookRunResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Run post-get hooks (after item is returned).
|
|
44
|
+
*/
|
|
45
|
+
runPostGet(itemId: string, item: DismissibleItemDto, userId: string, context?: IRequestContext): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Run pre-create hooks.
|
|
48
|
+
*/
|
|
49
|
+
runPreCreate(itemId: string, userId: string, context?: IRequestContext): Promise<IHookRunResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Run post-create hooks.
|
|
52
|
+
*/
|
|
53
|
+
runPostCreate(itemId: string, item: DismissibleItemDto, userId: string, context?: IRequestContext): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Run pre-dismiss hooks.
|
|
56
|
+
*/
|
|
57
|
+
runPreDismiss(itemId: string, userId: string, context?: IRequestContext): Promise<IHookRunResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Run post-dismiss hooks.
|
|
60
|
+
*/
|
|
61
|
+
runPostDismiss(itemId: string, item: DismissibleItemDto, userId: string, context?: IRequestContext): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Run pre-restore hooks.
|
|
64
|
+
*/
|
|
65
|
+
runPreRestore(itemId: string, userId: string, context?: IRequestContext): Promise<IHookRunResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Run post-restore hooks.
|
|
68
|
+
*/
|
|
69
|
+
runPostRestore(itemId: string, item: DismissibleItemDto, userId: string, context?: IRequestContext): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Internal method to run pre-hooks.
|
|
72
|
+
*/
|
|
73
|
+
private runPreHooks;
|
|
74
|
+
/**
|
|
75
|
+
* Internal method to run pre-hooks that receive the item (e.g., onBeforeGet).
|
|
76
|
+
* Unlike standard pre-hooks, these receive the item for inspection/access control.
|
|
77
|
+
*/
|
|
78
|
+
private runPreHooksWithItem;
|
|
79
|
+
/**
|
|
80
|
+
* Internal method to run post-hooks.
|
|
81
|
+
* Post-hooks run in reverse priority order.
|
|
82
|
+
*/
|
|
83
|
+
private runPostHooks;
|
|
84
|
+
/**
|
|
85
|
+
* Throw ForbiddenException if the hook result indicates the operation was blocked.
|
|
86
|
+
*/
|
|
87
|
+
static throwIfBlocked(result: IHookRunResult): void;
|
|
88
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HookRunner = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const nestjs_dismissible_hooks_1 = require("@dismissible/nestjs-dismissible-hooks");
|
|
7
|
+
const nestjs_logger_1 = require("@dismissible/nestjs-logger");
|
|
8
|
+
/**
|
|
9
|
+
* Service responsible for running lifecycle hooks.
|
|
10
|
+
*/
|
|
11
|
+
let HookRunner = class HookRunner {
|
|
12
|
+
constructor(hooks = [], logger) {
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
this.sortedHooks = [...hooks].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Run pre-request hooks (global - runs at start of any operation).
|
|
18
|
+
* Use for authentication, rate limiting, request validation.
|
|
19
|
+
*/
|
|
20
|
+
async runPreRequest(itemId, userId, context) {
|
|
21
|
+
return this.runPreHooks('onBeforeRequest', itemId, userId, context);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run post-request hooks (global - runs at end of any operation).
|
|
25
|
+
* Use for audit logging, metrics, cleanup.
|
|
26
|
+
*/
|
|
27
|
+
async runPostRequest(itemId, item, userId, context) {
|
|
28
|
+
await this.runPostHooks('onAfterRequest', itemId, item, userId, context);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run pre-get hooks (when item exists and is about to be returned).
|
|
32
|
+
* Receives the item for access control based on item state.
|
|
33
|
+
*/
|
|
34
|
+
async runPreGet(itemId, item, userId, context) {
|
|
35
|
+
return this.runPreHooksWithItem('onBeforeGet', itemId, item, userId, context);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run post-get hooks (after item is returned).
|
|
39
|
+
*/
|
|
40
|
+
async runPostGet(itemId, item, userId, context) {
|
|
41
|
+
await this.runPostHooks('onAfterGet', itemId, item, userId, context);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run pre-create hooks.
|
|
45
|
+
*/
|
|
46
|
+
async runPreCreate(itemId, userId, context) {
|
|
47
|
+
return this.runPreHooks('onBeforeCreate', itemId, userId, context);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Run post-create hooks.
|
|
51
|
+
*/
|
|
52
|
+
async runPostCreate(itemId, item, userId, context) {
|
|
53
|
+
await this.runPostHooks('onAfterCreate', itemId, item, userId, context);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run pre-dismiss hooks.
|
|
57
|
+
*/
|
|
58
|
+
async runPreDismiss(itemId, userId, context) {
|
|
59
|
+
return this.runPreHooks('onBeforeDismiss', itemId, userId, context);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Run post-dismiss hooks.
|
|
63
|
+
*/
|
|
64
|
+
async runPostDismiss(itemId, item, userId, context) {
|
|
65
|
+
await this.runPostHooks('onAfterDismiss', itemId, item, userId, context);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Run pre-restore hooks.
|
|
69
|
+
*/
|
|
70
|
+
async runPreRestore(itemId, userId, context) {
|
|
71
|
+
return this.runPreHooks('onBeforeRestore', itemId, userId, context);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Run post-restore hooks.
|
|
75
|
+
*/
|
|
76
|
+
async runPostRestore(itemId, item, userId, context) {
|
|
77
|
+
await this.runPostHooks('onAfterRestore', itemId, item, userId, context);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Internal method to run pre-hooks.
|
|
81
|
+
*/
|
|
82
|
+
async runPreHooks(hookName, itemId, userId, context) {
|
|
83
|
+
let currentId = itemId;
|
|
84
|
+
let currentUserId = userId;
|
|
85
|
+
let currentContext = context ? { ...context } : undefined;
|
|
86
|
+
for (const hook of this.sortedHooks) {
|
|
87
|
+
const hookFn = hook[hookName];
|
|
88
|
+
if (hookFn) {
|
|
89
|
+
try {
|
|
90
|
+
const result = await hookFn.call(hook, currentId, currentUserId, currentContext);
|
|
91
|
+
if (!result.proceed) {
|
|
92
|
+
this.logger.debug(`Hook ${hook.constructor.name}.${hookName} blocked operation`, {
|
|
93
|
+
itemId: currentId,
|
|
94
|
+
userId: currentUserId,
|
|
95
|
+
reason: result.reason,
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
proceed: false,
|
|
99
|
+
id: currentId,
|
|
100
|
+
userId: currentUserId,
|
|
101
|
+
context: currentContext,
|
|
102
|
+
reason: result.reason,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (result.mutations) {
|
|
106
|
+
if (result.mutations.id !== undefined) {
|
|
107
|
+
currentId = result.mutations.id;
|
|
108
|
+
}
|
|
109
|
+
if (result.mutations.userId !== undefined) {
|
|
110
|
+
currentUserId = result.mutations.userId;
|
|
111
|
+
}
|
|
112
|
+
if (result.mutations.context && currentContext) {
|
|
113
|
+
currentContext = { ...currentContext, ...result.mutations.context };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
this.logger.error(`Error in hook ${hook.constructor.name}.${hookName}`, error instanceof Error ? error : new Error(String(error)), {
|
|
119
|
+
itemId: currentId,
|
|
120
|
+
userId: currentUserId,
|
|
121
|
+
});
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
proceed: true,
|
|
128
|
+
id: currentId,
|
|
129
|
+
userId: currentUserId,
|
|
130
|
+
context: currentContext,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Internal method to run pre-hooks that receive the item (e.g., onBeforeGet).
|
|
135
|
+
* Unlike standard pre-hooks, these receive the item for inspection/access control.
|
|
136
|
+
*/
|
|
137
|
+
async runPreHooksWithItem(hookName, itemId, item, userId, context) {
|
|
138
|
+
let currentId = itemId;
|
|
139
|
+
let currentUserId = userId;
|
|
140
|
+
let currentContext = context ? { ...context } : undefined;
|
|
141
|
+
for (const hook of this.sortedHooks) {
|
|
142
|
+
const hookFn = hook[hookName];
|
|
143
|
+
if (hookFn) {
|
|
144
|
+
try {
|
|
145
|
+
const result = await hookFn.call(hook, currentId, item, currentUserId, currentContext);
|
|
146
|
+
if (!result.proceed) {
|
|
147
|
+
this.logger.debug(`Hook ${hook.constructor.name}.${hookName} blocked operation`, {
|
|
148
|
+
itemId: currentId,
|
|
149
|
+
userId: currentUserId,
|
|
150
|
+
reason: result.reason,
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
proceed: false,
|
|
154
|
+
id: currentId,
|
|
155
|
+
userId: currentUserId,
|
|
156
|
+
context: currentContext,
|
|
157
|
+
reason: result.reason,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (result.mutations) {
|
|
161
|
+
if (result.mutations.id !== undefined) {
|
|
162
|
+
currentId = result.mutations.id;
|
|
163
|
+
}
|
|
164
|
+
if (result.mutations.userId !== undefined) {
|
|
165
|
+
currentUserId = result.mutations.userId;
|
|
166
|
+
}
|
|
167
|
+
if (result.mutations.context && currentContext) {
|
|
168
|
+
currentContext = { ...currentContext, ...result.mutations.context };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
this.logger.error(`Error in hook ${hook.constructor.name}.${hookName}`, error instanceof Error ? error : new Error(String(error)), {
|
|
174
|
+
itemId: currentId,
|
|
175
|
+
userId: currentUserId,
|
|
176
|
+
});
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
proceed: true,
|
|
183
|
+
id: currentId,
|
|
184
|
+
userId: currentUserId,
|
|
185
|
+
context: currentContext,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Internal method to run post-hooks.
|
|
190
|
+
* Post-hooks run in reverse priority order.
|
|
191
|
+
*/
|
|
192
|
+
async runPostHooks(hookName, itemId, item, userId, context) {
|
|
193
|
+
const reversedHooks = [...this.sortedHooks].reverse();
|
|
194
|
+
for (const hook of reversedHooks) {
|
|
195
|
+
const hookFn = hook[hookName];
|
|
196
|
+
if (hookFn) {
|
|
197
|
+
try {
|
|
198
|
+
await hookFn.call(hook, itemId, item, userId, context);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.logger.error(`Error in hook ${hook.constructor.name}.${hookName}`, error instanceof Error ? error : new Error(String(error)), {
|
|
202
|
+
itemId,
|
|
203
|
+
userId,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Throw ForbiddenException if the hook result indicates the operation was blocked.
|
|
211
|
+
*/
|
|
212
|
+
static throwIfBlocked(result) {
|
|
213
|
+
if (!result.proceed) {
|
|
214
|
+
throw new common_1.ForbiddenException(result.reason ?? 'Operation blocked by lifecycle hook');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
exports.HookRunner = HookRunner;
|
|
219
|
+
exports.HookRunner = HookRunner = tslib_1.__decorate([
|
|
220
|
+
(0, common_1.Injectable)(),
|
|
221
|
+
tslib_1.__param(0, (0, common_1.Optional)()),
|
|
222
|
+
tslib_1.__param(0, (0, common_1.Inject)(nestjs_dismissible_hooks_1.DISMISSIBLE_HOOKS)),
|
|
223
|
+
tslib_1.__param(1, (0, common_1.Inject)(nestjs_logger_1.DISMISSIBLE_LOGGER)),
|
|
224
|
+
tslib_1.__metadata("design:paramtypes", [Array, Object])
|
|
225
|
+
], HookRunner);
|
|
226
|
+
//# sourceMappingURL=hook-runner.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-runner.service.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/core/hook-runner.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|