@dismissible/nestjs-dismissible 0.1.0-canary.4b708a5.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 (169) hide show
  1. package/package.json +64 -0
  2. package/src/api/dismissible-item-response.dto.d.ts +10 -0
  3. package/src/api/dismissible-item-response.dto.js +49 -0
  4. package/src/api/dismissible-item-response.dto.js.map +1 -0
  5. package/src/api/dismissible-item.mapper.d.ts +12 -0
  6. package/src/api/dismissible-item.mapper.js +33 -0
  7. package/src/api/dismissible-item.mapper.js.map +1 -0
  8. package/src/api/dismissible-item.mapper.spec.d.ts +1 -0
  9. package/src/api/dismissible-item.mapper.spec.js +52 -0
  10. package/src/api/dismissible-item.mapper.spec.js.map +1 -0
  11. package/src/api/index.d.ts +4 -0
  12. package/src/api/index.js +10 -0
  13. package/src/api/index.js.map +1 -0
  14. package/src/api/use-cases/api-tags.constants.d.ts +4 -0
  15. package/src/api/use-cases/api-tags.constants.js +8 -0
  16. package/src/api/use-cases/api-tags.constants.js.map +1 -0
  17. package/src/api/use-cases/dismiss/dismiss.controller.d.ts +16 -0
  18. package/src/api/use-cases/dismiss/dismiss.controller.js +73 -0
  19. package/src/api/use-cases/dismiss/dismiss.controller.js.map +1 -0
  20. package/src/api/use-cases/dismiss/dismiss.controller.spec.d.ts +1 -0
  21. package/src/api/use-cases/dismiss/dismiss.controller.spec.js +37 -0
  22. package/src/api/use-cases/dismiss/dismiss.controller.spec.js.map +1 -0
  23. package/src/api/use-cases/dismiss/dismiss.response.dto.d.ts +12 -0
  24. package/src/api/use-cases/dismiss/dismiss.response.dto.js +12 -0
  25. package/src/api/use-cases/dismiss/dismiss.response.dto.js.map +1 -0
  26. package/src/api/use-cases/dismiss/index.d.ts +2 -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 +21 -0
  30. package/src/api/use-cases/get-or-create/get-or-create.controller.js +104 -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 +53 -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.request.dto.d.ts +6 -0
  36. package/src/api/use-cases/get-or-create/get-or-create.request.dto.js +24 -0
  37. package/src/api/use-cases/get-or-create/get-or-create.request.dto.js.map +1 -0
  38. package/src/api/use-cases/get-or-create/get-or-create.response.dto.d.ts +12 -0
  39. package/src/api/use-cases/get-or-create/get-or-create.response.dto.js +12 -0
  40. package/src/api/use-cases/get-or-create/get-or-create.response.dto.js.map +1 -0
  41. package/src/api/use-cases/get-or-create/index.d.ts +3 -0
  42. package/src/api/use-cases/get-or-create/index.js +7 -0
  43. package/src/api/use-cases/get-or-create/index.js.map +1 -0
  44. package/src/api/use-cases/index.d.ts +3 -0
  45. package/src/api/use-cases/index.js +7 -0
  46. package/src/api/use-cases/index.js.map +1 -0
  47. package/src/api/use-cases/restore/index.d.ts +2 -0
  48. package/src/api/use-cases/restore/index.js +6 -0
  49. package/src/api/use-cases/restore/index.js.map +1 -0
  50. package/src/api/use-cases/restore/restore.controller.d.ts +16 -0
  51. package/src/api/use-cases/restore/restore.controller.js +73 -0
  52. package/src/api/use-cases/restore/restore.controller.js.map +1 -0
  53. package/src/api/use-cases/restore/restore.controller.spec.d.ts +1 -0
  54. package/src/api/use-cases/restore/restore.controller.spec.js +37 -0
  55. package/src/api/use-cases/restore/restore.controller.spec.js.map +1 -0
  56. package/src/api/use-cases/restore/restore.response.dto.d.ts +12 -0
  57. package/src/api/use-cases/restore/restore.response.dto.js +12 -0
  58. package/src/api/use-cases/restore/restore.response.dto.js.map +1 -0
  59. package/src/core/create-options.d.ts +8 -0
  60. package/src/core/create-options.js +3 -0
  61. package/src/core/create-options.js.map +1 -0
  62. package/src/core/dismissible-core.service.d.ts +44 -0
  63. package/src/core/dismissible-core.service.js +132 -0
  64. package/src/core/dismissible-core.service.js.map +1 -0
  65. package/src/core/dismissible-core.service.spec.d.ts +1 -0
  66. package/src/core/dismissible-core.service.spec.js +277 -0
  67. package/src/core/dismissible-core.service.spec.js.map +1 -0
  68. package/src/core/dismissible.service.d.ts +41 -0
  69. package/src/core/dismissible.service.js +114 -0
  70. package/src/core/dismissible.service.js.map +1 -0
  71. package/src/core/dismissible.service.spec.d.ts +1 -0
  72. package/src/core/dismissible.service.spec.js +98 -0
  73. package/src/core/dismissible.service.spec.js.map +1 -0
  74. package/src/core/hook-runner.service.d.ts +72 -0
  75. package/src/core/hook-runner.service.js +160 -0
  76. package/src/core/hook-runner.service.js.map +1 -0
  77. package/src/core/hook-runner.service.spec.d.ts +1 -0
  78. package/src/core/hook-runner.service.spec.js +214 -0
  79. package/src/core/hook-runner.service.spec.js.map +1 -0
  80. package/src/core/index.d.ts +6 -0
  81. package/src/core/index.js +10 -0
  82. package/src/core/index.js.map +1 -0
  83. package/src/core/lifecycle-hook.interface.d.ts +70 -0
  84. package/src/core/lifecycle-hook.interface.js +8 -0
  85. package/src/core/lifecycle-hook.interface.js.map +1 -0
  86. package/src/core/service-responses.interface.d.ts +28 -0
  87. package/src/core/service-responses.interface.js +3 -0
  88. package/src/core/service-responses.interface.js.map +1 -0
  89. package/src/dismissible.module.d.ts +14 -0
  90. package/src/dismissible.module.js +77 -0
  91. package/src/dismissible.module.js.map +1 -0
  92. package/src/events/dismissible.events.d.ts +45 -0
  93. package/src/events/dismissible.events.js +53 -0
  94. package/src/events/dismissible.events.js.map +1 -0
  95. package/src/events/events.constants.d.ts +17 -0
  96. package/src/events/events.constants.js +17 -0
  97. package/src/events/events.constants.js.map +1 -0
  98. package/src/events/index.d.ts +2 -0
  99. package/src/events/index.js +6 -0
  100. package/src/events/index.js.map +1 -0
  101. package/src/exceptions/dismissible.exceptions.d.ts +26 -0
  102. package/src/exceptions/dismissible.exceptions.js +49 -0
  103. package/src/exceptions/dismissible.exceptions.js.map +1 -0
  104. package/src/exceptions/dismissible.exceptions.spec.d.ts +1 -0
  105. package/src/exceptions/dismissible.exceptions.spec.js +40 -0
  106. package/src/exceptions/dismissible.exceptions.spec.js.map +1 -0
  107. package/src/exceptions/index.d.ts +1 -0
  108. package/src/exceptions/index.js +5 -0
  109. package/src/exceptions/index.js.map +1 -0
  110. package/src/index.d.ts +8 -0
  111. package/src/index.js +12 -0
  112. package/src/index.js.map +1 -0
  113. package/src/request/index.d.ts +2 -0
  114. package/src/request/index.js +6 -0
  115. package/src/request/index.js.map +1 -0
  116. package/src/request/request-context.decorator.d.ts +1 -0
  117. package/src/request/request-context.decorator.js +13 -0
  118. package/src/request/request-context.decorator.js.map +1 -0
  119. package/src/request/request-context.interface.d.ts +6 -0
  120. package/src/request/request-context.interface.js +3 -0
  121. package/src/request/request-context.interface.js.map +1 -0
  122. package/src/response/dtos/base-response.dto.d.ts +6 -0
  123. package/src/response/dtos/base-response.dto.js +18 -0
  124. package/src/response/dtos/base-response.dto.js.map +1 -0
  125. package/src/response/dtos/error-response.dto.d.ts +19 -0
  126. package/src/response/dtos/error-response.dto.js +39 -0
  127. package/src/response/dtos/error-response.dto.js.map +1 -0
  128. package/src/response/dtos/index.d.ts +3 -0
  129. package/src/response/dtos/index.js +7 -0
  130. package/src/response/dtos/index.js.map +1 -0
  131. package/src/response/dtos/success-response.dto.d.ts +28 -0
  132. package/src/response/dtos/success-response.dto.js +34 -0
  133. package/src/response/dtos/success-response.dto.js.map +1 -0
  134. package/src/response/http-exception-filter.d.ts +4 -0
  135. package/src/response/http-exception-filter.js +24 -0
  136. package/src/response/http-exception-filter.js.map +1 -0
  137. package/src/response/index.d.ts +4 -0
  138. package/src/response/index.js +8 -0
  139. package/src/response/index.js.map +1 -0
  140. package/src/response/response.module.d.ts +2 -0
  141. package/src/response/response.module.js +17 -0
  142. package/src/response/response.module.js.map +1 -0
  143. package/src/response/response.service.d.ts +6 -0
  144. package/src/response/response.service.js +25 -0
  145. package/src/response/response.service.js.map +1 -0
  146. package/src/response/response.service.spec.d.ts +1 -0
  147. package/src/response/response.service.spec.js +72 -0
  148. package/src/response/response.service.spec.js.map +1 -0
  149. package/src/testing/factories.d.ts +14 -0
  150. package/src/testing/factories.js +41 -0
  151. package/src/testing/factories.js.map +1 -0
  152. package/src/testing/index.d.ts +1 -0
  153. package/src/testing/index.js +5 -0
  154. package/src/testing/index.js.map +1 -0
  155. package/src/utils/date/date.service.d.ts +8 -0
  156. package/src/utils/date/date.service.js +24 -0
  157. package/src/utils/date/date.service.js.map +1 -0
  158. package/src/utils/date/date.service.spec.d.ts +1 -0
  159. package/src/utils/date/date.service.spec.js +83 -0
  160. package/src/utils/date/date.service.spec.js.map +1 -0
  161. package/src/utils/date/index.d.ts +1 -0
  162. package/src/utils/date/index.js +5 -0
  163. package/src/utils/date/index.js.map +1 -0
  164. package/src/utils/dismissible.helper.d.ts +4 -0
  165. package/src/utils/dismissible.helper.js +15 -0
  166. package/src/utils/dismissible.helper.js.map +1 -0
  167. package/src/utils/index.d.ts +3 -0
  168. package/src/utils/index.js +7 -0
  169. package/src/utils/index.js.map +1 -0
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@dismissible/nestjs-dismissible",
3
+ "version": "0.1.0-canary.4b708a5.0",
4
+ "description": "Dismissible state management library for NestJS applications",
5
+ "main": "./src/index.js",
6
+ "types": "./src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./src/index.mjs",
10
+ "require": "./src/index.js",
11
+ "types": "./src/index.d.ts"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@nestjs/event-emitter": "^3.0.0",
16
+ "uuid": "^11.0.0"
17
+ },
18
+ "peerDependencies": {
19
+ "@nestjs/common": "^11.0.0",
20
+ "@nestjs/core": "^11.0.0",
21
+ "@nestjs/swagger": "^11.0.0",
22
+ "@dismissible/nestjs-dismissible-item": "^0.0.1",
23
+ "@dismissible/nestjs-storage": "^0.0.1",
24
+ "class-validator": "^0.14.0",
25
+ "class-transformer": "^0.5.0"
26
+ },
27
+ "peerDependenciesMeta": {
28
+ "@nestjs/common": {
29
+ "optional": false
30
+ },
31
+ "@nestjs/core": {
32
+ "optional": false
33
+ },
34
+ "@nestjs/swagger": {
35
+ "optional": false
36
+ },
37
+ "dismissible/nestjs-dismissible-item": {
38
+ "optional": false
39
+ },
40
+ "@dismissible/nestjs-storage": {
41
+ "optional": false
42
+ },
43
+ "class-validator": {
44
+ "optional": false
45
+ },
46
+ "class-transformer": {
47
+ "optional": false
48
+ }
49
+ },
50
+ "keywords": [
51
+ "nestjs",
52
+ "dismissible",
53
+ "state-management",
54
+ "feature-flags",
55
+ "dismissals"
56
+ ],
57
+ "author": "",
58
+ "license": "MIT",
59
+ "repository": {
60
+ "type": "git",
61
+ "url": ""
62
+ },
63
+ "type": "commonjs"
64
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Response DTO for a dismissible item.
3
+ */
4
+ export declare class DismissibleItemResponseDto {
5
+ itemId: string;
6
+ userId: string;
7
+ createdAt: string;
8
+ dismissedAt?: string;
9
+ metadata?: Record<string, unknown>;
10
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DismissibleItemResponseDto = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const swagger_1 = require("@nestjs/swagger");
6
+ /**
7
+ * Response DTO for a dismissible item.
8
+ */
9
+ class DismissibleItemResponseDto {
10
+ }
11
+ exports.DismissibleItemResponseDto = DismissibleItemResponseDto;
12
+ tslib_1.__decorate([
13
+ (0, swagger_1.ApiProperty)({
14
+ description: 'Unique identifier for the item',
15
+ example: 'welcome-banner-v2',
16
+ }),
17
+ tslib_1.__metadata("design:type", String)
18
+ ], DismissibleItemResponseDto.prototype, "itemId", void 0);
19
+ tslib_1.__decorate([
20
+ (0, swagger_1.ApiProperty)({
21
+ description: 'User identifier who created the item',
22
+ example: 'user-123',
23
+ }),
24
+ tslib_1.__metadata("design:type", String)
25
+ ], DismissibleItemResponseDto.prototype, "userId", void 0);
26
+ tslib_1.__decorate([
27
+ (0, swagger_1.ApiProperty)({
28
+ description: 'When the item was created (ISO 8601)',
29
+ example: '2024-01-15T10:30:00.000Z',
30
+ }),
31
+ tslib_1.__metadata("design:type", String)
32
+ ], DismissibleItemResponseDto.prototype, "createdAt", void 0);
33
+ tslib_1.__decorate([
34
+ (0, swagger_1.ApiPropertyOptional)({
35
+ description: 'When the item was dismissed (ISO 8601)',
36
+ example: '2024-01-15T12:00:00.000Z',
37
+ }),
38
+ tslib_1.__metadata("design:type", String)
39
+ ], DismissibleItemResponseDto.prototype, "dismissedAt", void 0);
40
+ tslib_1.__decorate([
41
+ (0, swagger_1.ApiPropertyOptional)({
42
+ description: 'Optional metadata associated with the item',
43
+ example: { version: 2, category: 'promotional' },
44
+ type: 'object',
45
+ additionalProperties: true,
46
+ }),
47
+ tslib_1.__metadata("design:type", Object)
48
+ ], DismissibleItemResponseDto.prototype, "metadata", void 0);
49
+ //# sourceMappingURL=dismissible-item-response.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismissible-item-response.dto.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/api/dismissible-item-response.dto.ts"],"names":[],"mappings":";;;;AAAA,6CAAmE;AAEnE;;GAEG;AACH,MAAa,0BAA0B;CAgCtC;AAhCD,gEAgCC;AA3BC;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,mBAAmB;KAC7B,CAAC;;0DACc;AAMhB;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,UAAU;KACpB,CAAC;;0DACc;AAMhB;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,0BAA0B;KACpC,CAAC;;6DACiB;AAMnB;IAJC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,wCAAwC;QACrD,OAAO,EAAE,0BAA0B;KACpC,CAAC;;+DACmB;AAQrB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE;QAChD,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,IAAI;KAC3B,CAAC;;4DACiC"}
@@ -0,0 +1,12 @@
1
+ import { BaseMetadata, DismissibleItemDto } from '@dismissible/nestjs-dismissible-item';
2
+ import { DismissibleItemResponseDto } from './dismissible-item-response.dto';
3
+ /**
4
+ * Mapper for converting domain objects to DTOs.
5
+ */
6
+ export declare class DismissibleItemMapper {
7
+ /**
8
+ * Convert a dismissible item to a response DTO.
9
+ * Converts Date objects to ISO 8601 strings.
10
+ */
11
+ toResponseDto<TMetadata extends BaseMetadata>(item: DismissibleItemDto<TMetadata>): DismissibleItemResponseDto;
12
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DismissibleItemMapper = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const dismissible_item_response_dto_1 = require("./dismissible-item-response.dto");
7
+ /**
8
+ * Mapper for converting domain objects to DTOs.
9
+ */
10
+ let DismissibleItemMapper = class DismissibleItemMapper {
11
+ /**
12
+ * Convert a dismissible item to a response DTO.
13
+ * Converts Date objects to ISO 8601 strings.
14
+ */
15
+ toResponseDto(item) {
16
+ const dto = new dismissible_item_response_dto_1.DismissibleItemResponseDto();
17
+ dto.itemId = item.id;
18
+ dto.userId = item.userId;
19
+ dto.createdAt = item.createdAt.toISOString();
20
+ if (item.dismissedAt) {
21
+ dto.dismissedAt = item.dismissedAt.toISOString();
22
+ }
23
+ if (item.metadata) {
24
+ dto.metadata = item.metadata;
25
+ }
26
+ return dto;
27
+ }
28
+ };
29
+ exports.DismissibleItemMapper = DismissibleItemMapper;
30
+ exports.DismissibleItemMapper = DismissibleItemMapper = tslib_1.__decorate([
31
+ (0, common_1.Injectable)()
32
+ ], DismissibleItemMapper);
33
+ //# sourceMappingURL=dismissible-item.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismissible-item.mapper.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/api/dismissible-item.mapper.ts"],"names":[],"mappings":";;;;AAAA,2CAA4C;AAE5C,mFAA6E;AAE7E;;GAEG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC;;;OAGG;IACH,aAAa,CACX,IAAmC;QAEnC,MAAM,GAAG,GAAG,IAAI,0DAA0B,EAAE,CAAC;QAE7C,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAmC,CAAC;QAC1D,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAA;AAxBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAwBjC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dismissible_item_mapper_1 = require("./dismissible-item.mapper");
4
+ const factories_1 = require("../testing/factories");
5
+ describe('DismissibleItemMapper', () => {
6
+ let mapper;
7
+ beforeEach(() => {
8
+ mapper = new dismissible_item_mapper_1.DismissibleItemMapper();
9
+ });
10
+ describe('toResponseDto', () => {
11
+ it('should convert basic item to DTO', () => {
12
+ const item = (0, factories_1.createTestItem)({
13
+ id: 'test-item',
14
+ userId: 'test-user-id',
15
+ createdAt: new Date('2024-01-15T10:00:00.000Z'),
16
+ });
17
+ const dto = mapper.toResponseDto(item);
18
+ expect(dto.itemId).toBe('test-item');
19
+ expect(dto.userId).toBe('test-user-id');
20
+ expect(dto.createdAt).toBe('2024-01-15T10:00:00.000Z');
21
+ expect(dto.dismissedAt).toBeUndefined();
22
+ expect(dto.metadata).toBeUndefined();
23
+ });
24
+ it('should convert dates to ISO strings', () => {
25
+ const item = (0, factories_1.createDismissedTestItem)({
26
+ id: 'test-item',
27
+ createdAt: new Date('2024-01-15T10:00:00.000Z'),
28
+ dismissedAt: new Date('2024-01-15T12:00:00.000Z'),
29
+ });
30
+ const dto = mapper.toResponseDto(item);
31
+ expect(dto.createdAt).toBe('2024-01-15T10:00:00.000Z');
32
+ expect(dto.dismissedAt).toBe('2024-01-15T12:00:00.000Z');
33
+ });
34
+ it('should include userId in DTO', () => {
35
+ const item = (0, factories_1.createTestItem)({
36
+ id: 'test-item',
37
+ userId: 'user-123',
38
+ });
39
+ const dto = mapper.toResponseDto(item);
40
+ expect(dto.userId).toBe('user-123');
41
+ });
42
+ it('should include metadata when present', () => {
43
+ const item = (0, factories_1.createTestItem)({
44
+ id: 'test-item',
45
+ metadata: { version: 2, category: 'test' },
46
+ });
47
+ const dto = mapper.toResponseDto(item);
48
+ expect(dto.metadata).toEqual({ version: 2, category: 'test' });
49
+ });
50
+ });
51
+ });
52
+ //# sourceMappingURL=dismissible-item.mapper.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismissible-item.mapper.spec.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/api/dismissible-item.mapper.spec.ts"],"names":[],"mappings":";;AAAA,uEAAkE;AAClE,oDAA+E;AAE/E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,MAA6B,CAAC;IAElC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,+CAAqB,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC;gBAC1B,EAAE,EAAE,WAAW;gBACf,MAAM,EAAE,cAAc;gBACtB,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;aAChD,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,IAAI,GAAG,IAAA,mCAAuB,EAAC;gBACnC,EAAE,EAAE,WAAW;gBACf,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;gBAC/C,WAAW,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;aAClD,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC;gBAC1B,EAAE,EAAE,WAAW;gBACf,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC;gBAC1B,EAAE,EAAE,WAAW;gBACf,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE;aAC3C,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEvC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './use-cases';
2
+ export * from '../request/request-context.decorator';
3
+ export * from './dismissible-item.mapper';
4
+ export * from './dismissible-item-response.dto';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ // Use cases
5
+ tslib_1.__exportStar(require("./use-cases"), exports);
6
+ // Cross-cutting
7
+ tslib_1.__exportStar(require("../request/request-context.decorator"), exports);
8
+ tslib_1.__exportStar(require("./dismissible-item.mapper"), exports);
9
+ tslib_1.__exportStar(require("./dismissible-item-response.dto"), exports);
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/api/index.ts"],"names":[],"mappings":";;;AAAA,YAAY;AACZ,sDAA4B;AAE5B,gBAAgB;AAChB,+EAAqD;AACrD,oEAA0C;AAC1C,0EAAgD"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * API tag constants for Swagger/OpenAPI documentation.
3
+ */
4
+ export declare const API_TAG_DISMISSIBLE = "Dismissible";
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.API_TAG_DISMISSIBLE = void 0;
4
+ /**
5
+ * API tag constants for Swagger/OpenAPI documentation.
6
+ */
7
+ exports.API_TAG_DISMISSIBLE = 'Dismissible';
8
+ //# sourceMappingURL=api-tags.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-tags.constants.js","sourceRoot":"","sources":["../../../../../../libs/dismissible/src/api/use-cases/api-tags.constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,mBAAmB,GAAG,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { DismissibleService } from '../../../core/dismissible.service';
2
+ import { DismissibleItemMapper } from '../../dismissible-item.mapper';
3
+ import { IRequestContext } from '../../../request/request-context.interface';
4
+ import { BaseMetadata } from '@dismissible/nestjs-dismissible-item';
5
+ import { DismissResponseDto } from './dismiss.response.dto';
6
+ import { ResponseService } from '../../../response/response.service';
7
+ /**
8
+ * Controller for dismiss dismissible item operations.
9
+ */
10
+ export declare class DismissController {
11
+ private readonly dismissibleService;
12
+ private readonly mapper;
13
+ private readonly responseService;
14
+ constructor(dismissibleService: DismissibleService<BaseMetadata>, mapper: DismissibleItemMapper, responseService: ResponseService);
15
+ dismiss(userId: string, itemId: string, context: IRequestContext): Promise<DismissResponseDto>;
16
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DismissController = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const swagger_1 = require("@nestjs/swagger");
7
+ const dismissible_service_1 = require("../../../core/dismissible.service");
8
+ const dismissible_item_mapper_1 = require("../../dismissible-item.mapper");
9
+ const request_context_decorator_1 = require("../../../request/request-context.decorator");
10
+ const dismiss_response_dto_1 = require("./dismiss.response.dto");
11
+ const response_service_1 = require("../../../response/response.service");
12
+ const http_exception_filter_1 = require("../../../response/http-exception-filter");
13
+ const api_tags_constants_1 = require("../api-tags.constants");
14
+ /**
15
+ * Controller for dismiss dismissible item operations.
16
+ */
17
+ let DismissController = class DismissController {
18
+ constructor(dismissibleService, mapper, responseService) {
19
+ this.dismissibleService = dismissibleService;
20
+ this.mapper = mapper;
21
+ this.responseService = responseService;
22
+ }
23
+ async dismiss(userId, itemId, context) {
24
+ const result = await this.dismissibleService.dismiss(itemId, userId, context);
25
+ return this.responseService.success(this.mapper.toResponseDto(result.item));
26
+ }
27
+ };
28
+ exports.DismissController = DismissController;
29
+ tslib_1.__decorate([
30
+ (0, common_1.Delete)(':itemId'),
31
+ (0, swagger_1.ApiOperation)({
32
+ summary: 'Dismiss an item',
33
+ description: 'Marks a dismissible item as dismissed.',
34
+ }),
35
+ (0, swagger_1.ApiParam)({
36
+ name: 'userId',
37
+ description: 'User identifier',
38
+ example: 'user-123',
39
+ }),
40
+ (0, swagger_1.ApiParam)({
41
+ name: 'itemId',
42
+ description: 'Unique identifier for the dismissible item',
43
+ example: 'welcome-banner-v2',
44
+ }),
45
+ (0, swagger_1.ApiResponse)({
46
+ status: 200,
47
+ description: 'The dismissed item',
48
+ type: dismiss_response_dto_1.DismissResponseDto,
49
+ }),
50
+ (0, swagger_1.ApiResponse)({
51
+ status: 400,
52
+ description: 'Item not found or already dismissed',
53
+ }),
54
+ (0, swagger_1.ApiResponse)({
55
+ status: 403,
56
+ description: 'Operation blocked by lifecycle hook',
57
+ }),
58
+ (0, common_1.UseFilters)(http_exception_filter_1.HttpExceptionFilter),
59
+ tslib_1.__param(0, (0, common_1.Param)('userId')),
60
+ tslib_1.__param(1, (0, common_1.Param)('itemId')),
61
+ tslib_1.__param(2, (0, request_context_decorator_1.RequestContext)()),
62
+ tslib_1.__metadata("design:type", Function),
63
+ tslib_1.__metadata("design:paramtypes", [String, String, Object]),
64
+ tslib_1.__metadata("design:returntype", Promise)
65
+ ], DismissController.prototype, "dismiss", null);
66
+ exports.DismissController = DismissController = tslib_1.__decorate([
67
+ (0, swagger_1.ApiTags)(api_tags_constants_1.API_TAG_DISMISSIBLE),
68
+ (0, common_1.Controller)('v1/user/:userId/dismissible-item'),
69
+ tslib_1.__metadata("design:paramtypes", [dismissible_service_1.DismissibleService,
70
+ dismissible_item_mapper_1.DismissibleItemMapper,
71
+ response_service_1.ResponseService])
72
+ ], DismissController);
73
+ //# sourceMappingURL=dismiss.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss.controller.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/dismiss/dismiss.controller.ts"],"names":[],"mappings":";;;;AAAA,2CAAuE;AACvE,6CAA+E;AAC/E,2EAAuE;AACvE,2EAAsE;AACtE,0FAA4E;AAG5E,iEAA4D;AAC5D,yEAAqE;AACrE,mFAA8E;AAC9E,8DAA4D;AAE5D;;GAEG;AAGI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YACmB,kBAAoD,EACpD,MAA6B,EAC7B,eAAgC;QAFhC,uBAAkB,GAAlB,kBAAkB,CAAkC;QACpD,WAAM,GAAN,MAAM,CAAuB;QAC7B,oBAAe,GAAf,eAAe,CAAiB;IAChD,CAAC;IA+BE,AAAN,KAAK,CAAC,OAAO,CACM,MAAc,EACd,MAAc,EACb,OAAwB;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9E,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;CACF,CAAA;AA7CY,8CAAiB;AAoCtB;IA7BL,IAAA,eAAM,EAAC,SAAS,CAAC;IACjB,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,wCAAwC;KACtD,CAAC;IACD,IAAA,kBAAQ,EAAC;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,UAAU;KACpB,CAAC;IACD,IAAA,kBAAQ,EAAC;QACR,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,mBAAmB;KAC7B,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,oBAAoB;QACjC,IAAI,EAAE,yCAAkB;KACzB,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,qCAAqC;KACnD,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,qCAAqC;KACnD,CAAC;IACD,IAAA,mBAAU,EAAC,2CAAmB,CAAC;IAE7B,mBAAA,IAAA,cAAK,EAAC,QAAQ,CAAC,CAAA;IACf,mBAAA,IAAA,cAAK,EAAC,QAAQ,CAAC,CAAA;IACf,mBAAA,IAAA,0CAAc,GAAE,CAAA;;;;gDAKlB;4BA5CU,iBAAiB;IAF7B,IAAA,iBAAO,EAAC,wCAAmB,CAAC;IAC5B,IAAA,mBAAU,EAAC,kCAAkC,CAAC;6CAGN,wCAAkB;QAC9B,+CAAqB;QACZ,kCAAe;GAJxC,iBAAiB,CA6C7B"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ts_jest_mocker_1 = require("ts-jest-mocker");
4
+ const dismiss_controller_1 = require("./dismiss.controller");
5
+ const dismissible_service_1 = require("../../../core/dismissible.service");
6
+ const dismissible_item_mapper_1 = require("../../dismissible-item.mapper");
7
+ const factories_1 = require("../../../testing/factories");
8
+ const response_1 = require("../../../response");
9
+ describe('DismissController', () => {
10
+ let controller;
11
+ let mockService;
12
+ let mockResponseService;
13
+ let mapper;
14
+ beforeEach(() => {
15
+ mockService = (0, ts_jest_mocker_1.mock)(dismissible_service_1.DismissibleService);
16
+ mockResponseService = (0, ts_jest_mocker_1.mock)(response_1.ResponseService, { failIfMockNotProvided: false });
17
+ mockResponseService.success.mockImplementation((data) => ({ data }));
18
+ mapper = new dismissible_item_mapper_1.DismissibleItemMapper();
19
+ controller = new dismiss_controller_1.DismissController(mockService, mapper, mockResponseService);
20
+ });
21
+ describe('dismiss', () => {
22
+ it('should return dismissed item wrapped in data', async () => {
23
+ const item = (0, factories_1.createTestItem)({
24
+ id: 'test-item',
25
+ dismissedAt: new Date(),
26
+ });
27
+ const previousItem = (0, factories_1.createTestItem)({ id: 'test-item' });
28
+ const context = (0, factories_1.createTestContext)();
29
+ mockService.dismiss.mockResolvedValue({ item, previousItem });
30
+ const result = await controller.dismiss('test-user-id', 'test-item', context);
31
+ expect(result.data.itemId).toBe('test-item');
32
+ expect(mockService.dismiss).toHaveBeenCalledWith('test-item', 'test-user-id', context);
33
+ expect(mockResponseService.success).toHaveBeenCalled();
34
+ });
35
+ });
36
+ });
37
+ //# sourceMappingURL=dismiss.controller.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss.controller.spec.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/dismiss/dismiss.controller.spec.ts"],"names":[],"mappings":";;AAAA,mDAAsC;AACtC,6DAAyD;AACzD,2EAAuE;AACvE,2EAAsE;AAEtE,0DAA+E;AAC/E,gDAAoD;AAEpD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,UAA6B,CAAC;IAClC,IAAI,WAA0D,CAAC;IAC/D,IAAI,mBAAiD,CAAC;IACtD,IAAI,MAA6B,CAAC;IAElC,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,IAAA,qBAAI,EAAC,wCAAkB,CAAC,CAAC;QACvC,mBAAmB,GAAG,IAAA,qBAAI,EAAC,0BAAe,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,mBAAmB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,GAAG,IAAI,+CAAqB,EAAE,CAAC;QAErC,UAAU,GAAG,IAAI,sCAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC;gBAC1B,EAAE,EAAE,WAAW;gBACf,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,IAAA,6BAAiB,GAAE,CAAC;YAEpC,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAE9E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YACvF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { DismissibleItemResponseDto } from '../../dismissible-item-response.dto';
2
+ declare const DismissResponseDto_base: {
3
+ new (): {
4
+ data: DismissibleItemResponseDto;
5
+ };
6
+ };
7
+ /**
8
+ * Response DTO for the dismiss operation.
9
+ */
10
+ export declare class DismissResponseDto extends DismissResponseDto_base {
11
+ }
12
+ export {};
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DismissResponseDto = void 0;
4
+ const success_response_dto_1 = require("../../../response/dtos/success-response.dto");
5
+ const dismissible_item_response_dto_1 = require("../../dismissible-item-response.dto");
6
+ /**
7
+ * Response DTO for the dismiss operation.
8
+ */
9
+ class DismissResponseDto extends (0, success_response_dto_1.SuccessResponseDto)(dismissible_item_response_dto_1.DismissibleItemResponseDto) {
10
+ }
11
+ exports.DismissResponseDto = DismissResponseDto;
12
+ //# sourceMappingURL=dismiss.response.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dismiss.response.dto.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/dismiss/dismiss.response.dto.ts"],"names":[],"mappings":";;;AAAA,sFAAiF;AACjF,uFAAiF;AAEjF;;GAEG;AACH,MAAa,kBAAmB,SAAQ,IAAA,yCAAkB,EAAC,0DAA0B,CAAC;CAAG;AAAzF,gDAAyF"}
@@ -0,0 +1,2 @@
1
+ export * from './dismiss.response.dto';
2
+ export * from './dismiss.controller';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./dismiss.response.dto"), exports);
5
+ tslib_1.__exportStar(require("./dismiss.controller"), exports);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/dismiss/index.ts"],"names":[],"mappings":";;;AAAA,iEAAuC;AACvC,+DAAqC"}
@@ -0,0 +1,21 @@
1
+ import { DismissibleService } from '../../../core/dismissible.service';
2
+ import { DismissibleItemMapper } from '../../dismissible-item.mapper';
3
+ import { IRequestContext } from '../../../request/request-context.interface';
4
+ import { BaseMetadata } from '@dismissible/nestjs-dismissible-item';
5
+ import { GetOrCreateResponseDto } from './get-or-create.response.dto';
6
+ import { ResponseService } from '../../../response/response.service';
7
+ /**
8
+ * Controller for get-or-create dismissible item operations.
9
+ */
10
+ export declare class GetOrCreateController {
11
+ private readonly dismissibleService;
12
+ private readonly mapper;
13
+ private readonly responseService;
14
+ constructor(dismissibleService: DismissibleService<BaseMetadata>, mapper: DismissibleItemMapper, responseService: ResponseService);
15
+ getOrCreate(userId: string, itemId: string, context: IRequestContext, metadataRaw?: string | string[]): Promise<GetOrCreateResponseDto>;
16
+ /**
17
+ * Parse metadata from query parameter format.
18
+ * Supports: `?metadata=key1:value1&metadata=key2:value2`
19
+ */
20
+ private parseMetadata;
21
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetOrCreateController = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const swagger_1 = require("@nestjs/swagger");
7
+ const dismissible_service_1 = require("../../../core/dismissible.service");
8
+ const dismissible_item_mapper_1 = require("../../dismissible-item.mapper");
9
+ const request_context_decorator_1 = require("../../../request/request-context.decorator");
10
+ const get_or_create_response_dto_1 = require("./get-or-create.response.dto");
11
+ const response_service_1 = require("../../../response/response.service");
12
+ const http_exception_filter_1 = require("../../../response/http-exception-filter");
13
+ const api_tags_constants_1 = require("../api-tags.constants");
14
+ /**
15
+ * Controller for get-or-create dismissible item operations.
16
+ */
17
+ let GetOrCreateController = class GetOrCreateController {
18
+ constructor(dismissibleService, mapper, responseService) {
19
+ this.dismissibleService = dismissibleService;
20
+ this.mapper = mapper;
21
+ this.responseService = responseService;
22
+ }
23
+ async getOrCreate(userId, itemId, context, metadataRaw) {
24
+ // Parse metadata from query params
25
+ const metadata = this.parseMetadata(metadataRaw);
26
+ const result = await this.dismissibleService.getOrCreate(itemId, userId, {
27
+ metadata: metadata,
28
+ }, context);
29
+ return this.responseService.success(this.mapper.toResponseDto(result.item));
30
+ }
31
+ /**
32
+ * Parse metadata from query parameter format.
33
+ * Supports: `?metadata=key1:value1&metadata=key2:value2`
34
+ */
35
+ parseMetadata(raw) {
36
+ if (!raw) {
37
+ return undefined;
38
+ }
39
+ const items = Array.isArray(raw) ? raw : [raw];
40
+ const metadata = {};
41
+ for (const item of items) {
42
+ const colonIndex = item.indexOf(':');
43
+ if (colonIndex > 0) {
44
+ const key = item.substring(0, colonIndex);
45
+ const value = item.substring(colonIndex + 1);
46
+ // Try to parse as number if possible
47
+ const numValue = Number(value);
48
+ metadata[key] = isNaN(numValue) ? value : numValue;
49
+ }
50
+ }
51
+ return Object.keys(metadata).length > 0 ? metadata : undefined;
52
+ }
53
+ };
54
+ exports.GetOrCreateController = GetOrCreateController;
55
+ tslib_1.__decorate([
56
+ (0, common_1.Get)(':itemId'),
57
+ (0, swagger_1.ApiOperation)({
58
+ summary: 'Get or create a dismissible item',
59
+ description: 'Retrieves an existing dismissible item by ID, or creates a new one if it does not exist.',
60
+ }),
61
+ (0, swagger_1.ApiParam)({
62
+ name: 'userId',
63
+ description: 'User identifier',
64
+ example: 'user-123',
65
+ }),
66
+ (0, swagger_1.ApiParam)({
67
+ name: 'itemId',
68
+ description: 'Unique identifier for the dismissible item',
69
+ example: 'welcome-banner-v2',
70
+ }),
71
+ (0, swagger_1.ApiQuery)({
72
+ name: 'metadata',
73
+ description: 'Optional metadata as key:value pairs (can be repeated)',
74
+ required: false,
75
+ isArray: true,
76
+ type: String,
77
+ example: 'version:2',
78
+ }),
79
+ (0, swagger_1.ApiResponse)({
80
+ status: 200,
81
+ description: 'The dismissible item (retrieved or created)',
82
+ type: get_or_create_response_dto_1.GetOrCreateResponseDto,
83
+ }),
84
+ (0, swagger_1.ApiResponse)({
85
+ status: 403,
86
+ description: 'Operation blocked by lifecycle hook',
87
+ }),
88
+ (0, common_1.UseFilters)(http_exception_filter_1.HttpExceptionFilter),
89
+ tslib_1.__param(0, (0, common_1.Param)('userId')),
90
+ tslib_1.__param(1, (0, common_1.Param)('itemId')),
91
+ tslib_1.__param(2, (0, request_context_decorator_1.RequestContext)()),
92
+ tslib_1.__param(3, (0, common_1.Query)('metadata')),
93
+ tslib_1.__metadata("design:type", Function),
94
+ tslib_1.__metadata("design:paramtypes", [String, String, Object, Object]),
95
+ tslib_1.__metadata("design:returntype", Promise)
96
+ ], GetOrCreateController.prototype, "getOrCreate", null);
97
+ exports.GetOrCreateController = GetOrCreateController = tslib_1.__decorate([
98
+ (0, swagger_1.ApiTags)(api_tags_constants_1.API_TAG_DISMISSIBLE),
99
+ (0, common_1.Controller)('v1/user/:userId/dismissible-item'),
100
+ tslib_1.__metadata("design:paramtypes", [dismissible_service_1.DismissibleService,
101
+ dismissible_item_mapper_1.DismissibleItemMapper,
102
+ response_service_1.ResponseService])
103
+ ], GetOrCreateController);
104
+ //# sourceMappingURL=get-or-create.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-or-create.controller.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/get-or-create/get-or-create.controller.ts"],"names":[],"mappings":"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"}