@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,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@nestjs/common");
4
+ const param_validation_pipe_1 = require("./param-validation.pipe");
5
+ const dismissible_input_dto_1 = require("../../validation/dismissible-input.dto");
6
+ describe('ParamValidationPipe', () => {
7
+ let pipe;
8
+ beforeEach(() => {
9
+ pipe = new param_validation_pipe_1.ParamValidationPipe();
10
+ });
11
+ describe('valid values', () => {
12
+ it('should pass validation for a valid alphanumeric string', () => {
13
+ const metadata = {
14
+ type: 'param',
15
+ data: 'userId',
16
+ };
17
+ const result = pipe.transform('user123', metadata);
18
+ expect(result).toBe('user123');
19
+ });
20
+ it('should pass validation for a string with dashes', () => {
21
+ const metadata = {
22
+ type: 'param',
23
+ data: 'itemId',
24
+ };
25
+ const result = pipe.transform('item-123', metadata);
26
+ expect(result).toBe('item-123');
27
+ });
28
+ it('should pass validation for a string with underscores', () => {
29
+ const metadata = {
30
+ type: 'param',
31
+ data: 'userId',
32
+ };
33
+ const result = pipe.transform('user_123', metadata);
34
+ expect(result).toBe('user_123');
35
+ });
36
+ it('should pass validation for a string with mixed valid characters', () => {
37
+ const metadata = {
38
+ type: 'param',
39
+ data: 'itemId',
40
+ };
41
+ const result = pipe.transform('item-123_test', metadata);
42
+ expect(result).toBe('item-123_test');
43
+ });
44
+ it('should pass validation for minimum length (1 character)', () => {
45
+ const metadata = {
46
+ type: 'param',
47
+ data: 'userId',
48
+ };
49
+ const result = pipe.transform('a', metadata);
50
+ expect(result).toBe('a');
51
+ });
52
+ it('should pass validation for maximum length (64 characters)', () => {
53
+ const metadata = {
54
+ type: 'param',
55
+ data: 'itemId',
56
+ };
57
+ const validMaxLength = 'a'.repeat(dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH);
58
+ const result = pipe.transform(validMaxLength, metadata);
59
+ expect(result).toBe(validMaxLength);
60
+ });
61
+ });
62
+ describe('empty or null values', () => {
63
+ it('should throw BadRequestException for empty string', () => {
64
+ const metadata = {
65
+ type: 'param',
66
+ data: 'userId',
67
+ };
68
+ expect(() => pipe.transform('', metadata)).toThrow(common_1.BadRequestException);
69
+ expect(() => pipe.transform('', metadata)).toThrow('userId is required');
70
+ });
71
+ it('should throw BadRequestException for whitespace-only string', () => {
72
+ const metadata = {
73
+ type: 'param',
74
+ data: 'itemId',
75
+ };
76
+ expect(() => pipe.transform(' ', metadata)).toThrow(common_1.BadRequestException);
77
+ expect(() => pipe.transform(' ', metadata)).toThrow('itemId is required');
78
+ });
79
+ it('should throw BadRequestException for null value', () => {
80
+ const metadata = {
81
+ type: 'param',
82
+ data: 'userId',
83
+ };
84
+ expect(() => pipe.transform(null, metadata)).toThrow(common_1.BadRequestException);
85
+ expect(() => pipe.transform(null, metadata)).toThrow('userId is required');
86
+ });
87
+ it('should throw BadRequestException for undefined value', () => {
88
+ const metadata = {
89
+ type: 'param',
90
+ data: 'itemId',
91
+ };
92
+ expect(() => pipe.transform(undefined, metadata)).toThrow(common_1.BadRequestException);
93
+ expect(() => pipe.transform(undefined, metadata)).toThrow('itemId is required');
94
+ });
95
+ it('should use default parameter name when metadata.data is not provided', () => {
96
+ const metadata = {
97
+ type: 'param',
98
+ };
99
+ expect(() => pipe.transform('', metadata)).toThrow(common_1.BadRequestException);
100
+ expect(() => pipe.transform('', metadata)).toThrow('parameter is required');
101
+ });
102
+ });
103
+ describe('length validation', () => {
104
+ it('should throw BadRequestException for value below minimum length', () => {
105
+ const metadata = {
106
+ type: 'param',
107
+ data: 'userId',
108
+ };
109
+ expect(() => pipe.transform('', metadata)).toThrow(common_1.BadRequestException);
110
+ });
111
+ it('should throw BadRequestException for value exceeding maximum length', () => {
112
+ const metadata = {
113
+ type: 'param',
114
+ data: 'itemId',
115
+ };
116
+ const tooLong = 'a'.repeat(dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH + 1);
117
+ expect(() => pipe.transform(tooLong, metadata)).toThrow(common_1.BadRequestException);
118
+ expect(() => pipe.transform(tooLong, metadata)).toThrow(`itemId must be at most ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH} characters`);
119
+ });
120
+ });
121
+ describe('pattern validation', () => {
122
+ it('should throw BadRequestException for string with spaces', () => {
123
+ const metadata = {
124
+ type: 'param',
125
+ data: 'userId',
126
+ };
127
+ expect(() => pipe.transform('user 123', metadata)).toThrow(common_1.BadRequestException);
128
+ expect(() => pipe.transform('user 123', metadata)).toThrow(`userId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
129
+ });
130
+ it('should throw BadRequestException for string with special characters', () => {
131
+ const metadata = {
132
+ type: 'param',
133
+ data: 'itemId',
134
+ };
135
+ expect(() => pipe.transform('item@123', metadata)).toThrow(common_1.BadRequestException);
136
+ expect(() => pipe.transform('item@123', metadata)).toThrow(`itemId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
137
+ });
138
+ it('should throw BadRequestException for string with dots', () => {
139
+ const metadata = {
140
+ type: 'param',
141
+ data: 'userId',
142
+ };
143
+ expect(() => pipe.transform('user.123', metadata)).toThrow(common_1.BadRequestException);
144
+ expect(() => pipe.transform('user.123', metadata)).toThrow(`userId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
145
+ });
146
+ it('should throw BadRequestException for string with slashes', () => {
147
+ const metadata = {
148
+ type: 'param',
149
+ data: 'itemId',
150
+ };
151
+ expect(() => pipe.transform('item/123', metadata)).toThrow(common_1.BadRequestException);
152
+ expect(() => pipe.transform('item/123', metadata)).toThrow(`itemId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
153
+ });
154
+ it('should throw BadRequestException for string with unicode characters', () => {
155
+ const metadata = {
156
+ type: 'param',
157
+ data: 'userId',
158
+ };
159
+ expect(() => pipe.transform('userñ123', metadata)).toThrow(common_1.BadRequestException);
160
+ expect(() => pipe.transform('userñ123', metadata)).toThrow(`userId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
161
+ });
162
+ it('should throw BadRequestException for string starting with invalid character', () => {
163
+ const metadata = {
164
+ type: 'param',
165
+ data: 'itemId',
166
+ };
167
+ expect(() => pipe.transform('@item123', metadata)).toThrow(common_1.BadRequestException);
168
+ expect(() => pipe.transform('@item123', metadata)).toThrow(`itemId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
169
+ });
170
+ it('should throw BadRequestException for string ending with invalid character', () => {
171
+ const metadata = {
172
+ type: 'param',
173
+ data: 'userId',
174
+ };
175
+ expect(() => pipe.transform('user123#', metadata)).toThrow(common_1.BadRequestException);
176
+ expect(() => pipe.transform('user123#', metadata)).toThrow(`userId ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
177
+ });
178
+ });
179
+ describe('error messages', () => {
180
+ it('should include parameter name in required error message', () => {
181
+ const metadata = {
182
+ type: 'param',
183
+ data: 'customParam',
184
+ };
185
+ try {
186
+ pipe.transform('', metadata);
187
+ fail('Should have thrown BadRequestException');
188
+ }
189
+ catch (error) {
190
+ expect(error).toBeInstanceOf(common_1.BadRequestException);
191
+ expect(error.message).toBe('customParam is required');
192
+ }
193
+ });
194
+ it('should include parameter name in length error message', () => {
195
+ const metadata = {
196
+ type: 'param',
197
+ data: 'testParam',
198
+ };
199
+ const tooLong = 'a'.repeat(dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH + 1);
200
+ try {
201
+ pipe.transform(tooLong, metadata);
202
+ fail('Should have thrown BadRequestException');
203
+ }
204
+ catch (error) {
205
+ expect(error).toBeInstanceOf(common_1.BadRequestException);
206
+ expect(error.message).toContain('testParam');
207
+ expect(error.message).toContain(`must be at most ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH} characters`);
208
+ }
209
+ });
210
+ it('should include parameter name in pattern error message', () => {
211
+ const metadata = {
212
+ type: 'param',
213
+ data: 'myParam',
214
+ };
215
+ try {
216
+ pipe.transform('invalid@value', metadata);
217
+ fail('Should have thrown BadRequestException');
218
+ }
219
+ catch (error) {
220
+ expect(error).toBeInstanceOf(common_1.BadRequestException);
221
+ expect(error.message).toContain('myParam');
222
+ expect(error.message).toContain(dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE);
223
+ }
224
+ });
225
+ });
226
+ describe('edge cases', () => {
227
+ it('should handle numeric-only strings', () => {
228
+ const metadata = {
229
+ type: 'param',
230
+ data: 'itemId',
231
+ };
232
+ const result = pipe.transform('123456', metadata);
233
+ expect(result).toBe('123456');
234
+ });
235
+ it('should handle uppercase letters', () => {
236
+ const metadata = {
237
+ type: 'param',
238
+ data: 'userId',
239
+ };
240
+ const result = pipe.transform('USER123', metadata);
241
+ expect(result).toBe('USER123');
242
+ });
243
+ it('should handle lowercase letters', () => {
244
+ const metadata = {
245
+ type: 'param',
246
+ data: 'itemId',
247
+ };
248
+ const result = pipe.transform('user123', metadata);
249
+ expect(result).toBe('user123');
250
+ });
251
+ it('should handle mixed case letters', () => {
252
+ const metadata = {
253
+ type: 'param',
254
+ data: 'userId',
255
+ };
256
+ const result = pipe.transform('User123Item', metadata);
257
+ expect(result).toBe('User123Item');
258
+ });
259
+ it('should handle string with only dashes and underscores', () => {
260
+ const metadata = {
261
+ type: 'param',
262
+ data: 'itemId',
263
+ };
264
+ const result = pipe.transform('_-', metadata);
265
+ expect(result).toBe('_-');
266
+ });
267
+ });
268
+ });
269
+ //# sourceMappingURL=param-validation.pipe.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-validation.pipe.spec.js","sourceRoot":"","sources":["../../../../../../libs/dismissible/src/api/validation/param-validation.pipe.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Custom parameter decorator for userId.
3
+ * Combines @Param('userId') with ParamValidationPipe for validation.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * @Get(':itemId')
8
+ * async getOrCreate(
9
+ * @UserId() userId: string,
10
+ * @ItemId() itemId: string,
11
+ * )
12
+ * ```
13
+ */
14
+ export declare const UserId: () => ParameterDecorator;
15
+ /**
16
+ * Custom parameter decorator for itemId.
17
+ * Combines @Param('itemId') with ParamValidationPipe for validation.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * @Get(':itemId')
22
+ * async getOrCreate(
23
+ * @UserId() userId: string,
24
+ * @ItemId() itemId: string,
25
+ * )
26
+ * ```
27
+ */
28
+ export declare const ItemId: () => ParameterDecorator;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ItemId = exports.UserId = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const param_validation_pipe_1 = require("./param-validation.pipe");
6
+ /**
7
+ * Custom parameter decorator for userId.
8
+ * Combines @Param('userId') with ParamValidationPipe for validation.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * @Get(':itemId')
13
+ * async getOrCreate(
14
+ * @UserId() userId: string,
15
+ * @ItemId() itemId: string,
16
+ * )
17
+ * ```
18
+ */
19
+ const UserId = () => (0, common_1.Param)('userId', param_validation_pipe_1.ParamValidationPipe);
20
+ exports.UserId = UserId;
21
+ /**
22
+ * Custom parameter decorator for itemId.
23
+ * Combines @Param('itemId') with ParamValidationPipe for validation.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * @Get(':itemId')
28
+ * async getOrCreate(
29
+ * @UserId() userId: string,
30
+ * @ItemId() itemId: string,
31
+ * )
32
+ * ```
33
+ */
34
+ const ItemId = () => (0, common_1.Param)('itemId', param_validation_pipe_1.ParamValidationPipe);
35
+ exports.ItemId = ItemId;
36
+ //# sourceMappingURL=param.decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param.decorators.js","sourceRoot":"","sources":["../../../../../../libs/dismissible/src/api/validation/param.decorators.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AACvC,mEAA8D;AAE9D;;;;;;;;;;;;GAYG;AACI,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,cAAK,EAAC,QAAQ,EAAE,2CAAmB,CAAC,CAAC;AAApD,QAAA,MAAM,UAA8C;AAEjE;;;;;;;;;;;;GAYG;AACI,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,cAAK,EAAC,QAAQ,EAAE,2CAAmB,CAAC,CAAC;AAApD,QAAA,MAAM,UAA8C"}
@@ -0,0 +1,56 @@
1
+ import { IDismissibleStorage } from '@dismissible/nestjs-storage';
2
+ import { IGetOrCreateServiceResponse, IDismissServiceResponse, IRestoreServiceResponse } from './service-responses.interface';
3
+ import { DismissibleHelper } from '../utils/dismissible.helper';
4
+ import { DateService } from '../utils/date/date.service';
5
+ import { IDismissibleLogger } from '@dismissible/nestjs-logger';
6
+ import { ValidationService } from '@dismissible/nestjs-validation';
7
+ import { DismissibleItemDto, DismissibleItemFactory } from '@dismissible/nestjs-dismissible-item';
8
+ /**
9
+ * Core business logic service for dismissible operations.
10
+ * Handles pure CRUD operations without side effects (hooks, events).
11
+ */
12
+ export declare class DismissibleCoreService {
13
+ private readonly storage;
14
+ private readonly dateService;
15
+ private readonly logger;
16
+ private readonly itemFactory;
17
+ private readonly validationService;
18
+ private readonly dismissibleHelper;
19
+ constructor(storage: IDismissibleStorage, dateService: DateService, logger: IDismissibleLogger, itemFactory: DismissibleItemFactory, validationService: ValidationService, dismissibleHelper: DismissibleHelper);
20
+ /**
21
+ * Get an existing item by user ID and item ID.
22
+ * @param itemId The item identifier
23
+ * @param userId The user identifier (required)
24
+ * @returns The item or null if not found
25
+ */
26
+ get(itemId: string, userId: string): Promise<DismissibleItemDto | null>;
27
+ /**
28
+ * Create a new item.
29
+ * @param itemId The item identifier
30
+ * @param userId The user identifier (required)
31
+ * @returns The created item
32
+ */
33
+ create(itemId: string, userId: string): Promise<DismissibleItemDto>;
34
+ /**
35
+ * Get an existing item or create a new one.
36
+ * @param itemId The item identifier
37
+ * @param userId The user identifier (required)
38
+ */
39
+ getOrCreate(itemId: string, userId: string): Promise<IGetOrCreateServiceResponse>;
40
+ /**
41
+ * Dismiss an item.
42
+ * @param itemId The item identifier
43
+ * @param userId The user identifier (required)
44
+ * @throws ItemNotFoundException if item doesn't exist
45
+ * @throws ItemAlreadyDismissedException if item is already dismissed
46
+ */
47
+ dismiss(itemId: string, userId: string): Promise<IDismissServiceResponse>;
48
+ /**
49
+ * Restore a dismissed item.
50
+ * @param itemId The item identifier
51
+ * @param userId The user identifier (required)
52
+ * @throws ItemNotFoundException if item doesn't exist
53
+ * @throws ItemNotDismissedException if item is not dismissed
54
+ */
55
+ restore(itemId: string, userId: string): Promise<IRestoreServiceResponse>;
56
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DismissibleCoreService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const nestjs_storage_1 = require("@dismissible/nestjs-storage");
7
+ const dismissible_helper_1 = require("../utils/dismissible.helper");
8
+ const date_service_1 = require("../utils/date/date.service");
9
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
10
+ const exceptions_1 = require("../exceptions");
11
+ const nestjs_validation_1 = require("@dismissible/nestjs-validation");
12
+ const nestjs_dismissible_item_1 = require("@dismissible/nestjs-dismissible-item");
13
+ /**
14
+ * Core business logic service for dismissible operations.
15
+ * Handles pure CRUD operations without side effects (hooks, events).
16
+ */
17
+ let DismissibleCoreService = class DismissibleCoreService {
18
+ constructor(storage, dateService, logger, itemFactory, validationService, dismissibleHelper) {
19
+ this.storage = storage;
20
+ this.dateService = dateService;
21
+ this.logger = logger;
22
+ this.itemFactory = itemFactory;
23
+ this.validationService = validationService;
24
+ this.dismissibleHelper = dismissibleHelper;
25
+ }
26
+ /**
27
+ * Get an existing item by user ID and item ID.
28
+ * @param itemId The item identifier
29
+ * @param userId The user identifier (required)
30
+ * @returns The item or null if not found
31
+ */
32
+ async get(itemId, userId) {
33
+ this.logger.debug(`Looking up item in storage`, { itemId, userId });
34
+ const item = await this.storage.get(userId, itemId);
35
+ if (item) {
36
+ this.logger.debug(`Found existing item`, { itemId, userId });
37
+ }
38
+ return item;
39
+ }
40
+ /**
41
+ * Create a new item.
42
+ * @param itemId The item identifier
43
+ * @param userId The user identifier (required)
44
+ * @returns The created item
45
+ */
46
+ async create(itemId, userId) {
47
+ this.logger.debug(`Creating new item`, {
48
+ itemId,
49
+ userId,
50
+ });
51
+ const now = this.dateService.getNow();
52
+ const newItem = this.itemFactory.create({
53
+ id: itemId,
54
+ createdAt: now,
55
+ userId,
56
+ });
57
+ await this.validationService.validateInstance(newItem);
58
+ const createdItem = await this.storage.create(newItem);
59
+ this.logger.info(`Created new dismissible item`, { itemId, userId });
60
+ return createdItem;
61
+ }
62
+ /**
63
+ * Get an existing item or create a new one.
64
+ * @param itemId The item identifier
65
+ * @param userId The user identifier (required)
66
+ */
67
+ async getOrCreate(itemId, userId) {
68
+ const existingItem = await this.get(itemId, userId);
69
+ if (existingItem) {
70
+ return {
71
+ item: existingItem,
72
+ created: false,
73
+ };
74
+ }
75
+ const createdItem = await this.create(itemId, userId);
76
+ return {
77
+ item: createdItem,
78
+ created: true,
79
+ };
80
+ }
81
+ /**
82
+ * Dismiss an item.
83
+ * @param itemId The item identifier
84
+ * @param userId The user identifier (required)
85
+ * @throws ItemNotFoundException if item doesn't exist
86
+ * @throws ItemAlreadyDismissedException if item is already dismissed
87
+ */
88
+ async dismiss(itemId, userId) {
89
+ this.logger.debug(`Attempting to dismiss item`, { itemId, userId });
90
+ const existingItem = await this.storage.get(userId, itemId);
91
+ if (!existingItem) {
92
+ this.logger.warn(`Cannot dismiss: item not found`, { itemId, userId });
93
+ throw new exceptions_1.ItemNotFoundException(itemId);
94
+ }
95
+ if (this.dismissibleHelper.isDismissed(existingItem)) {
96
+ this.logger.warn(`Cannot dismiss: item already dismissed`, { itemId, userId });
97
+ throw new exceptions_1.ItemAlreadyDismissedException(itemId);
98
+ }
99
+ const previousItem = this.itemFactory.clone(existingItem);
100
+ const dismissedItem = this.itemFactory.createDismissed(existingItem, this.dateService.getNow());
101
+ await this.validationService.validateInstance(dismissedItem);
102
+ const updatedItem = await this.storage.update(dismissedItem);
103
+ this.logger.info(`Item dismissed`, { itemId, userId });
104
+ return {
105
+ item: updatedItem,
106
+ previousItem,
107
+ };
108
+ }
109
+ /**
110
+ * Restore a dismissed item.
111
+ * @param itemId The item identifier
112
+ * @param userId The user identifier (required)
113
+ * @throws ItemNotFoundException if item doesn't exist
114
+ * @throws ItemNotDismissedException if item is not dismissed
115
+ */
116
+ async restore(itemId, userId) {
117
+ this.logger.debug(`Attempting to restore item`, { itemId, userId });
118
+ const existingItem = await this.storage.get(userId, itemId);
119
+ if (!existingItem) {
120
+ this.logger.warn(`Cannot restore: item not found`, { itemId, userId });
121
+ throw new exceptions_1.ItemNotFoundException(itemId);
122
+ }
123
+ if (!this.dismissibleHelper.isDismissed(existingItem)) {
124
+ this.logger.warn(`Cannot restore: item not dismissed`, { itemId, userId });
125
+ throw new exceptions_1.ItemNotDismissedException(itemId);
126
+ }
127
+ const previousItem = this.itemFactory.clone(existingItem);
128
+ const restoredItem = this.itemFactory.createRestored(existingItem);
129
+ await this.validationService.validateInstance(restoredItem);
130
+ const updatedItem = await this.storage.update(restoredItem);
131
+ this.logger.info(`Item restored`, { itemId, userId });
132
+ return {
133
+ item: updatedItem,
134
+ previousItem,
135
+ };
136
+ }
137
+ };
138
+ exports.DismissibleCoreService = DismissibleCoreService;
139
+ exports.DismissibleCoreService = DismissibleCoreService = tslib_1.__decorate([
140
+ (0, common_1.Injectable)(),
141
+ tslib_1.__param(0, (0, common_1.Inject)(nestjs_storage_1.DISMISSIBLE_STORAGE_ADAPTER)),
142
+ tslib_1.__param(2, (0, common_1.Inject)(nestjs_logger_1.DISMISSIBLE_LOGGER)),
143
+ tslib_1.__metadata("design:paramtypes", [Object, date_service_1.DateService, Object, nestjs_dismissible_item_1.DismissibleItemFactory,
144
+ nestjs_validation_1.ValidationService,
145
+ dismissible_helper_1.DismissibleHelper])
146
+ ], DismissibleCoreService);
147
+ //# sourceMappingURL=dismissible-core.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismissible-core.service.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/core/dismissible-core.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};