@dismissible/nestjs-dismissible 0.0.1

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 (179) hide show
  1. package/README.md +490 -0
  2. package/package.json +68 -0
  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.d.ts +4 -0
  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.d.ts +4 -0
  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.d.ts +2 -0
  28. package/src/api/use-cases/dismiss/index.js +6 -0
  29. package/src/api/use-cases/dismiss/index.js.map +1 -0
  30. package/src/api/use-cases/get-or-create/get-or-create.controller.d.ts +15 -0
  31. package/src/api/use-cases/get-or-create/get-or-create.controller.js +70 -0
  32. package/src/api/use-cases/get-or-create/get-or-create.controller.js.map +1 -0
  33. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.d.ts +1 -0
  34. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js +32 -0
  35. package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js.map +1 -0
  36. package/src/api/use-cases/get-or-create/get-or-create.response.dto.d.ts +12 -0
  37. package/src/api/use-cases/get-or-create/get-or-create.response.dto.js +12 -0
  38. package/src/api/use-cases/get-or-create/get-or-create.response.dto.js.map +1 -0
  39. package/src/api/use-cases/get-or-create/index.d.ts +2 -0
  40. package/src/api/use-cases/get-or-create/index.js +6 -0
  41. package/src/api/use-cases/get-or-create/index.js.map +1 -0
  42. package/src/api/use-cases/index.d.ts +3 -0
  43. package/src/api/use-cases/index.js +7 -0
  44. package/src/api/use-cases/index.js.map +1 -0
  45. package/src/api/use-cases/restore/index.d.ts +2 -0
  46. package/src/api/use-cases/restore/index.js +6 -0
  47. package/src/api/use-cases/restore/index.js.map +1 -0
  48. package/src/api/use-cases/restore/restore.controller.d.ts +15 -0
  49. package/src/api/use-cases/restore/restore.controller.js +74 -0
  50. package/src/api/use-cases/restore/restore.controller.js.map +1 -0
  51. package/src/api/use-cases/restore/restore.controller.spec.d.ts +1 -0
  52. package/src/api/use-cases/restore/restore.controller.spec.js +37 -0
  53. package/src/api/use-cases/restore/restore.controller.spec.js.map +1 -0
  54. package/src/api/use-cases/restore/restore.response.dto.d.ts +12 -0
  55. package/src/api/use-cases/restore/restore.response.dto.js +12 -0
  56. package/src/api/use-cases/restore/restore.response.dto.js.map +1 -0
  57. package/src/api/validation/index.d.ts +2 -0
  58. package/src/api/validation/index.js +6 -0
  59. package/src/api/validation/index.js.map +1 -0
  60. package/src/api/validation/param-validation.pipe.d.ts +11 -0
  61. package/src/api/validation/param-validation.pipe.js +36 -0
  62. package/src/api/validation/param-validation.pipe.js.map +1 -0
  63. package/src/api/validation/param-validation.pipe.spec.d.ts +1 -0
  64. package/src/api/validation/param-validation.pipe.spec.js +269 -0
  65. package/src/api/validation/param-validation.pipe.spec.js.map +1 -0
  66. package/src/api/validation/param.decorators.d.ts +28 -0
  67. package/src/api/validation/param.decorators.js +36 -0
  68. package/src/api/validation/param.decorators.js.map +1 -0
  69. package/src/core/dismissible-core.service.d.ts +56 -0
  70. package/src/core/dismissible-core.service.js +147 -0
  71. package/src/core/dismissible-core.service.js.map +1 -0
  72. package/src/core/dismissible-core.service.spec.d.ts +1 -0
  73. package/src/core/dismissible-core.service.spec.js +309 -0
  74. package/src/core/dismissible-core.service.spec.js.map +1 -0
  75. package/src/core/dismissible.service.d.ts +45 -0
  76. package/src/core/dismissible.service.js +127 -0
  77. package/src/core/dismissible.service.js.map +1 -0
  78. package/src/core/dismissible.service.spec.d.ts +1 -0
  79. package/src/core/dismissible.service.spec.js +159 -0
  80. package/src/core/dismissible.service.spec.js.map +1 -0
  81. package/src/core/hook-runner.service.d.ts +88 -0
  82. package/src/core/hook-runner.service.js +226 -0
  83. package/src/core/hook-runner.service.js.map +1 -0
  84. package/src/core/hook-runner.service.spec.d.ts +1 -0
  85. package/src/core/hook-runner.service.spec.js +538 -0
  86. package/src/core/hook-runner.service.spec.js.map +1 -0
  87. package/src/core/index.d.ts +5 -0
  88. package/src/core/index.js +9 -0
  89. package/src/core/index.js.map +1 -0
  90. package/src/core/lifecycle-hook.interface.d.ts +1 -0
  91. package/src/core/lifecycle-hook.interface.js +7 -0
  92. package/src/core/lifecycle-hook.interface.js.map +1 -0
  93. package/src/core/service-responses.interface.d.ts +28 -0
  94. package/src/core/service-responses.interface.js +3 -0
  95. package/src/core/service-responses.interface.js.map +1 -0
  96. package/src/dismissible.module.d.ts +13 -0
  97. package/src/dismissible.module.integration.spec.d.ts +1 -0
  98. package/src/dismissible.module.integration.spec.js +529 -0
  99. package/src/dismissible.module.integration.spec.js.map +1 -0
  100. package/src/dismissible.module.js +77 -0
  101. package/src/dismissible.module.js.map +1 -0
  102. package/src/events/dismissible.events.d.ts +45 -0
  103. package/src/events/dismissible.events.js +53 -0
  104. package/src/events/dismissible.events.js.map +1 -0
  105. package/src/events/events.constants.d.ts +17 -0
  106. package/src/events/events.constants.js +17 -0
  107. package/src/events/events.constants.js.map +1 -0
  108. package/src/events/index.d.ts +2 -0
  109. package/src/events/index.js +6 -0
  110. package/src/events/index.js.map +1 -0
  111. package/src/exceptions/dismissible.exceptions.d.ts +26 -0
  112. package/src/exceptions/dismissible.exceptions.js +49 -0
  113. package/src/exceptions/dismissible.exceptions.js.map +1 -0
  114. package/src/exceptions/dismissible.exceptions.spec.d.ts +1 -0
  115. package/src/exceptions/dismissible.exceptions.spec.js +40 -0
  116. package/src/exceptions/dismissible.exceptions.spec.js.map +1 -0
  117. package/src/exceptions/index.d.ts +1 -0
  118. package/src/exceptions/index.js +5 -0
  119. package/src/exceptions/index.js.map +1 -0
  120. package/src/index.d.ts +8 -0
  121. package/src/index.js +12 -0
  122. package/src/index.js.map +1 -0
  123. package/src/response/dtos/base-response.dto.d.ts +6 -0
  124. package/src/response/dtos/base-response.dto.js +18 -0
  125. package/src/response/dtos/base-response.dto.js.map +1 -0
  126. package/src/response/dtos/error-response.dto.d.ts +19 -0
  127. package/src/response/dtos/error-response.dto.js +39 -0
  128. package/src/response/dtos/error-response.dto.js.map +1 -0
  129. package/src/response/dtos/index.d.ts +3 -0
  130. package/src/response/dtos/index.js +7 -0
  131. package/src/response/dtos/index.js.map +1 -0
  132. package/src/response/dtos/success-response.dto.d.ts +28 -0
  133. package/src/response/dtos/success-response.dto.js +34 -0
  134. package/src/response/dtos/success-response.dto.js.map +1 -0
  135. package/src/response/http-exception-filter.d.ts +4 -0
  136. package/src/response/http-exception-filter.js +24 -0
  137. package/src/response/http-exception-filter.js.map +1 -0
  138. package/src/response/http-exception-filter.spec.d.ts +1 -0
  139. package/src/response/http-exception-filter.spec.js +137 -0
  140. package/src/response/http-exception-filter.spec.js.map +1 -0
  141. package/src/response/index.d.ts +4 -0
  142. package/src/response/index.js +8 -0
  143. package/src/response/index.js.map +1 -0
  144. package/src/response/response.module.d.ts +2 -0
  145. package/src/response/response.module.js +17 -0
  146. package/src/response/response.module.js.map +1 -0
  147. package/src/response/response.service.d.ts +6 -0
  148. package/src/response/response.service.js +25 -0
  149. package/src/response/response.service.js.map +1 -0
  150. package/src/response/response.service.spec.d.ts +1 -0
  151. package/src/response/response.service.spec.js +58 -0
  152. package/src/response/response.service.spec.js.map +1 -0
  153. package/src/testing/factories.d.ts +14 -0
  154. package/src/testing/factories.js +58 -0
  155. package/src/testing/factories.js.map +1 -0
  156. package/src/testing/index.d.ts +1 -0
  157. package/src/testing/index.js +5 -0
  158. package/src/testing/index.js.map +1 -0
  159. package/src/utils/date/date.service.d.ts +8 -0
  160. package/src/utils/date/date.service.js +24 -0
  161. package/src/utils/date/date.service.js.map +1 -0
  162. package/src/utils/date/date.service.spec.d.ts +1 -0
  163. package/src/utils/date/date.service.spec.js +83 -0
  164. package/src/utils/date/date.service.spec.js.map +1 -0
  165. package/src/utils/date/index.d.ts +1 -0
  166. package/src/utils/date/index.js +5 -0
  167. package/src/utils/date/index.js.map +1 -0
  168. package/src/utils/dismissible.helper.d.ts +4 -0
  169. package/src/utils/dismissible.helper.js +15 -0
  170. package/src/utils/dismissible.helper.js.map +1 -0
  171. package/src/utils/index.d.ts +3 -0
  172. package/src/utils/index.js +7 -0
  173. package/src/utils/index.js.map +1 -0
  174. package/src/validation/dismissible-input.dto.d.ts +21 -0
  175. package/src/validation/dismissible-input.dto.js +54 -0
  176. package/src/validation/dismissible-input.dto.js.map +1 -0
  177. package/src/validation/index.d.ts +1 -0
  178. package/src/validation/index.js +5 -0
  179. package/src/validation/index.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-responses.interface.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/core/service-responses.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { DynamicModule, Type } from '@nestjs/common';
