@dismissible/nestjs-dismissible 0.0.2-canary.738340d.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.
Files changed (223) hide show
  1. package/README.md +58 -74
  2. package/package.json +23 -18
  3. package/src/api/dismissible-item-response.dto.d.ts +9 -0
  4. package/src/api/dismissible-item-response.dto.js +40 -0
  5. package/src/api/dismissible-item-response.dto.js.map +1 -0
  6. package/src/api/dismissible-item.mapper.d.ts +12 -0
  7. package/src/api/dismissible-item.mapper.js +30 -0
  8. package/src/api/dismissible-item.mapper.js.map +1 -0
  9. package/src/api/dismissible-item.mapper.spec.d.ts +1 -0
  10. package/src/api/dismissible-item.mapper.spec.js +43 -0
  11. package/src/api/dismissible-item.mapper.spec.js.map +1 -0
  12. package/src/api/{index.ts → index.d.ts} +1 -4
  13. package/src/api/index.js +8 -0
  14. package/src/api/index.js.map +1 -0
  15. package/src/api/use-cases/{api-tags.constants.ts → api-tags.constants.d.ts} +1 -1
  16. package/src/api/use-cases/api-tags.constants.js +8 -0
  17. package/src/api/use-cases/api-tags.constants.js.map +1 -0
  18. package/src/api/use-cases/dismiss/dismiss.controller.d.ts +15 -0
  19. package/src/api/use-cases/dismiss/dismiss.controller.js +74 -0
  20. package/src/api/use-cases/dismiss/dismiss.controller.js.map +1 -0
  21. package/src/api/use-cases/dismiss/dismiss.controller.spec.d.ts +1 -0
  22. package/src/api/use-cases/dismiss/dismiss.controller.spec.js +37 -0
  23. package/src/api/use-cases/dismiss/dismiss.controller.spec.js.map +1 -0
  24. package/src/api/use-cases/dismiss/dismiss.response.dto.d.ts +12 -0
  25. package/src/api/use-cases/dismiss/dismiss.response.dto.js +12 -0
  26. package/src/api/use-cases/dismiss/dismiss.response.dto.js.map +1 -0
  27. package/src/api/use-cases/dismiss/index.js +6 -0
  28. package/src/api/use-cases/dismiss/index.js.map +1 -0
  29. package/src/api/use-cases/get-or-create/get-or-create.controller.d.ts +15 -0
  30. package/src/api/use-cases/get-or-create/get-or-create.controller.js +70 -0
  31. package/src/api/use-cases/get-or-create/get-or-create.controller.js.map +1 -0
  32. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.d.ts +1 -0
  33. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js +32 -0
  34. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js.map +1 -0
  35. package/src/api/use-cases/get-or-create/get-or-create.response.dto.d.ts +12 -0
  36. package/src/api/use-cases/get-or-create/get-or-create.response.dto.js +12 -0
  37. package/src/api/use-cases/get-or-create/get-or-create.response.dto.js.map +1 -0
  38. package/src/api/use-cases/get-or-create/{index.ts → index.d.ts} +0 -1
  39. package/src/api/use-cases/get-or-create/index.js +6 -0
  40. package/src/api/use-cases/get-or-create/index.js.map +1 -0
  41. package/src/api/use-cases/index.js +7 -0
  42. package/src/api/use-cases/index.js.map +1 -0
  43. package/src/api/use-cases/restore/index.js +6 -0
  44. package/src/api/use-cases/restore/index.js.map +1 -0
  45. package/src/api/use-cases/restore/restore.controller.d.ts +15 -0
  46. package/src/api/use-cases/restore/restore.controller.js +74 -0
  47. package/src/api/use-cases/restore/restore.controller.js.map +1 -0
  48. package/src/api/use-cases/restore/restore.controller.spec.d.ts +1 -0
  49. package/src/api/use-cases/restore/restore.controller.spec.js +37 -0
  50. package/src/api/use-cases/restore/restore.controller.spec.js.map +1 -0
  51. package/src/api/use-cases/restore/restore.response.dto.d.ts +12 -0
  52. package/src/api/use-cases/restore/restore.response.dto.js +12 -0
  53. package/src/api/use-cases/restore/restore.response.dto.js.map +1 -0
  54. package/src/api/validation/index.d.ts +2 -0
  55. package/src/api/validation/index.js +6 -0
  56. package/src/api/validation/index.js.map +1 -0
  57. package/src/api/validation/param-validation.pipe.d.ts +11 -0
  58. package/src/api/validation/param-validation.pipe.js +36 -0
  59. package/src/api/validation/param-validation.pipe.js.map +1 -0
  60. package/src/api/validation/param-validation.pipe.spec.d.ts +1 -0
  61. package/src/api/validation/param-validation.pipe.spec.js +269 -0
  62. package/src/api/validation/param-validation.pipe.spec.js.map +1 -0
  63. package/src/api/validation/param.decorators.d.ts +28 -0
  64. package/src/api/validation/param.decorators.js +36 -0
  65. package/src/api/validation/param.decorators.js.map +1 -0
  66. package/src/core/dismissible-core.service.d.ts +56 -0
  67. package/src/core/dismissible-core.service.js +147 -0
  68. package/src/core/dismissible-core.service.js.map +1 -0
  69. package/src/core/dismissible-core.service.spec.d.ts +1 -0
  70. package/src/core/dismissible-core.service.spec.js +309 -0
  71. package/src/core/dismissible-core.service.spec.js.map +1 -0
  72. package/src/core/dismissible.service.d.ts +45 -0
  73. package/src/core/dismissible.service.js +127 -0
  74. package/src/core/dismissible.service.js.map +1 -0
  75. package/src/core/dismissible.service.spec.d.ts +1 -0
  76. package/src/core/dismissible.service.spec.js +159 -0
  77. package/src/core/dismissible.service.spec.js.map +1 -0
  78. package/src/core/hook-runner.service.d.ts +88 -0
  79. package/src/core/hook-runner.service.js +226 -0
  80. package/src/core/hook-runner.service.js.map +1 -0
  81. package/src/core/hook-runner.service.spec.d.ts +1 -0
  82. package/src/core/hook-runner.service.spec.js +538 -0
  83. package/src/core/hook-runner.service.spec.js.map +1 -0
  84. package/src/core/{index.ts → index.d.ts} +0 -1
  85. package/src/core/index.js +9 -0
  86. package/src/core/index.js.map +1 -0
  87. package/src/core/lifecycle-hook.interface.d.ts +1 -0
  88. package/src/core/lifecycle-hook.interface.js +7 -0
  89. package/src/core/lifecycle-hook.interface.js.map +1 -0
  90. package/src/core/service-responses.interface.d.ts +28 -0
  91. package/src/core/service-responses.interface.js +3 -0
  92. package/src/core/service-responses.interface.js.map +1 -0
  93. package/src/dismissible.module.d.ts +13 -0
  94. package/src/dismissible.module.integration.spec.d.ts +1 -0
  95. package/src/dismissible.module.integration.spec.js +529 -0
  96. package/src/dismissible.module.integration.spec.js.map +1 -0
  97. package/src/dismissible.module.js +77 -0
  98. package/src/dismissible.module.js.map +1 -0
  99. package/src/events/dismissible.events.d.ts +45 -0
  100. package/src/events/dismissible.events.js +53 -0
  101. package/src/events/dismissible.events.js.map +1 -0
  102. package/src/events/events.constants.d.ts +17 -0
  103. package/src/events/events.constants.js +17 -0
  104. package/src/events/events.constants.js.map +1 -0
  105. package/src/events/index.js +6 -0
  106. package/src/events/index.js.map +1 -0
  107. package/src/exceptions/dismissible.exceptions.d.ts +26 -0
  108. package/src/exceptions/dismissible.exceptions.js +49 -0
  109. package/src/exceptions/dismissible.exceptions.js.map +1 -0
  110. package/src/exceptions/dismissible.exceptions.spec.d.ts +1 -0
  111. package/src/exceptions/dismissible.exceptions.spec.js +40 -0
  112. package/src/exceptions/dismissible.exceptions.spec.js.map +1 -0
  113. package/src/exceptions/index.js +5 -0
  114. package/src/exceptions/index.js.map +1 -0
  115. package/src/{index.ts → index.d.ts} +1 -1
  116. package/src/index.js +12 -0
  117. package/src/index.js.map +1 -0
  118. package/src/response/dtos/base-response.dto.d.ts +6 -0
  119. package/src/response/dtos/base-response.dto.js +18 -0
  120. package/src/response/dtos/base-response.dto.js.map +1 -0
  121. package/src/response/dtos/error-response.dto.d.ts +19 -0
  122. package/src/response/dtos/error-response.dto.js +39 -0
  123. package/src/response/dtos/error-response.dto.js.map +1 -0
  124. package/src/response/dtos/index.js +7 -0
  125. package/src/response/dtos/index.js.map +1 -0
  126. package/src/response/dtos/{success-response.dto.ts → success-response.dto.d.ts} +6 -12
  127. package/src/response/dtos/success-response.dto.js +34 -0
  128. package/src/response/dtos/success-response.dto.js.map +1 -0
  129. package/src/response/http-exception-filter.d.ts +4 -0
  130. package/src/response/http-exception-filter.js +24 -0
  131. package/src/response/http-exception-filter.js.map +1 -0
  132. package/src/response/http-exception-filter.spec.d.ts +1 -0
  133. package/src/response/http-exception-filter.spec.js +137 -0
  134. package/src/response/http-exception-filter.spec.js.map +1 -0
  135. package/src/response/index.js +8 -0
  136. package/src/response/index.js.map +1 -0
  137. package/src/response/response.module.d.ts +2 -0
  138. package/src/response/response.module.js +17 -0
  139. package/src/response/response.module.js.map +1 -0
  140. package/src/response/response.service.d.ts +6 -0
  141. package/src/response/response.service.js +25 -0
  142. package/src/response/response.service.js.map +1 -0
  143. package/src/response/response.service.spec.d.ts +1 -0
  144. package/src/response/response.service.spec.js +58 -0
  145. package/src/response/response.service.spec.js.map +1 -0
  146. package/src/testing/factories.d.ts +14 -0
  147. package/src/testing/factories.js +58 -0
  148. package/src/testing/factories.js.map +1 -0
  149. package/src/testing/index.js +5 -0
  150. package/src/testing/index.js.map +1 -0
  151. package/src/utils/date/date.service.d.ts +8 -0
  152. package/src/utils/date/date.service.js +24 -0
  153. package/src/utils/date/date.service.js.map +1 -0
  154. package/src/utils/date/date.service.spec.d.ts +1 -0
  155. package/src/utils/date/date.service.spec.js +83 -0
  156. package/src/utils/date/date.service.spec.js.map +1 -0
  157. package/src/utils/date/index.js +5 -0
  158. package/src/utils/date/index.js.map +1 -0
  159. package/src/utils/dismissible.helper.d.ts +4 -0
  160. package/src/utils/dismissible.helper.js +15 -0
  161. package/src/utils/dismissible.helper.js.map +1 -0
  162. package/src/utils/index.js +7 -0
  163. package/src/utils/index.js.map +1 -0
  164. package/src/validation/dismissible-input.dto.d.ts +21 -0
  165. package/src/validation/dismissible-input.dto.js +54 -0
  166. package/src/validation/dismissible-input.dto.js.map +1 -0
  167. package/src/validation/index.d.ts +1 -0
  168. package/src/validation/index.js +5 -0
  169. package/src/validation/index.js.map +1 -0
  170. package/jest.config.ts +0 -29
  171. package/project.json +0 -42
  172. package/src/api/dismissible-item-response.dto.ts +0 -38
  173. package/src/api/dismissible-item.mapper.spec.ts +0 -63
  174. package/src/api/dismissible-item.mapper.ts +0 -33
  175. package/src/api/use-cases/dismiss/dismiss.controller.spec.ts +0 -42
  176. package/src/api/use-cases/dismiss/dismiss.controller.ts +0 -63
  177. package/src/api/use-cases/dismiss/dismiss.response.dto.ts +0 -7
  178. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.ts +0 -76
  179. package/src/api/use-cases/get-or-create/get-or-create.controller.ts +0 -106
  180. package/src/api/use-cases/get-or-create/get-or-create.request.dto.ts +0 -17
  181. package/src/api/use-cases/get-or-create/get-or-create.response.dto.ts +0 -7
  182. package/src/api/use-cases/restore/restore.controller.spec.ts +0 -42
  183. package/src/api/use-cases/restore/restore.controller.ts +0 -63
  184. package/src/api/use-cases/restore/restore.response.dto.ts +0 -7
  185. package/src/core/create-options.ts +0 -9
  186. package/src/core/dismissible-core.service.spec.ts +0 -357
  187. package/src/core/dismissible-core.service.ts +0 -161
  188. package/src/core/dismissible.service.spec.ts +0 -144
  189. package/src/core/dismissible.service.ts +0 -188
  190. package/src/core/hook-runner.service.spec.ts +0 -304
  191. package/src/core/hook-runner.service.ts +0 -267
  192. package/src/core/lifecycle-hook.interface.ts +0 -122
  193. package/src/core/service-responses.interface.ts +0 -34
  194. package/src/dismissible.module.ts +0 -83
  195. package/src/events/dismissible.events.ts +0 -105
  196. package/src/events/events.constants.ts +0 -21
  197. package/src/exceptions/dismissible.exceptions.spec.ts +0 -50
  198. package/src/exceptions/dismissible.exceptions.ts +0 -69
  199. package/src/request/index.ts +0 -2
  200. package/src/request/request-context.decorator.ts +0 -14
  201. package/src/request/request-context.interface.ts +0 -6
  202. package/src/response/dtos/base-response.dto.ts +0 -11
  203. package/src/response/dtos/error-response.dto.ts +0 -36
  204. package/src/response/http-exception-filter.ts +0 -21
  205. package/src/response/response.module.ts +0 -9
  206. package/src/response/response.service.spec.ts +0 -86
  207. package/src/response/response.service.ts +0 -20
  208. package/src/testing/factories.ts +0 -45
  209. package/src/utils/date/date.service.spec.ts +0 -104
  210. package/src/utils/date/date.service.ts +0 -19
  211. package/src/utils/dismissible.helper.ts +0 -9
  212. package/tsconfig.json +0 -13
  213. package/tsconfig.lib.json +0 -14
  214. /package/src/api/use-cases/dismiss/{index.ts → index.d.ts} +0 -0
  215. /package/src/api/use-cases/{index.ts → index.d.ts} +0 -0
  216. /package/src/api/use-cases/restore/{index.ts → index.d.ts} +0 -0
  217. /package/src/events/{index.ts → index.d.ts} +0 -0
  218. /package/src/exceptions/{index.ts → index.d.ts} +0 -0
  219. /package/src/response/dtos/{index.ts → index.d.ts} +0 -0
  220. /package/src/response/{index.ts → index.d.ts} +0 -0
  221. /package/src/testing/{index.ts → index.d.ts} +0 -0
  222. /package/src/utils/date/{index.ts → index.d.ts} +0 -0
  223. /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":";;AAAA,mDAAsC;AACtC,yDAAsD;AACtD,+DAA2D;AAC3D,yEAAoE;AACpE,+DAAmE;AAEnE,sEAAmE;AACnE,sCAA8C;AAC9C,oDAAyE;AAEzE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,OAA2B,CAAC;IAChC,IAAI,eAAoD,CAAC;IACzD,IAAI,cAAuC,CAAC;IAC5C,IAAI,gBAA4C,CAAC;IACjD,IAAI,UAA2C,CAAC;IAChD,IAAI,qBAAqD,CAAC;IAE1D,MAAM,UAAU,GAAG,cAAc,CAAC;IAElC,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAE,MAAM,GAAG,UAAU,EAAkB,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI;QACb,EAAE;QACF,MAAM;QACN,OAAO,EAAE,IAAA,6BAAiB,GAAE;KAC7B,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,eAAe,GAAG,IAAA,qBAAI,EAAC,iDAAsB,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,cAAc,GAAG,IAAA,qBAAI,EAAC,gCAAU,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,gBAAgB,GAAG,IAAA,qBAAI,EAAC,6BAAa,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,UAAU,GAAG,IAAA,qBAAI,EAAqB,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,qBAAqB,GAAG,IAAA,qBAAI,EAAC,qCAAiB,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;QAElF,qBAAqB,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAW,CAAC,CAAC;QAEjE,OAAO,GAAG,IAAI,wCAAkB,CAC9B,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;YAClF,cAAc,CAAC,SAAS,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;YAC9E,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAE/E,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC9E,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACnD,eAAe,EACf,IAAI,EACJ,UAAU,EACV,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC3D,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAChD,0BAAiB,CAAC,cAAc,EAChC,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YACpC,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7E,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC5C,cAAc,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACxD,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC/B,OAAO,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,eAAe,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACnD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAE1E,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvD,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5E,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAChD,0BAAiB,CAAC,YAAY,EAC9B,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7E,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC5C,cAAc,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBAC5C,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,oBAAoB;gBAC5B,EAAE,EAAE,UAAU;gBACd,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,IAAA,6BAAiB,GAAE;aAC7B,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAErF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC5D,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,oBAAoB,CACpD,0BAAiB,CAAC,YAAY,EAC9B,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;YAClF,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC5C,cAAc,CAAC,SAAS,CAAC,iBAAiB,CAAC;gBACzC,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,oBAAoB;gBAC5B,EAAE,EAAE,eAAe;gBACnB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,IAAA,6BAAiB,GAAE;aAC7B,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAE1F,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC7D,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,oBAAoB,CACpD,0BAAiB,CAAC,cAAc,EAChC,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,eAAe,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAEvE,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAC9E,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAChD,0BAAiB,CAAC,cAAc,EAChC,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,eAAe,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAEvE,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAC9E,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAChD,0BAAiB,CAAC,aAAa,EAC/B,MAAM,CAAC,QAAQ,EAAE,CAClB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,cAAc,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,cAAc,CAAC,SAAS,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC1E,eAAe,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAE5D,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAC7C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,EAChD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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 {};