@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.
- package/package.json +64 -0
- package/src/api/dismissible-item-response.dto.d.ts +10 -0
- package/src/api/dismissible-item-response.dto.js +49 -0
- package/src/api/dismissible-item-response.dto.js.map +1 -0
- package/src/api/dismissible-item.mapper.d.ts +12 -0
- package/src/api/dismissible-item.mapper.js +33 -0
- package/src/api/dismissible-item.mapper.js.map +1 -0
- package/src/api/dismissible-item.mapper.spec.d.ts +1 -0
- package/src/api/dismissible-item.mapper.spec.js +52 -0
- package/src/api/dismissible-item.mapper.spec.js.map +1 -0
- package/src/api/index.d.ts +4 -0
- package/src/api/index.js +10 -0
- package/src/api/index.js.map +1 -0
- package/src/api/use-cases/api-tags.constants.d.ts +4 -0
- package/src/api/use-cases/api-tags.constants.js +8 -0
- package/src/api/use-cases/api-tags.constants.js.map +1 -0
- package/src/api/use-cases/dismiss/dismiss.controller.d.ts +16 -0
- package/src/api/use-cases/dismiss/dismiss.controller.js +73 -0
- package/src/api/use-cases/dismiss/dismiss.controller.js.map +1 -0
- package/src/api/use-cases/dismiss/dismiss.controller.spec.d.ts +1 -0
- package/src/api/use-cases/dismiss/dismiss.controller.spec.js +37 -0
- package/src/api/use-cases/dismiss/dismiss.controller.spec.js.map +1 -0
- package/src/api/use-cases/dismiss/dismiss.response.dto.d.ts +12 -0
- package/src/api/use-cases/dismiss/dismiss.response.dto.js +12 -0
- package/src/api/use-cases/dismiss/dismiss.response.dto.js.map +1 -0
- package/src/api/use-cases/dismiss/index.d.ts +2 -0
- package/src/api/use-cases/dismiss/index.js +6 -0
- package/src/api/use-cases/dismiss/index.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.d.ts +21 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.js +104 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.d.ts +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js +53 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.spec.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.request.dto.d.ts +6 -0
- package/src/api/use-cases/get-or-create/get-or-create.request.dto.js +24 -0
- package/src/api/use-cases/get-or-create/get-or-create.request.dto.js.map +1 -0
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.d.ts +12 -0
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.js +12 -0
- package/src/api/use-cases/get-or-create/get-or-create.response.dto.js.map +1 -0
- package/src/api/use-cases/get-or-create/index.d.ts +3 -0
- package/src/api/use-cases/get-or-create/index.js +7 -0
- package/src/api/use-cases/get-or-create/index.js.map +1 -0
- package/src/api/use-cases/index.d.ts +3 -0
- package/src/api/use-cases/index.js +7 -0
- package/src/api/use-cases/index.js.map +1 -0
- package/src/api/use-cases/restore/index.d.ts +2 -0
- package/src/api/use-cases/restore/index.js +6 -0
- package/src/api/use-cases/restore/index.js.map +1 -0
- package/src/api/use-cases/restore/restore.controller.d.ts +16 -0
- package/src/api/use-cases/restore/restore.controller.js +73 -0
- package/src/api/use-cases/restore/restore.controller.js.map +1 -0
- package/src/api/use-cases/restore/restore.controller.spec.d.ts +1 -0
- package/src/api/use-cases/restore/restore.controller.spec.js +37 -0
- package/src/api/use-cases/restore/restore.controller.spec.js.map +1 -0
- package/src/api/use-cases/restore/restore.response.dto.d.ts +12 -0
- package/src/api/use-cases/restore/restore.response.dto.js +12 -0
- package/src/api/use-cases/restore/restore.response.dto.js.map +1 -0
- package/src/core/create-options.d.ts +8 -0
- package/src/core/create-options.js +3 -0
- package/src/core/create-options.js.map +1 -0
- package/src/core/dismissible-core.service.d.ts +44 -0
- package/src/core/dismissible-core.service.js +132 -0
- package/src/core/dismissible-core.service.js.map +1 -0
- package/src/core/dismissible-core.service.spec.d.ts +1 -0
- package/src/core/dismissible-core.service.spec.js +277 -0
- package/src/core/dismissible-core.service.spec.js.map +1 -0
- package/src/core/dismissible.service.d.ts +41 -0
- package/src/core/dismissible.service.js +114 -0
- package/src/core/dismissible.service.js.map +1 -0
- package/src/core/dismissible.service.spec.d.ts +1 -0
- package/src/core/dismissible.service.spec.js +98 -0
- package/src/core/dismissible.service.spec.js.map +1 -0
- package/src/core/hook-runner.service.d.ts +72 -0
- package/src/core/hook-runner.service.js +160 -0
- package/src/core/hook-runner.service.js.map +1 -0
- package/src/core/hook-runner.service.spec.d.ts +1 -0
- package/src/core/hook-runner.service.spec.js +214 -0
- package/src/core/hook-runner.service.spec.js.map +1 -0
- package/src/core/index.d.ts +6 -0
- package/src/core/index.js +10 -0
- package/src/core/index.js.map +1 -0
- package/src/core/lifecycle-hook.interface.d.ts +70 -0
- package/src/core/lifecycle-hook.interface.js +8 -0
- package/src/core/lifecycle-hook.interface.js.map +1 -0
- package/src/core/service-responses.interface.d.ts +28 -0
- package/src/core/service-responses.interface.js +3 -0
- package/src/core/service-responses.interface.js.map +1 -0
- package/src/dismissible.module.d.ts +14 -0
- package/src/dismissible.module.js +77 -0
- package/src/dismissible.module.js.map +1 -0
- package/src/events/dismissible.events.d.ts +45 -0
- package/src/events/dismissible.events.js +53 -0
- package/src/events/dismissible.events.js.map +1 -0
- package/src/events/events.constants.d.ts +17 -0
- package/src/events/events.constants.js +17 -0
- package/src/events/events.constants.js.map +1 -0
- package/src/events/index.d.ts +2 -0
- package/src/events/index.js +6 -0
- package/src/events/index.js.map +1 -0
- package/src/exceptions/dismissible.exceptions.d.ts +26 -0
- package/src/exceptions/dismissible.exceptions.js +49 -0
- package/src/exceptions/dismissible.exceptions.js.map +1 -0
- package/src/exceptions/dismissible.exceptions.spec.d.ts +1 -0
- package/src/exceptions/dismissible.exceptions.spec.js +40 -0
- package/src/exceptions/dismissible.exceptions.spec.js.map +1 -0
- package/src/exceptions/index.d.ts +1 -0
- package/src/exceptions/index.js +5 -0
- package/src/exceptions/index.js.map +1 -0
- package/src/index.d.ts +8 -0
- package/src/index.js +12 -0
- package/src/index.js.map +1 -0
- package/src/request/index.d.ts +2 -0
- package/src/request/index.js +6 -0
- package/src/request/index.js.map +1 -0
- package/src/request/request-context.decorator.d.ts +1 -0
- package/src/request/request-context.decorator.js +13 -0
- package/src/request/request-context.decorator.js.map +1 -0
- package/src/request/request-context.interface.d.ts +6 -0
- package/src/request/request-context.interface.js +3 -0
- package/src/request/request-context.interface.js.map +1 -0
- package/src/response/dtos/base-response.dto.d.ts +6 -0
- package/src/response/dtos/base-response.dto.js +18 -0
- package/src/response/dtos/base-response.dto.js.map +1 -0
- package/src/response/dtos/error-response.dto.d.ts +19 -0
- package/src/response/dtos/error-response.dto.js +39 -0
- package/src/response/dtos/error-response.dto.js.map +1 -0
- package/src/response/dtos/index.d.ts +3 -0
- package/src/response/dtos/index.js +7 -0
- package/src/response/dtos/index.js.map +1 -0
- package/src/response/dtos/success-response.dto.d.ts +28 -0
- package/src/response/dtos/success-response.dto.js +34 -0
- package/src/response/dtos/success-response.dto.js.map +1 -0
- package/src/response/http-exception-filter.d.ts +4 -0
- package/src/response/http-exception-filter.js +24 -0
- package/src/response/http-exception-filter.js.map +1 -0
- package/src/response/index.d.ts +4 -0
- package/src/response/index.js +8 -0
- package/src/response/index.js.map +1 -0
- package/src/response/response.module.d.ts +2 -0
- package/src/response/response.module.js +17 -0
- package/src/response/response.module.js.map +1 -0
- package/src/response/response.service.d.ts +6 -0
- package/src/response/response.service.js +25 -0
- package/src/response/response.service.js.map +1 -0
- package/src/response/response.service.spec.d.ts +1 -0
- package/src/response/response.service.spec.js +72 -0
- package/src/response/response.service.spec.js.map +1 -0
- package/src/testing/factories.d.ts +14 -0
- package/src/testing/factories.js +41 -0
- package/src/testing/factories.js.map +1 -0
- package/src/testing/index.d.ts +1 -0
- package/src/testing/index.js +5 -0
- package/src/testing/index.js.map +1 -0
- package/src/utils/date/date.service.d.ts +8 -0
- package/src/utils/date/date.service.js +24 -0
- package/src/utils/date/date.service.js.map +1 -0
- package/src/utils/date/date.service.spec.d.ts +1 -0
- package/src/utils/date/date.service.spec.js +83 -0
- package/src/utils/date/date.service.spec.js.map +1 -0
- package/src/utils/date/index.d.ts +1 -0
- package/src/utils/date/index.js +5 -0
- package/src/utils/date/index.js.map +1 -0
- package/src/utils/dismissible.helper.d.ts +4 -0
- package/src/utils/dismissible.helper.js +15 -0
- package/src/utils/dismissible.helper.js.map +1 -0
- package/src/utils/index.d.ts +3 -0
- package/src/utils/index.js +7 -0
- package/src/utils/index.js.map +1 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ts_jest_mocker_1 = require("ts-jest-mocker");
|
|
4
|
+
const get_or_create_controller_1 = require("./get-or-create.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('GetOrCreateController', () => {
|
|
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 get_or_create_controller_1.GetOrCreateController(mockService, mapper, mockResponseService);
|
|
20
|
+
});
|
|
21
|
+
describe('getOrCreate', () => {
|
|
22
|
+
it('should return item with created flag wrapped in data', async () => {
|
|
23
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
24
|
+
const context = (0, factories_1.createTestContext)();
|
|
25
|
+
mockService.getOrCreate.mockResolvedValue({ item, created: true });
|
|
26
|
+
const result = await controller.getOrCreate('test-user-id', 'test-item', context, undefined);
|
|
27
|
+
expect(result.data.itemId).toBe('test-item');
|
|
28
|
+
expect(mockResponseService.success).toHaveBeenCalled();
|
|
29
|
+
});
|
|
30
|
+
it('should parse metadata from query params', async () => {
|
|
31
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
32
|
+
const context = (0, factories_1.createTestContext)();
|
|
33
|
+
mockService.getOrCreate.mockResolvedValue({ item, created: true });
|
|
34
|
+
await controller.getOrCreate('test-user-id', 'test-item', context, [
|
|
35
|
+
'version:2',
|
|
36
|
+
'category:test',
|
|
37
|
+
]);
|
|
38
|
+
expect(mockService.getOrCreate).toHaveBeenCalledWith('test-item', 'test-user-id', expect.objectContaining({
|
|
39
|
+
metadata: { version: 2, category: 'test' },
|
|
40
|
+
}), context);
|
|
41
|
+
});
|
|
42
|
+
it('should handle single metadata value', async () => {
|
|
43
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
44
|
+
const context = (0, factories_1.createTestContext)();
|
|
45
|
+
mockService.getOrCreate.mockResolvedValue({ item, created: true });
|
|
46
|
+
await controller.getOrCreate('test-user-id', 'test-item', context, 'version:2');
|
|
47
|
+
expect(mockService.getOrCreate).toHaveBeenCalledWith('test-item', 'test-user-id', expect.objectContaining({
|
|
48
|
+
metadata: { version: 2 },
|
|
49
|
+
}), context);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=get-or-create.controller.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-or-create.controller.spec.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/get-or-create/get-or-create.controller.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateDismissibleItemQueryDto = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
6
|
+
const class_validator_1 = require("class-validator");
|
|
7
|
+
/**
|
|
8
|
+
* Query parameters for creating a dismissible item.
|
|
9
|
+
*/
|
|
10
|
+
class CreateDismissibleItemQueryDto {
|
|
11
|
+
}
|
|
12
|
+
exports.CreateDismissibleItemQueryDto = CreateDismissibleItemQueryDto;
|
|
13
|
+
tslib_1.__decorate([
|
|
14
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
15
|
+
description: 'Optional metadata to attach to the item',
|
|
16
|
+
example: { key: 'value' },
|
|
17
|
+
type: 'object',
|
|
18
|
+
additionalProperties: true,
|
|
19
|
+
}),
|
|
20
|
+
(0, class_validator_1.IsOptional)(),
|
|
21
|
+
(0, class_validator_1.IsObject)(),
|
|
22
|
+
tslib_1.__metadata("design:type", Object)
|
|
23
|
+
], CreateDismissibleItemQueryDto.prototype, "metadata", void 0);
|
|
24
|
+
//# sourceMappingURL=get-or-create.request.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-or-create.request.dto.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/get-or-create/get-or-create.request.dto.ts"],"names":[],"mappings":";;;;AAAA,6CAAsD;AACtD,qDAAuD;AAEvD;;GAEG;AACH,MAAa,6BAA6B;CAUzC;AAVD,sEAUC;AADC;IARC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,yCAAyC;QACtD,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;QACzB,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,IAAI;KAC3B,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;+DACgC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DismissibleItemResponseDto } from '../../dismissible-item-response.dto';
|
|
2
|
+
declare const GetOrCreateResponseDto_base: {
|
|
3
|
+
new (): {
|
|
4
|
+
data: DismissibleItemResponseDto;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Response DTO for the getOrCreate operation.
|
|
9
|
+
*/
|
|
10
|
+
export declare class GetOrCreateResponseDto extends GetOrCreateResponseDto_base {
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetOrCreateResponseDto = 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 getOrCreate operation.
|
|
8
|
+
*/
|
|
9
|
+
class GetOrCreateResponseDto extends (0, success_response_dto_1.SuccessResponseDto)(dismissible_item_response_dto_1.DismissibleItemResponseDto) {
|
|
10
|
+
}
|
|
11
|
+
exports.GetOrCreateResponseDto = GetOrCreateResponseDto;
|
|
12
|
+
//# sourceMappingURL=get-or-create.response.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-or-create.response.dto.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/get-or-create/get-or-create.response.dto.ts"],"names":[],"mappings":";;;AAAA,sFAAiF;AACjF,uFAAiF;AAEjF;;GAEG;AACH,MAAa,sBAAuB,SAAQ,IAAA,yCAAkB,EAAC,0DAA0B,CAAC;CAAG;AAA7F,wDAA6F"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./get-or-create.request.dto"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./get-or-create.response.dto"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./get-or-create.controller"), exports);
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/get-or-create/index.ts"],"names":[],"mappings":";;;AAAA,sEAA4C;AAC5C,uEAA6C;AAC7C,qEAA2C"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./get-or-create"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./dismiss"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./restore"), exports);
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/dismissible/src/api/use-cases/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC;AAChC,oDAA0B;AAC1B,oDAA0B"}
|
|
@@ -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("./restore.response.dto"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./restore.controller"), exports);
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/restore/index.ts"],"names":[],"mappings":";;;AAAA,iEAAuC;AACvC,+DAAqC"}
|
|
@@ -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 { RestoreResponseDto } from './restore.response.dto';
|
|
6
|
+
import { ResponseService } from '../../../response/response.service';
|
|
7
|
+
/**
|
|
8
|
+
* Controller for restore dismissible item operations.
|
|
9
|
+
*/
|
|
10
|
+
export declare class RestoreController {
|
|
11
|
+
private readonly dismissibleService;
|
|
12
|
+
private readonly mapper;
|
|
13
|
+
private readonly responseService;
|
|
14
|
+
constructor(dismissibleService: DismissibleService<BaseMetadata>, mapper: DismissibleItemMapper, responseService: ResponseService);
|
|
15
|
+
restore(userId: string, itemId: string, context: IRequestContext): Promise<RestoreResponseDto>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RestoreController = 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 restore_response_dto_1 = require("./restore.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 restore dismissible item operations.
|
|
16
|
+
*/
|
|
17
|
+
let RestoreController = class RestoreController {
|
|
18
|
+
constructor(dismissibleService, mapper, responseService) {
|
|
19
|
+
this.dismissibleService = dismissibleService;
|
|
20
|
+
this.mapper = mapper;
|
|
21
|
+
this.responseService = responseService;
|
|
22
|
+
}
|
|
23
|
+
async restore(userId, itemId, context) {
|
|
24
|
+
const result = await this.dismissibleService.restore(itemId, userId, context);
|
|
25
|
+
return this.responseService.success(this.mapper.toResponseDto(result.item));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.RestoreController = RestoreController;
|
|
29
|
+
tslib_1.__decorate([
|
|
30
|
+
(0, common_1.Post)(':itemId'),
|
|
31
|
+
(0, swagger_1.ApiOperation)({
|
|
32
|
+
summary: 'Restore a dismissed item',
|
|
33
|
+
description: 'Restores a previously dismissed item.',
|
|
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 restored item',
|
|
48
|
+
type: restore_response_dto_1.RestoreResponseDto,
|
|
49
|
+
}),
|
|
50
|
+
(0, swagger_1.ApiResponse)({
|
|
51
|
+
status: 400,
|
|
52
|
+
description: 'Item not found or not 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
|
+
], RestoreController.prototype, "restore", null);
|
|
66
|
+
exports.RestoreController = RestoreController = 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
|
+
], RestoreController);
|
|
73
|
+
//# sourceMappingURL=restore.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.controller.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/restore/restore.controller.ts"],"names":[],"mappings":";;;;AAAA,2CAAqE;AACrE,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,aAAI,EAAC,SAAS,CAAC;IACf,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,0BAA0B;QACnC,WAAW,EAAE,uCAAuC;KACrD,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,mBAAmB;QAChC,IAAI,EAAE,yCAAkB;KACzB,CAAC;IACD,IAAA,qBAAW,EAAC;QACX,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,iCAAiC;KAC/C,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 restore_controller_1 = require("./restore.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('RestoreController', () => {
|
|
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 restore_controller_1.RestoreController(mockService, mapper, mockResponseService);
|
|
20
|
+
});
|
|
21
|
+
describe('restore', () => {
|
|
22
|
+
it('should return restored item wrapped in data', async () => {
|
|
23
|
+
const item = (0, factories_1.createTestItem)({ id: 'test-item' });
|
|
24
|
+
const previousItem = (0, factories_1.createTestItem)({
|
|
25
|
+
id: 'test-item',
|
|
26
|
+
dismissedAt: new Date(),
|
|
27
|
+
});
|
|
28
|
+
const context = (0, factories_1.createTestContext)();
|
|
29
|
+
mockService.restore.mockResolvedValue({ item, previousItem });
|
|
30
|
+
const result = await controller.restore('test-user-id', 'test-item', context);
|
|
31
|
+
expect(result.data.itemId).toBe('test-item');
|
|
32
|
+
expect(mockService.restore).toHaveBeenCalledWith('test-item', 'test-user-id', context);
|
|
33
|
+
expect(mockResponseService.success).toHaveBeenCalled();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=restore.controller.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.controller.spec.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/restore/restore.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,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,IAAI,GAAG,IAAA,0BAAc,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,IAAA,0BAAc,EAAC;gBAClC,EAAE,EAAE,WAAW;gBACf,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC,CAAC;YACH,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 RestoreResponseDto_base: {
|
|
3
|
+
new (): {
|
|
4
|
+
data: DismissibleItemResponseDto;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Response DTO for the restore operation.
|
|
9
|
+
*/
|
|
10
|
+
export declare class RestoreResponseDto extends RestoreResponseDto_base {
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RestoreResponseDto = 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 restore operation.
|
|
8
|
+
*/
|
|
9
|
+
class RestoreResponseDto extends (0, success_response_dto_1.SuccessResponseDto)(dismissible_item_response_dto_1.DismissibleItemResponseDto) {
|
|
10
|
+
}
|
|
11
|
+
exports.RestoreResponseDto = RestoreResponseDto;
|
|
12
|
+
//# sourceMappingURL=restore.response.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.response.dto.js","sourceRoot":"","sources":["../../../../../../../libs/dismissible/src/api/use-cases/restore/restore.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,8 @@
|
|
|
1
|
+
import { BaseMetadata } from '@dismissible/nestjs-dismissible-item';
|
|
2
|
+
/**
|
|
3
|
+
* Options for creating a new dismissible item.
|
|
4
|
+
*/
|
|
5
|
+
export interface ICreateItemOptions<TMetadata extends BaseMetadata = BaseMetadata> {
|
|
6
|
+
/** Optional metadata to attach to the item */
|
|
7
|
+
metadata?: TMetadata;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-options.js","sourceRoot":"","sources":["../../../../../libs/dismissible/src/core/create-options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
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 { BaseMetadata, DismissibleItemFactory } from '@dismissible/nestjs-dismissible-item';
|
|
8
|
+
import { ICreateItemOptions } from './create-options';
|
|
9
|
+
/**
|
|
10
|
+
* Core business logic service for dismissible operations.
|
|
11
|
+
* Handles pure CRUD operations without side effects (hooks, events).
|
|
12
|
+
*/
|
|
13
|
+
export declare class DismissibleCoreService<TMetadata extends BaseMetadata = BaseMetadata> {
|
|
14
|
+
private readonly storage;
|
|
15
|
+
private readonly dateService;
|
|
16
|
+
private readonly logger;
|
|
17
|
+
private readonly itemFactory;
|
|
18
|
+
private readonly validationService;
|
|
19
|
+
private readonly dismissibleHelper;
|
|
20
|
+
constructor(storage: IDismissibleStorage<TMetadata>, dateService: DateService, logger: IDismissibleLogger, itemFactory: DismissibleItemFactory, validationService: ValidationService, dismissibleHelper: DismissibleHelper);
|
|
21
|
+
/**
|
|
22
|
+
* Get an existing item or create a new one.
|
|
23
|
+
* @param itemId The item identifier
|
|
24
|
+
* @param userId The user identifier (required)
|
|
25
|
+
* @param options Optional creation options (metadata)
|
|
26
|
+
*/
|
|
27
|
+
getOrCreate(itemId: string, userId: string, options?: ICreateItemOptions<TMetadata>): Promise<IGetOrCreateServiceResponse<TMetadata>>;
|
|
28
|
+
/**
|
|
29
|
+
* Dismiss an item.
|
|
30
|
+
* @param itemId The item identifier
|
|
31
|
+
* @param userId The user identifier (required)
|
|
32
|
+
* @throws ItemNotFoundException if item doesn't exist
|
|
33
|
+
* @throws ItemAlreadyDismissedException if item is already dismissed
|
|
34
|
+
*/
|
|
35
|
+
dismiss(itemId: string, userId: string): Promise<IDismissServiceResponse<TMetadata>>;
|
|
36
|
+
/**
|
|
37
|
+
* Restore a dismissed item.
|
|
38
|
+
* @param itemId The item identifier
|
|
39
|
+
* @param userId The user identifier (required)
|
|
40
|
+
* @throws ItemNotFoundException if item doesn't exist
|
|
41
|
+
* @throws ItemNotDismissedException if item is not dismissed
|
|
42
|
+
*/
|
|
43
|
+
restore(itemId: string, userId: string): Promise<IRestoreServiceResponse<TMetadata>>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
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 or create a new one.
|
|
28
|
+
* @param itemId The item identifier
|
|
29
|
+
* @param userId The user identifier (required)
|
|
30
|
+
* @param options Optional creation options (metadata)
|
|
31
|
+
*/
|
|
32
|
+
async getOrCreate(itemId, userId, options) {
|
|
33
|
+
this.logger.debug(`Looking up item in storage`, { itemId, userId });
|
|
34
|
+
const existingItem = await this.storage.get(userId, itemId);
|
|
35
|
+
if (existingItem) {
|
|
36
|
+
this.logger.debug(`Found existing item`, { itemId, userId });
|
|
37
|
+
return {
|
|
38
|
+
item: existingItem,
|
|
39
|
+
created: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
this.logger.debug(`Creating new item`, {
|
|
43
|
+
itemId,
|
|
44
|
+
userId,
|
|
45
|
+
hasMetadata: !!options?.metadata,
|
|
46
|
+
});
|
|
47
|
+
// Create new item
|
|
48
|
+
const now = this.dateService.getNow();
|
|
49
|
+
const newItem = this.itemFactory.create({
|
|
50
|
+
id: itemId,
|
|
51
|
+
createdAt: now,
|
|
52
|
+
userId,
|
|
53
|
+
metadata: options?.metadata,
|
|
54
|
+
});
|
|
55
|
+
// Validate the item before storage
|
|
56
|
+
await this.validationService.validateInstance(newItem);
|
|
57
|
+
const createdItem = await this.storage.create(newItem);
|
|
58
|
+
this.logger.info(`Created new dismissible item`, { itemId, userId });
|
|
59
|
+
return {
|
|
60
|
+
item: createdItem,
|
|
61
|
+
created: true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Dismiss an item.
|
|
66
|
+
* @param itemId The item identifier
|
|
67
|
+
* @param userId The user identifier (required)
|
|
68
|
+
* @throws ItemNotFoundException if item doesn't exist
|
|
69
|
+
* @throws ItemAlreadyDismissedException if item is already dismissed
|
|
70
|
+
*/
|
|
71
|
+
async dismiss(itemId, userId) {
|
|
72
|
+
this.logger.debug(`Attempting to dismiss item`, { itemId, userId });
|
|
73
|
+
const existingItem = await this.storage.get(userId, itemId);
|
|
74
|
+
if (!existingItem) {
|
|
75
|
+
this.logger.warn(`Cannot dismiss: item not found`, { itemId, userId });
|
|
76
|
+
throw new exceptions_1.ItemNotFoundException(itemId);
|
|
77
|
+
}
|
|
78
|
+
if (this.dismissibleHelper.isDismissed(existingItem)) {
|
|
79
|
+
this.logger.warn(`Cannot dismiss: item already dismissed`, { itemId, userId });
|
|
80
|
+
throw new exceptions_1.ItemAlreadyDismissedException(itemId);
|
|
81
|
+
}
|
|
82
|
+
const previousItem = this.itemFactory.clone(existingItem);
|
|
83
|
+
const dismissedItem = this.itemFactory.createDismissed(existingItem, this.dateService.getNow());
|
|
84
|
+
// Validate the item before storage
|
|
85
|
+
await this.validationService.validateInstance(dismissedItem);
|
|
86
|
+
const updatedItem = await this.storage.update(dismissedItem);
|
|
87
|
+
this.logger.info(`Item dismissed`, { itemId, userId });
|
|
88
|
+
return {
|
|
89
|
+
item: updatedItem,
|
|
90
|
+
previousItem,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Restore a dismissed item.
|
|
95
|
+
* @param itemId The item identifier
|
|
96
|
+
* @param userId The user identifier (required)
|
|
97
|
+
* @throws ItemNotFoundException if item doesn't exist
|
|
98
|
+
* @throws ItemNotDismissedException if item is not dismissed
|
|
99
|
+
*/
|
|
100
|
+
async restore(itemId, userId) {
|
|
101
|
+
this.logger.debug(`Attempting to restore item`, { itemId, userId });
|
|
102
|
+
const existingItem = await this.storage.get(userId, itemId);
|
|
103
|
+
if (!existingItem) {
|
|
104
|
+
this.logger.warn(`Cannot restore: item not found`, { itemId, userId });
|
|
105
|
+
throw new exceptions_1.ItemNotFoundException(itemId);
|
|
106
|
+
}
|
|
107
|
+
if (!this.dismissibleHelper.isDismissed(existingItem)) {
|
|
108
|
+
this.logger.warn(`Cannot restore: item not dismissed`, { itemId, userId });
|
|
109
|
+
throw new exceptions_1.ItemNotDismissedException(itemId);
|
|
110
|
+
}
|
|
111
|
+
const previousItem = this.itemFactory.clone(existingItem);
|
|
112
|
+
const restoredItem = this.itemFactory.createRestored(existingItem);
|
|
113
|
+
// Validate the item before storage
|
|
114
|
+
await this.validationService.validateInstance(restoredItem);
|
|
115
|
+
const updatedItem = await this.storage.update(restoredItem);
|
|
116
|
+
this.logger.info(`Item restored`, { itemId, userId });
|
|
117
|
+
return {
|
|
118
|
+
item: updatedItem,
|
|
119
|
+
previousItem,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
exports.DismissibleCoreService = DismissibleCoreService;
|
|
124
|
+
exports.DismissibleCoreService = DismissibleCoreService = tslib_1.__decorate([
|
|
125
|
+
(0, common_1.Injectable)(),
|
|
126
|
+
tslib_1.__param(0, (0, common_1.Inject)(nestjs_storage_1.DISMISSIBLE_STORAGE_ADAPTER)),
|
|
127
|
+
tslib_1.__param(2, (0, common_1.Inject)(nestjs_logger_1.DISMISSIBLE_LOGGER)),
|
|
128
|
+
tslib_1.__metadata("design:paramtypes", [Object, date_service_1.DateService, Object, nestjs_dismissible_item_1.DismissibleItemFactory,
|
|
129
|
+
nestjs_validation_1.ValidationService,
|
|
130
|
+
dismissible_helper_1.DismissibleHelper])
|
|
131
|
+
], DismissibleCoreService);
|
|
132
|
+
//# 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 {};
|