2
+ import { IDismissibleLifecycleHook } from '@dismissible/nestjs-dismissible-hooks';
3
+ import { IDismissibleLoggerModuleOptions } from '@dismissible/nestjs-logger';
4
+ import { IDismissibleStorageModuleOptions } from '@dismissible/nestjs-storage';
5
+ /**
6
+ * Module configuration options.
7
+ */
8
+ export type IDismissibleModuleOptions = IDismissibleLoggerModuleOptions & IDismissibleStorageModuleOptions & {
9
+ hooks?: Type<IDismissibleLifecycleHook>[];
10
+ };
11
+ export declare class DismissibleModule {
12
+ static forRoot(options?: IDismissibleModuleOptions): DynamicModule;
13
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,529 @@
1
+ "use strict";
2
+ var TestLifecycleHook_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const testing_1 = require("@nestjs/testing");
6
+ const common_1 = require("@nestjs/common");
7
+ const dismissible_module_1 = require("./dismissible.module");
8
+ const dismissible_service_1 = require("./core/dismissible.service");
9
+ const nestjs_storage_1 = require("@dismissible/nestjs-storage");
10
+ const factories_1 = require("./testing/factories");
11
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
12
+ /**
13
+ * Test hook that tracks all lifecycle method invocations.
14
+ * Each method pushes its name to the `calls` array when invoked.
15
+ */
16
+ let TestLifecycleHook = TestLifecycleHook_1 = class TestLifecycleHook {
17
+ constructor() {
18
+ this.priority = 0;
19
+ }
20
+ static reset() {
21
+ TestLifecycleHook_1.calls = [];
22
+ TestLifecycleHook_1.callArgs = new Map();
23
+ TestLifecycleHook_1.shouldBlock = new Map();
24
+ TestLifecycleHook_1.blockReason = 'Blocked by test hook';
25
+ }
26
+ recordCall(method, args) {
27
+ TestLifecycleHook_1.calls.push(method);
28
+ TestLifecycleHook_1.callArgs.set(method, args);
29
+ const shouldBlock = TestLifecycleHook_1.shouldBlock.get(method) ?? false;
30
+ return {
31
+ proceed: !shouldBlock,
32
+ reason: shouldBlock ? TestLifecycleHook_1.blockReason : undefined,
33
+ };
34
+ }
35
+ recordPostCall(method, args) {
36
+ TestLifecycleHook_1.calls.push(method);
37
+ TestLifecycleHook_1.callArgs.set(method, args);
38
+ }
39
+ async onBeforeRequest(itemId, userId, context) {
40
+ return this.recordCall('onBeforeRequest', [itemId, userId, context]);
41
+ }
42
+ async onAfterRequest(itemId, item, userId, context) {
43
+ this.recordPostCall('onAfterRequest', [itemId, item, userId, context]);
44
+ }
45
+ async onBeforeGet(itemId, item, userId, context) {
46
+ return this.recordCall('onBeforeGet', [itemId, item, userId, context]);
47
+ }
48
+ async onAfterGet(itemId, item, userId, context) {
49
+ this.recordPostCall('onAfterGet', [itemId, item, userId, context]);
50
+ }
51
+ async onBeforeCreate(itemId, userId, context) {
52
+ return this.recordCall('onBeforeCreate', [itemId, userId, context]);
53
+ }
54
+ async onAfterCreate(itemId, item, userId, context) {
55
+ this.recordPostCall('onAfterCreate', [itemId, item, userId, context]);
56
+ }
57
+ async onBeforeDismiss(itemId, userId, context) {
58
+ return this.recordCall('onBeforeDismiss', [itemId, userId, context]);
59
+ }
60
+ async onAfterDismiss(itemId, item, userId, context) {
61
+ this.recordPostCall('onAfterDismiss', [itemId, item, userId, context]);
62
+ }
63
+ async onBeforeRestore(itemId, userId, context) {
64
+ return this.recordCall('onBeforeRestore', [itemId, userId, context]);
65
+ }
66
+ async onAfterRestore(itemId, item, userId, context) {
67
+ this.recordPostCall('onAfterRestore', [itemId, item, userId, context]);
68
+ }
69
+ };
70
+ /** Track all hook method calls in order */
71
+ TestLifecycleHook.calls = [];
72
+ /** Track the arguments passed to each hook */
73
+ TestLifecycleHook.callArgs = new Map();
74
+ /** Control whether hooks should block (proceed: false) */
75
+ TestLifecycleHook.shouldBlock = new Map();
76
+ /** Custom reason for blocking */
77
+ TestLifecycleHook.blockReason = 'Blocked by test hook';
78
+ TestLifecycleHook = TestLifecycleHook_1 = tslib_1.__decorate([
79
+ (0, common_1.Injectable)()
80
+ ], TestLifecycleHook);
81
+ describe('DismissibleModule Integration - Hook Lifecycle', () => {
82
+ let module;
83
+ let service;
84
+ let storage;
85
+ const testUserId = 'test-user-123';
86
+ const testItemId = 'test-item-456';
87
+ beforeAll(async () => {
88
+ const moduleOptions = {
89
+ storage: nestjs_storage_1.StorageModule,
90
+ logger: nestjs_logger_1.NullLogger,
91
+ hooks: [TestLifecycleHook],
92
+ };
93
+ module = await testing_1.Test.createTestingModule({
94
+ imports: [dismissible_module_1.DismissibleModule.forRoot(moduleOptions)],
95
+ }).compile();
96
+ service = module.get(dismissible_service_1.DismissibleService);
97
+ storage = module.get(nestjs_storage_1.DISMISSIBLE_STORAGE_ADAPTER);
98
+ });
99
+ afterAll(async () => {
100
+ await module.close();
101
+ });
102
+ beforeEach(() => {
103
+ TestLifecycleHook.reset();
104
+ storage.clear();
105
+ });
106
+ describe('getOrCreate - Create Flow', () => {
107
+ it('should invoke hooks in correct order when creating a new item', async () => {
108
+ const context = (0, factories_1.createTestContext)();
109
+ await service.getOrCreate(testItemId, testUserId, context);
110
+ expect(TestLifecycleHook.calls).toEqual([
111
+ 'onBeforeRequest',
112
+ 'onBeforeCreate',
113
+ 'onAfterCreate',
114
+ 'onAfterRequest',
115
+ ]);
116
+ });
117
+ it('should pass correct arguments to onBeforeRequest', async () => {
118
+ const context = (0, factories_1.createTestContext)();
119
+ await service.getOrCreate(testItemId, testUserId, context);
120
+ const args = TestLifecycleHook.callArgs.get('onBeforeRequest');
121
+ expect(args).toBeDefined();
122
+ expect(args[0]).toBe(testItemId);
123
+ expect(args[1]).toBe(testUserId);
124
+ expect(args[2]).toEqual(context);
125
+ });
126
+ it('should pass correct arguments to onBeforeCreate', async () => {
127
+ const context = (0, factories_1.createTestContext)();
128
+ await service.getOrCreate(testItemId, testUserId, context);
129
+ const args = TestLifecycleHook.callArgs.get('onBeforeCreate');
130
+ expect(args).toBeDefined();
131
+ expect(args[0]).toBe(testItemId);
132
+ expect(args[1]).toBe(testUserId);
133
+ expect(args[2]).toEqual(context);
134
+ });
135
+ it('should pass correct arguments to onAfterCreate', async () => {
136
+ const context = (0, factories_1.createTestContext)();
137
+ await service.getOrCreate(testItemId, testUserId, context);
138
+ const args = TestLifecycleHook.callArgs.get('onAfterCreate');
139
+ expect(args).toBeDefined();
140
+ expect(args[0]).toBe(testItemId);
141
+ expect(args[1]).toMatchObject({
142
+ id: testItemId,
143
+ userId: testUserId,
144
+ });
145
+ expect(args[2]).toBe(testUserId);
146
+ expect(args[3]).toEqual(context);
147
+ });
148
+ it('should pass correct arguments to onAfterRequest on create', async () => {
149
+ const context = (0, factories_1.createTestContext)();
150
+ await service.getOrCreate(testItemId, testUserId, context);
151
+ const args = TestLifecycleHook.callArgs.get('onAfterRequest');
152
+ expect(args).toBeDefined();
153
+ expect(args[0]).toBe(testItemId);
154
+ expect(args[1]).toMatchObject({
155
+ id: testItemId,
156
+ userId: testUserId,
157
+ });
158
+ expect(args[2]).toBe(testUserId);
159
+ expect(args[3]).toEqual(context);
160
+ });
161
+ it('should block operation when onBeforeRequest returns proceed: false', async () => {
162
+ TestLifecycleHook.shouldBlock.set('onBeforeRequest', true);
163
+ TestLifecycleHook.blockReason = 'Authentication failed';
164
+ await expect(service.getOrCreate(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
165
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest']);
166
+ });
167
+ it('should block operation when onBeforeCreate returns proceed: false', async () => {
168
+ TestLifecycleHook.shouldBlock.set('onBeforeCreate', true);
169
+ TestLifecycleHook.blockReason = 'Quota exceeded';
170
+ await expect(service.getOrCreate(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
171
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest', 'onBeforeCreate']);
172
+ });
173
+ });
174
+ describe('getOrCreate - Get Flow', () => {
175
+ beforeEach(async () => {
176
+ await service.getOrCreate(testItemId, testUserId);
177
+ TestLifecycleHook.reset();
178
+ });
179
+ it('should invoke hooks in correct order when getting an existing item', async () => {
180
+ const context = (0, factories_1.createTestContext)();
181
+ await service.getOrCreate(testItemId, testUserId, context);
182
+ expect(TestLifecycleHook.calls).toEqual([
183
+ 'onBeforeRequest',
184
+ 'onBeforeGet',
185
+ 'onAfterGet',
186
+ 'onAfterRequest',
187
+ ]);
188
+ });
189
+ it('should pass correct arguments to onBeforeGet', async () => {
190
+ const context = (0, factories_1.createTestContext)();
191
+ await service.getOrCreate(testItemId, testUserId, context);
192
+ const args = TestLifecycleHook.callArgs.get('onBeforeGet');
193
+ expect(args).toBeDefined();
194
+ expect(args[0]).toBe(testItemId);
195
+ expect(args[1]).toMatchObject({
196
+ id: testItemId,
197
+ userId: testUserId,
198
+ });
199
+ expect(args[2]).toBe(testUserId);
200
+ expect(args[3]).toEqual(context);
201
+ });
202
+ it('should pass correct arguments to onAfterGet', async () => {
203
+ const context = (0, factories_1.createTestContext)();
204
+ await service.getOrCreate(testItemId, testUserId, context);
205
+ const args = TestLifecycleHook.callArgs.get('onAfterGet');
206
+ expect(args).toBeDefined();
207
+ expect(args[0]).toBe(testItemId);
208
+ expect(args[1]).toMatchObject({
209
+ id: testItemId,
210
+ userId: testUserId,
211
+ });
212
+ expect(args[2]).toBe(testUserId);
213
+ expect(args[3]).toEqual(context);
214
+ });
215
+ it('should block operation when onBeforeGet returns proceed: false', async () => {
216
+ TestLifecycleHook.shouldBlock.set('onBeforeGet', true);
217
+ TestLifecycleHook.blockReason = 'Item access denied';
218
+ await expect(service.getOrCreate(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
219
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest', 'onBeforeGet']);
220
+ });
221
+ });
222
+ describe('dismiss', () => {
223
+ beforeEach(async () => {
224
+ await service.getOrCreate(testItemId, testUserId);
225
+ TestLifecycleHook.reset();
226
+ });
227
+ it('should invoke hooks in correct order when dismissing an item', async () => {
228
+ const context = (0, factories_1.createTestContext)();
229
+ await service.dismiss(testItemId, testUserId, context);
230
+ expect(TestLifecycleHook.calls).toEqual([
231
+ 'onBeforeRequest',
232
+ 'onBeforeDismiss',
233
+ 'onAfterDismiss',
234
+ 'onAfterRequest',
235
+ ]);
236
+ });
237
+ it('should pass correct arguments to onBeforeDismiss', async () => {
238
+ const context = (0, factories_1.createTestContext)();
239
+ await service.dismiss(testItemId, testUserId, context);
240
+ const args = TestLifecycleHook.callArgs.get('onBeforeDismiss');
241
+ expect(args).toBeDefined();
242
+ expect(args[0]).toBe(testItemId);
243
+ expect(args[1]).toBe(testUserId);
244
+ expect(args[2]).toEqual(context);
245
+ });
246
+ it('should pass correct arguments to onAfterDismiss', async () => {
247
+ const context = (0, factories_1.createTestContext)();
248
+ await service.dismiss(testItemId, testUserId, context);
249
+ const args = TestLifecycleHook.callArgs.get('onAfterDismiss');
250
+ expect(args).toBeDefined();
251
+ expect(args[0]).toBe(testItemId);
252
+ expect(args[1]).toMatchObject({
253
+ id: testItemId,
254
+ userId: testUserId,
255
+ dismissedAt: expect.any(Date),
256
+ });
257
+ expect(args[2]).toBe(testUserId);
258
+ expect(args[3]).toEqual(context);
259
+ });
260
+ it('should block operation when onBeforeDismiss returns proceed: false', async () => {
261
+ TestLifecycleHook.shouldBlock.set('onBeforeDismiss', true);
262
+ TestLifecycleHook.blockReason = 'Cannot dismiss protected item';
263
+ await expect(service.dismiss(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
264
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest', 'onBeforeDismiss']);
265
+ });
266
+ it('should not run dismiss hooks when onBeforeRequest blocks', async () => {
267
+ TestLifecycleHook.shouldBlock.set('onBeforeRequest', true);
268
+ await expect(service.dismiss(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
269
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest']);
270
+ expect(TestLifecycleHook.calls).not.toContain('onBeforeDismiss');
271
+ });
272
+ });
273
+ describe('restore', () => {
274
+ beforeEach(async () => {
275
+ await service.getOrCreate(testItemId, testUserId);
276
+ await service.dismiss(testItemId, testUserId);
277
+ TestLifecycleHook.reset();
278
+ });
279
+ it('should invoke hooks in correct order when restoring an item', async () => {
280
+ const context = (0, factories_1.createTestContext)();
281
+ await service.restore(testItemId, testUserId, context);
282
+ expect(TestLifecycleHook.calls).toEqual([
283
+ 'onBeforeRequest',
284
+ 'onBeforeRestore',
285
+ 'onAfterRestore',
286
+ 'onAfterRequest',
287
+ ]);
288
+ });
289
+ it('should pass correct arguments to onBeforeRestore', async () => {
290
+ const context = (0, factories_1.createTestContext)();
291
+ await service.restore(testItemId, testUserId, context);
292
+ const args = TestLifecycleHook.callArgs.get('onBeforeRestore');
293
+ expect(args).toBeDefined();
294
+ expect(args[0]).toBe(testItemId);
295
+ expect(args[1]).toBe(testUserId);
296
+ expect(args[2]).toEqual(context);
297
+ });
298
+ it('should pass correct arguments to onAfterRestore', async () => {
299
+ const context = (0, factories_1.createTestContext)();
300
+ await service.restore(testItemId, testUserId, context);
301
+ const args = TestLifecycleHook.callArgs.get('onAfterRestore');
302
+ expect(args).toBeDefined();
303
+ expect(args[0]).toBe(testItemId);
304
+ expect(args[1]).toMatchObject({
305
+ id: testItemId,
306
+ userId: testUserId,
307
+ });
308
+ expect(args[1].dismissedAt).toBeUndefined();
309
+ expect(args[2]).toBe(testUserId);
310
+ expect(args[3]).toEqual(context);
311
+ });
312
+ it('should block operation when onBeforeRestore returns proceed: false', async () => {
313
+ TestLifecycleHook.shouldBlock.set('onBeforeRestore', true);
314
+ TestLifecycleHook.blockReason = 'Cannot restore archived item';
315
+ await expect(service.restore(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
316
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest', 'onBeforeRestore']);
317
+ });
318
+ it('should not run restore hooks when onBeforeRequest blocks', async () => {
319
+ TestLifecycleHook.shouldBlock.set('onBeforeRequest', true);
320
+ await expect(service.restore(testItemId, testUserId)).rejects.toThrow(common_1.ForbiddenException);
321
+ expect(TestLifecycleHook.calls).toEqual(['onBeforeRequest']);
322
+ expect(TestLifecycleHook.calls).not.toContain('onBeforeRestore');
323
+ });
324
+ });
325
+ describe('full lifecycle flow', () => {
326
+ it('should invoke all hook types through create -> dismiss -> restore cycle', async () => {
327
+ const context = (0, factories_1.createTestContext)();
328
+ const allCalls = [];
329
+ await service.getOrCreate(testItemId, testUserId, context);
330
+ allCalls.push(...TestLifecycleHook.calls);
331
+ TestLifecycleHook.reset();
332
+ await service.getOrCreate(testItemId, testUserId, context);
333
+ allCalls.push(...TestLifecycleHook.calls);
334
+ TestLifecycleHook.reset();
335
+ await service.dismiss(testItemId, testUserId, context);
336
+ allCalls.push(...TestLifecycleHook.calls);
337
+ TestLifecycleHook.reset();
338
+ await service.restore(testItemId, testUserId, context);
339
+ allCalls.push(...TestLifecycleHook.calls);
340
+ expect(allCalls).toContain('onBeforeRequest');
341
+ expect(allCalls).toContain('onAfterRequest');
342
+ expect(allCalls).toContain('onBeforeCreate');
343
+ expect(allCalls).toContain('onAfterCreate');
344
+ expect(allCalls).toContain('onBeforeGet');
345
+ expect(allCalls).toContain('onAfterGet');
346
+ expect(allCalls).toContain('onBeforeDismiss');
347
+ expect(allCalls).toContain('onAfterDismiss');
348
+ expect(allCalls).toContain('onBeforeRestore');
349
+ expect(allCalls).toContain('onAfterRestore');
350
+ });
351
+ });
352
+ describe('context handling', () => {
353
+ it('should pass undefined context through hooks when not provided', async () => {
354
+ await service.getOrCreate(testItemId, testUserId);
355
+ const args = TestLifecycleHook.callArgs.get('onBeforeRequest');
356
+ expect(args[2]).toBeUndefined();
357
+ });
358
+ it('should preserve context through the entire hook chain', async () => {
359
+ const context = {
360
+ requestId: 'unique-request-id',
361
+ headers: { authorization: 'Bearer test-token' },
362
+ query: {},
363
+ params: {},
364
+ body: {},
365
+ user: {},
366
+ ip: '127.0.0.1',
367
+ method: 'GET',
368
+ url: '/test',
369
+ protocol: 'http',
370
+ secure: false,
371
+ hostname: 'localhost',
372
+ port: 3000,
373
+ path: '/test',
374
+ search: '',
375
+ searchParams: {},
376
+ origin: 'http://localhost:3000',
377
+ referer: '',
378
+ userAgent: 'test-agent',
379
+ };
380
+ await service.getOrCreate(testItemId, testUserId, context);
381
+ const beforeRequestArgs = TestLifecycleHook.callArgs.get('onBeforeRequest');
382
+ const beforeCreateArgs = TestLifecycleHook.callArgs.get('onBeforeCreate');
383
+ const afterCreateArgs = TestLifecycleHook.callArgs.get('onAfterCreate');
384
+ const afterRequestArgs = TestLifecycleHook.callArgs.get('onAfterRequest');
385
+ expect(beforeRequestArgs[2]).toEqual(context);
386
+ expect(beforeCreateArgs[2]).toEqual(context);
387
+ expect(afterCreateArgs[3]).toEqual(context);
388
+ expect(afterRequestArgs[3]).toEqual(context);
389
+ });
390
+ it('should pass context to all hooks', async () => {
391
+ const context = (0, factories_1.createTestContext)();
392
+ await service.getOrCreate(testItemId, testUserId);
393
+ TestLifecycleHook.reset();
394
+ await service.getOrCreate(testItemId, testUserId, context);
395
+ const beforeRequestArgs = TestLifecycleHook.callArgs.get('onBeforeRequest');
396
+ expect(beforeRequestArgs[2]).toEqual(context);
397
+ const beforeGetArgs = TestLifecycleHook.callArgs.get('onBeforeGet');
398
+ expect(beforeGetArgs[3]).toEqual(context);
399
+ const afterGetArgs = TestLifecycleHook.callArgs.get('onAfterGet');
400
+ expect(afterGetArgs[3]).toEqual(context);
401
+ const afterRequestArgs = TestLifecycleHook.callArgs.get('onAfterRequest');
402
+ expect(afterRequestArgs[3]).toEqual(context);
403
+ });
404
+ });
405
+ });
406
+ describe('DismissibleModule Integration - Multiple Hooks', () => {
407
+ let module;
408
+ let service;
409
+ let storage;
410
+ const testUserId = 'test-user-123';
411
+ const testItemId = 'test-item-456';
412
+ const executionOrder = [];
413
+ let FirstHook = class FirstHook {
414
+ constructor() {
415
+ this.priority = 1;
416
+ }
417
+ async onBeforeRequest() {
418
+ executionOrder.push('FirstHook:onBeforeRequest');
419
+ return { proceed: true };
420
+ }
421
+ async onAfterRequest() {
422
+ executionOrder.push('FirstHook:onAfterRequest');
423
+ }
424
+ };
425
+ FirstHook = tslib_1.__decorate([
426
+ (0, common_1.Injectable)()
427
+ ], FirstHook);
428
+ let SecondHook = class SecondHook {
429
+ constructor() {
430
+ this.priority = 2;
431
+ }
432
+ async onBeforeRequest() {
433
+ executionOrder.push('SecondHook:onBeforeRequest');
434
+ return { proceed: true };
435
+ }
436
+ async onAfterRequest() {
437
+ executionOrder.push('SecondHook:onAfterRequest');
438
+ }
439
+ };
440
+ SecondHook = tslib_1.__decorate([
441
+ (0, common_1.Injectable)()
442
+ ], SecondHook);
443
+ let ThirdHook = class ThirdHook {
444
+ constructor() {
445
+ this.priority = 3;
446
+ }
447
+ async onBeforeRequest() {
448
+ executionOrder.push('ThirdHook:onBeforeRequest');
449
+ return { proceed: true };
450
+ }
451
+ async onAfterRequest() {
452
+ executionOrder.push('ThirdHook:onAfterRequest');
453
+ }
454
+ };
455
+ ThirdHook = tslib_1.__decorate([
456
+ (0, common_1.Injectable)()
457
+ ], ThirdHook);
458
+ beforeAll(async () => {
459
+ const moduleOptions = {
460
+ storage: nestjs_storage_1.StorageModule,
461
+ hooks: [ThirdHook, FirstHook, SecondHook], // Intentionally out of order
462
+ };
463
+ module = await testing_1.Test.createTestingModule({
464
+ imports: [dismissible_module_1.DismissibleModule.forRoot(moduleOptions)],
465
+ }).compile();
466
+ service = module.get(dismissible_service_1.DismissibleService);
467
+ storage = module.get(nestjs_storage_1.DISMISSIBLE_STORAGE_ADAPTER);
468
+ });
469
+ afterAll(async () => {
470
+ await module.close();
471
+ });
472
+ beforeEach(() => {
473
+ executionOrder.length = 0;
474
+ storage.clear();
475
+ });
476
+ it('should execute pre-hooks in priority order (low to high)', async () => {
477
+ await service.getOrCreate(testItemId, testUserId);
478
+ const preHooks = executionOrder.filter((call) => call.includes('onBeforeRequest'));
479
+ expect(preHooks).toEqual([
480
+ 'FirstHook:onBeforeRequest',
481
+ 'SecondHook:onBeforeRequest',
482
+ 'ThirdHook:onBeforeRequest',
483
+ ]);
484
+ });
485
+ it('should execute post-hooks in reverse priority order (high to low)', async () => {
486
+ await service.getOrCreate(testItemId, testUserId);
487
+ const postHooks = executionOrder.filter((call) => call.includes('onAfterRequest'));
488
+ expect(postHooks).toEqual([
489
+ 'ThirdHook:onAfterRequest',
490
+ 'SecondHook:onAfterRequest',
491
+ 'FirstHook:onAfterRequest',
492
+ ]);
493
+ });
494
+ });
495
+ describe('DismissibleModule Integration - No Hooks', () => {
496
+ let module;
497
+ let service;
498
+ let storage;
499
+ const testUserId = 'test-user-123';
500
+ const testItemId = 'test-item-456';
501
+ beforeAll(async () => {
502
+ const moduleOptions = {
503
+ storage: nestjs_storage_1.StorageModule,
504
+ };
505
+ module = await testing_1.Test.createTestingModule({
506
+ imports: [dismissible_module_1.DismissibleModule.forRoot(moduleOptions)],
507
+ }).compile();
508
+ service = module.get(dismissible_service_1.DismissibleService);
509
+ storage = module.get(nestjs_storage_1.DISMISSIBLE_STORAGE_ADAPTER);
510
+ });
511
+ afterAll(async () => {
512
+ await module.close();
513
+ });
514
+ beforeEach(() => {
515
+ storage.clear();
516
+ });
517
+ it('should complete operations without hooks', async () => {
518
+ const createResult = await service.getOrCreate(testItemId, testUserId);
519
+ expect(createResult.created).toBe(true);
520
+ expect(createResult.item.id).toBe(testItemId);
521
+ const getResult = await service.getOrCreate(testItemId, testUserId);
522
+ expect(getResult.created).toBe(false);
523
+ const dismissResult = await service.dismiss(testItemId, testUserId);
524
+ expect(dismissResult.item.dismissedAt).toBeDefined();
525
+ const restoreResult = await service.restore(testItemId, testUserId);
526
+ expect(restoreResult.item.dismissedAt).toBeUndefined();
527
+ });
528
+ });
529
+ //# sourceMappingURL=dismissible.module.integration.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismissible.module.integration.spec.js","sourceRoot":"","sources":["../../../../libs/dismissible/src/dismissible.module.integration.spec.ts"],"names":[],"mappings":"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"}