@dismissible/nestjs-dismissible 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +490 -0
- package/package.json +68 -0
- package/src/api/dismissible-item-response.dto.d.ts +9 -0
- package/src/api/dismissible-item-response.dto.js +40 -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 +30 -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 +43 -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 +8 -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 +15 -0
- package/src/api/use-cases/dismiss/dismiss.controller.js +74 -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 +15 -0
- package/src/api/use-cases/get-or-create/get-or-create.controller.js +70 -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 +32 -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.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 +2 -0
- package/src/api/use-cases/get-or-create/index.js +6 -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 +15 -0
- package/src/api/use-cases/restore/restore.controller.js +74 -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/api/validation/index.d.ts +2 -0
- package/src/api/validation/index.js +6 -0
- package/src/api/validation/index.js.map +1 -0
- package/src/api/validation/param-validation.pipe.d.ts +11 -0
- package/src/api/validation/param-validation.pipe.js +36 -0
- package/src/api/validation/param-validation.pipe.js.map +1 -0
- package/src/api/validation/param-validation.pipe.spec.d.ts +1 -0
- package/src/api/validation/param-validation.pipe.spec.js +269 -0
- package/src/api/validation/param-validation.pipe.spec.js.map +1 -0
- package/src/api/validation/param.decorators.d.ts +28 -0
- package/src/api/validation/param.decorators.js +36 -0
- package/src/api/validation/param.decorators.js.map +1 -0
- package/src/core/dismissible-core.service.d.ts +56 -0
- package/src/core/dismissible-core.service.js +147 -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 +309 -0
- package/src/core/dismissible-core.service.spec.js.map +1 -0
- package/src/core/dismissible.service.d.ts +45 -0
- package/src/core/dismissible.service.js +127 -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 +159 -0
- package/src/core/dismissible.service.spec.js.map +1 -0
- package/src/core/hook-runner.service.d.ts +88 -0
- package/src/core/hook-runner.service.js +226 -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 +538 -0
- package/src/core/hook-runner.service.spec.js.map +1 -0
- package/src/core/index.d.ts +5 -0
- package/src/core/index.js +9 -0
- package/src/core/index.js.map +1 -0
- package/src/core/lifecycle-hook.interface.d.ts +1 -0
- package/src/core/lifecycle-hook.interface.js +7 -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 +13 -0
- package/src/dismissible.module.integration.spec.d.ts +1 -0
- package/src/dismissible.module.integration.spec.js +529 -0
- package/src/dismissible.module.integration.spec.js.map +1 -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/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/http-exception-filter.spec.d.ts +1 -0
- package/src/response/http-exception-filter.spec.js +137 -0
- package/src/response/http-exception-filter.spec.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 +58 -0
- package/src/response/response.service.spec.js.map +1 -0
- package/src/testing/factories.d.ts +14 -0
- package/src/testing/factories.js +58 -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
- package/src/validation/dismissible-input.dto.d.ts +21 -0
- package/src/validation/dismissible-input.dto.js +54 -0
- package/src/validation/dismissible-input.dto.js.map +1 -0
- package/src/validation/index.d.ts +1 -0
- package/src/validation/index.js +5 -0
- package/src/validation/index.js.map +1 -0
|
@@ -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;AACtE,0DAA+E;AAC/E,gDAAoD;AAEpD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,UAA6B,CAAC;IAClC,IAAI,WAA4C,CAAC;IACjD,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,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./param-validation.pipe"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./param.decorators"), exports);
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/dismissible/src/api/validation/index.ts"],"names":[],"mappings":";;;AAAA,kEAAwC;AACxC,6DAAmC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PipeTransform, ArgumentMetadata } from '@nestjs/common';
|
|
2
|
+
/**
|
|
3
|
+
* Validation pipe for userId and itemId route parameters.
|
|
4
|
+
* Validates:
|
|
5
|
+
* - Required (non-empty)
|
|
6
|
+
* - Length between 1-64 characters
|
|
7
|
+
* - Contains only alphanumeric characters, dashes, and underscores
|
|
8
|
+
*/
|
|
9
|
+
export declare class ParamValidationPipe implements PipeTransform<string, string> {
|
|
10
|
+
transform(value: string, metadata: ArgumentMetadata): string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParamValidationPipe = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const dismissible_input_dto_1 = require("../../validation/dismissible-input.dto");
|
|
7
|
+
/**
|
|
8
|
+
* Validation pipe for userId and itemId route parameters.
|
|
9
|
+
* Validates:
|
|
10
|
+
* - Required (non-empty)
|
|
11
|
+
* - Length between 1-64 characters
|
|
12
|
+
* - Contains only alphanumeric characters, dashes, and underscores
|
|
13
|
+
*/
|
|
14
|
+
let ParamValidationPipe = class ParamValidationPipe {
|
|
15
|
+
transform(value, metadata) {
|
|
16
|
+
const paramName = metadata.data || 'parameter';
|
|
17
|
+
if (!value || value.trim() === '') {
|
|
18
|
+
throw new common_1.BadRequestException(`${paramName} is required`);
|
|
19
|
+
}
|
|
20
|
+
if (value.length < dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MIN_LENGTH) {
|
|
21
|
+
throw new common_1.BadRequestException(`${paramName} must be at least ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MIN_LENGTH} character`);
|
|
22
|
+
}
|
|
23
|
+
if (value.length > dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH) {
|
|
24
|
+
throw new common_1.BadRequestException(`${paramName} must be at most ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_MAX_LENGTH} characters`);
|
|
25
|
+
}
|
|
26
|
+
if (!dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN.test(value)) {
|
|
27
|
+
throw new common_1.BadRequestException(`${paramName} ${dismissible_input_dto_1.VALIDATION_CONSTANTS.ID_PATTERN_MESSAGE}`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.ParamValidationPipe = ParamValidationPipe;
|
|
33
|
+
exports.ParamValidationPipe = ParamValidationPipe = tslib_1.__decorate([
|
|
34
|
+
(0, common_1.Injectable)()
|
|
35
|
+
], ParamValidationPipe);
|
|
36
|
+
//# sourceMappingURL=param-validation.pipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"param-validation.pipe.js","sourceRoot":"","sources":["../../../../../../libs/dismissible/src/api/validation/param-validation.pipe.ts"],"names":[],"mappings":";;;;AAAA,2CAAkG;AAClG,kFAA8E;AAE9E;;;;;;GAMG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,SAAS,CAAC,KAAa,EAAE,QAA0B;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC;QAE/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,4BAAmB,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,4CAAoB,CAAC,aAAa,EAAE,CAAC;YACtD,MAAM,IAAI,4BAAmB,CAC3B,GAAG,SAAS,qBAAqB,4CAAoB,CAAC,aAAa,YAAY,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,4CAAoB,CAAC,aAAa,EAAE,CAAC;YACtD,MAAM,IAAI,4BAAmB,CAC3B,GAAG,SAAS,oBAAoB,4CAAoB,CAAC,aAAa,aAAa,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,4CAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,4BAAmB,CAAC,GAAG,SAAS,IAAI,4CAAoB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AA1BY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;GACA,mBAAmB,CA0B/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
+
}
|