@fiado/type-kit 3.513.0 → 3.514.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/_test_/unit/rewards/backoffice.test.ts +96 -0
- package/bin/rewards/constants/BackofficeLimits.d.ts +6 -0
- package/bin/rewards/constants/BackofficeLimits.js +9 -0
- package/bin/rewards/dtos/backoffice/CatalogItemListResponse.d.ts +6 -0
- package/bin/rewards/dtos/backoffice/CatalogItemListResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/CatalogItemRequest.d.ts +19 -0
- package/bin/rewards/dtos/backoffice/CatalogItemRequest.js +70 -0
- package/bin/rewards/dtos/backoffice/CatalogItemResponse.d.ts +23 -0
- package/bin/rewards/dtos/backoffice/CatalogItemResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/PackageItemRequest.d.ts +4 -0
- package/bin/rewards/dtos/backoffice/PackageItemRequest.js +30 -0
- package/bin/rewards/dtos/backoffice/PackageListResponse.d.ts +6 -0
- package/bin/rewards/dtos/backoffice/PackageListResponse.js +6 -0
- package/bin/rewards/dtos/backoffice/PackageRequest.d.ts +9 -0
- package/bin/rewards/dtos/backoffice/PackageRequest.js +47 -0
- package/bin/rewards/dtos/backoffice/PackageResponse.d.ts +18 -0
- package/bin/rewards/dtos/backoffice/PackageResponse.js +9 -0
- package/bin/rewards/dtos/backoffice/RewardChargeToInput.d.ts +4 -0
- package/bin/rewards/dtos/backoffice/RewardChargeToInput.js +31 -0
- package/bin/rewards/dtos/backoffice/RewardCostInput.d.ts +5 -0
- package/bin/rewards/dtos/backoffice/RewardCostInput.js +29 -0
- package/bin/rewards/dtos/backoffice/RewardTypeResponse.d.ts +6 -0
- package/bin/rewards/dtos/backoffice/RewardTypeResponse.js +7 -0
- package/bin/rewards/index.d.ts +11 -0
- package/bin/rewards/index.js +13 -0
- package/package.json +1 -1
- package/src/rewards/constants/BackofficeLimits.ts +6 -0
- package/src/rewards/dtos/backoffice/CatalogItemListResponse.ts +7 -0
- package/src/rewards/dtos/backoffice/CatalogItemRequest.ts +52 -0
- package/src/rewards/dtos/backoffice/CatalogItemResponse.ts +22 -0
- package/src/rewards/dtos/backoffice/PackageItemRequest.ts +15 -0
- package/src/rewards/dtos/backoffice/PackageListResponse.ts +7 -0
- package/src/rewards/dtos/backoffice/PackageRequest.ts +31 -0
- package/src/rewards/dtos/backoffice/PackageResponse.ts +20 -0
- package/src/rewards/dtos/backoffice/RewardChargeToInput.ts +16 -0
- package/src/rewards/dtos/backoffice/RewardCostInput.ts +14 -0
- package/src/rewards/dtos/backoffice/RewardTypeResponse.ts +7 -0
- package/src/rewards/index.ts +15 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { JsonValue } from '../../../src/common';
|
|
5
|
+
import { CatalogItemRequest, PackageRequest, REWARD_ITEM_KEY_MAX_LENGTH, REWARD_PACKAGE_MAX_ITEMS } from '../../../src/rewards';
|
|
6
|
+
|
|
7
|
+
const catalog = {
|
|
8
|
+
id: 'example-reward-a',
|
|
9
|
+
name: 'Recompensa A',
|
|
10
|
+
description: 'Recompensa de ejemplo',
|
|
11
|
+
type: 'ExampleType',
|
|
12
|
+
config: { amount: 50, nested: { list: [1, 2] } },
|
|
13
|
+
cost: { amount: 50, currency: 'MXN' },
|
|
14
|
+
chargeTo: { partnerId: 'ALIADO-001', partnerName: 'Aliado de ejemplo' },
|
|
15
|
+
status: 'ACTIVE',
|
|
16
|
+
};
|
|
17
|
+
const pkg = { id: 'paquete-1', name: 'Paquete 1', status: 'ACTIVE', items: [{ itemKey: 'itemA', catalogItemId: 'example-reward-a' }] };
|
|
18
|
+
|
|
19
|
+
const asCatalog = (o: Record<string, JsonValue> = {}): CatalogItemRequest =>
|
|
20
|
+
plainToInstance(CatalogItemRequest, { ...catalog, ...o }, { excludeExtraneousValues: true });
|
|
21
|
+
const asPackage = (o: Record<string, JsonValue> = {}): PackageRequest =>
|
|
22
|
+
plainToInstance(PackageRequest, { ...pkg, ...o }, { excludeExtraneousValues: true });
|
|
23
|
+
const props = async (dto: object): Promise<string[]> => (await validate(dto)).map((e) => e.property);
|
|
24
|
+
|
|
25
|
+
describe('CatalogItemRequest', () => {
|
|
26
|
+
it('valida una recompensa correcta y conserva el config anidado completo', async () => {
|
|
27
|
+
const dto = asCatalog();
|
|
28
|
+
expect(await validate(dto)).toHaveLength(0);
|
|
29
|
+
expect(dto.config).toEqual({ amount: 50, nested: { list: [1, 2] } });
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it.each<[string, Record<string, JsonValue>, string]>([
|
|
33
|
+
['id con espacios', { id: 'con espacio' }, 'id'],
|
|
34
|
+
['id vacío', { id: '' }, 'id'],
|
|
35
|
+
['name vacío', { name: '' }, 'name'],
|
|
36
|
+
['name > 120', { name: 'x'.repeat(121) }, 'name'],
|
|
37
|
+
['type vacío', { type: '' }, 'type'],
|
|
38
|
+
['config que no es objeto', { config: 'texto' }, 'config'],
|
|
39
|
+
['status desconocido', { status: 'BORRADO' }, 'status'],
|
|
40
|
+
['costo negativo', { cost: { amount: -1, currency: 'MXN' } }, 'cost'],
|
|
41
|
+
['costo con 3 decimales', { cost: { amount: 1.234, currency: 'MXN' } }, 'cost'],
|
|
42
|
+
['moneda desconocida', { cost: { amount: 5, currency: 'XXX' } }, 'cost'],
|
|
43
|
+
['chargeTo sin partnerId', { chargeTo: { partnerId: '', partnerName: 'A' } }, 'chargeTo'],
|
|
44
|
+
])('rechaza %s', async (_nombre, override, property) => {
|
|
45
|
+
expect(await props(asCatalog(override))).toContain(property);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('acepta costo 0 (recompensa gratuita para el aliado)', async () => {
|
|
49
|
+
expect(await validate(asCatalog({ cost: { amount: 0, currency: 'MXN' } }))).toHaveLength(0);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('descarta campos extra (version, dependencies, updatedBy no se aceptan del cliente)', () => {
|
|
53
|
+
const dto = asCatalog({ version: 99, dependencies: [], updatedBy: 'hacker' });
|
|
54
|
+
expect('version' in dto).toBe(false);
|
|
55
|
+
expect('dependencies' in dto).toBe(false);
|
|
56
|
+
expect('updatedBy' in dto).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('PackageRequest', () => {
|
|
61
|
+
it('valida un paquete correcto', async () => {
|
|
62
|
+
expect(await validate(asPackage())).toHaveLength(0);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('exige al menos un ítem', async () => {
|
|
66
|
+
expect(await props(asPackage({ items: [] }))).toContain('items');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it(`itemKey de ${REWARD_ITEM_KEY_MAX_LENGTH} caracteres entra; de ${REWARD_ITEM_KEY_MAX_LENGTH + 1} no (RW-{grantId}-{itemKey} ≤ 64)`, async () => {
|
|
70
|
+
const ok = asPackage({ items: [{ itemKey: 'k'.repeat(REWARD_ITEM_KEY_MAX_LENGTH), catalogItemId: 'r1' }] });
|
|
71
|
+
const tooLong = asPackage({ items: [{ itemKey: 'k'.repeat(REWARD_ITEM_KEY_MAX_LENGTH + 1), catalogItemId: 'r1' }] });
|
|
72
|
+
expect(await validate(ok)).toHaveLength(0);
|
|
73
|
+
expect(await props(tooLong)).toContain('items');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it.each(['con espacio', 'con#almohadilla', 'acentó'])('rechaza el itemKey %s (caracteres fuera de [A-Za-z0-9_-])', async (itemKey) => {
|
|
77
|
+
expect(await props(asPackage({ items: [{ itemKey, catalogItemId: 'r1' }] }))).toContain('items');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('REWARD_ITEM_KEY_MAX_LENGTH es 28 (igual que REWARDS_MAX_ITEM_KEY_LENGTH de api-invoker)', () => {
|
|
81
|
+
expect(REWARD_ITEM_KEY_MAX_LENGTH).toBe(28);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('REWARD_PACKAGE_MAX_ITEMS es 4 (igual que MAX_ITEMS_PER_PACKAGE del worker, B-12): 4 ítems entran, 5 no', async () => {
|
|
85
|
+
expect(REWARD_PACKAGE_MAX_ITEMS).toBe(4);
|
|
86
|
+
const itemsOf = (n: number): JsonValue[] =>
|
|
87
|
+
Array.from({ length: n }, (_, i) => ({ itemKey: `item${i}`, catalogItemId: 'example-reward-a' }));
|
|
88
|
+
expect(await validate(asPackage({ items: itemsOf(REWARD_PACKAGE_MAX_ITEMS) }))).toHaveLength(0);
|
|
89
|
+
expect(await props(asPackage({ items: itemsOf(REWARD_PACKAGE_MAX_ITEMS + 1) }))).toContain('items');
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('acepta el MISMO catalogItemId en dos itemKey distintos (decisión de la Parte 2: cada ítem tiene su transactionNumber)', async () => {
|
|
93
|
+
const items = [{ itemKey: 'itemA', catalogItemId: 'example-reward-a' }, { itemKey: 'itemB', catalogItemId: 'example-reward-a' }];
|
|
94
|
+
expect(await validate(asPackage({ items }))).toHaveLength(0);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Máximo del `itemKey` de un paquete: `RW-{grantId(32)}-{itemKey}` ≤ 64 (igual que REWARDS_MAX_ITEM_KEY_LENGTH de api-invoker). */
|
|
2
|
+
export declare const REWARD_ITEM_KEY_MAX_LENGTH = 28;
|
|
3
|
+
export declare const REWARD_ITEM_KEY_PATTERN: RegExp;
|
|
4
|
+
export declare const REWARD_ID_PATTERN: RegExp;
|
|
5
|
+
/** Máximo de ítems de un paquete (B-12 de rewards-business: presupuesto de tiempo del worker). Igual a `MAX_ITEMS_PER_PACKAGE` del lambda. */
|
|
6
|
+
export declare const REWARD_PACKAGE_MAX_ITEMS = 4;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REWARD_PACKAGE_MAX_ITEMS = exports.REWARD_ID_PATTERN = exports.REWARD_ITEM_KEY_PATTERN = exports.REWARD_ITEM_KEY_MAX_LENGTH = void 0;
|
|
4
|
+
/** Máximo del `itemKey` de un paquete: `RW-{grantId(32)}-{itemKey}` ≤ 64 (igual que REWARDS_MAX_ITEM_KEY_LENGTH de api-invoker). */
|
|
5
|
+
exports.REWARD_ITEM_KEY_MAX_LENGTH = 28;
|
|
6
|
+
exports.REWARD_ITEM_KEY_PATTERN = new RegExp(`^[A-Za-z0-9_-]{1,${exports.REWARD_ITEM_KEY_MAX_LENGTH}}$`);
|
|
7
|
+
exports.REWARD_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
8
|
+
/** Máximo de ítems de un paquete (B-12 de rewards-business: presupuesto de tiempo del worker). Igual a `MAX_ITEMS_PER_PACKAGE` del lambda. */
|
|
9
|
+
exports.REWARD_PACKAGE_MAX_ITEMS = 4;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { JsonValue } from '../../../common';
|
|
2
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
3
|
+
import { RewardChargeToInput } from './RewardChargeToInput';
|
|
4
|
+
import { RewardCostInput } from './RewardCostInput';
|
|
5
|
+
/** Crear (POST) o reemplazar (PUT) una recompensa del catálogo. `version`, `dependencies` y `updatedBy` los pone el servidor. */
|
|
6
|
+
export declare class CatalogItemRequest {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
/** `type` del adaptador (IRewardType.type). Inmutable una vez creada la recompensa. */
|
|
11
|
+
type: string;
|
|
12
|
+
/** Forma definida por cada tipo; el lambda la valida con `IRewardType.validateConfig`. */
|
|
13
|
+
config: {
|
|
14
|
+
[key: string]: JsonValue;
|
|
15
|
+
};
|
|
16
|
+
cost: RewardCostInput;
|
|
17
|
+
chargeTo: RewardChargeToInput;
|
|
18
|
+
status: RewardStatusEnum;
|
|
19
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CatalogItemRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const BackofficeLimits_1 = require("../../constants/BackofficeLimits");
|
|
16
|
+
const RewardStatusEnum_1 = require("../../enums/RewardStatusEnum");
|
|
17
|
+
const RewardChargeToInput_1 = require("./RewardChargeToInput");
|
|
18
|
+
const RewardCostInput_1 = require("./RewardCostInput");
|
|
19
|
+
/** Crear (POST) o reemplazar (PUT) una recompensa del catálogo. `version`, `dependencies` y `updatedBy` los pone el servidor. */
|
|
20
|
+
class CatalogItemRequest {
|
|
21
|
+
}
|
|
22
|
+
exports.CatalogItemRequest = CatalogItemRequest;
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, class_transformer_1.Expose)(),
|
|
25
|
+
(0, class_validator_1.IsString)(),
|
|
26
|
+
(0, class_validator_1.Matches)(BackofficeLimits_1.REWARD_ID_PATTERN),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], CatalogItemRequest.prototype, "id", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, class_transformer_1.Expose)(),
|
|
31
|
+
(0, class_validator_1.IsString)(),
|
|
32
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
33
|
+
(0, class_validator_1.MaxLength)(120),
|
|
34
|
+
__metadata("design:type", String)
|
|
35
|
+
], CatalogItemRequest.prototype, "name", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, class_transformer_1.Expose)(),
|
|
38
|
+
(0, class_validator_1.IsString)(),
|
|
39
|
+
(0, class_validator_1.MaxLength)(500),
|
|
40
|
+
__metadata("design:type", String)
|
|
41
|
+
], CatalogItemRequest.prototype, "description", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, class_transformer_1.Expose)(),
|
|
44
|
+
(0, class_validator_1.IsString)(),
|
|
45
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
46
|
+
(0, class_validator_1.MaxLength)(60),
|
|
47
|
+
__metadata("design:type", String)
|
|
48
|
+
], CatalogItemRequest.prototype, "type", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, class_transformer_1.Expose)(),
|
|
51
|
+
(0, class_validator_1.IsObject)(),
|
|
52
|
+
__metadata("design:type", Object)
|
|
53
|
+
], CatalogItemRequest.prototype, "config", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, class_transformer_1.Expose)(),
|
|
56
|
+
(0, class_validator_1.ValidateNested)(),
|
|
57
|
+
(0, class_transformer_1.Type)(() => RewardCostInput_1.RewardCostInput),
|
|
58
|
+
__metadata("design:type", RewardCostInput_1.RewardCostInput)
|
|
59
|
+
], CatalogItemRequest.prototype, "cost", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, class_transformer_1.Expose)(),
|
|
62
|
+
(0, class_validator_1.ValidateNested)(),
|
|
63
|
+
(0, class_transformer_1.Type)(() => RewardChargeToInput_1.RewardChargeToInput),
|
|
64
|
+
__metadata("design:type", RewardChargeToInput_1.RewardChargeToInput)
|
|
65
|
+
], CatalogItemRequest.prototype, "chargeTo", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
(0, class_transformer_1.Expose)(),
|
|
68
|
+
(0, class_validator_1.IsEnum)(RewardStatusEnum_1.RewardStatusEnum),
|
|
69
|
+
__metadata("design:type", String)
|
|
70
|
+
], CatalogItemRequest.prototype, "status", void 0);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JsonValue } from '../../../common';
|
|
2
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
3
|
+
import { RewardChargeTo } from '../RewardChargeTo';
|
|
4
|
+
import { RewardCost } from '../RewardCost';
|
|
5
|
+
import { RewardDependency } from '../RewardDependency';
|
|
6
|
+
export declare class CatalogItemResponse {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
type: string;
|
|
11
|
+
config: {
|
|
12
|
+
[key: string]: JsonValue;
|
|
13
|
+
};
|
|
14
|
+
cost: RewardCost;
|
|
15
|
+
chargeTo: RewardChargeTo;
|
|
16
|
+
/** Solo lectura: las calcula el tipo a partir de `config`. */
|
|
17
|
+
dependencies: RewardDependency[];
|
|
18
|
+
status: RewardStatusEnum;
|
|
19
|
+
version: number;
|
|
20
|
+
updatedBy: string;
|
|
21
|
+
createdAt: number;
|
|
22
|
+
updatedAt: number;
|
|
23
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PackageItemRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const BackofficeLimits_1 = require("../../constants/BackofficeLimits");
|
|
16
|
+
class PackageItemRequest {
|
|
17
|
+
}
|
|
18
|
+
exports.PackageItemRequest = PackageItemRequest;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, class_transformer_1.Expose)(),
|
|
21
|
+
(0, class_validator_1.IsString)(),
|
|
22
|
+
(0, class_validator_1.Matches)(BackofficeLimits_1.REWARD_ITEM_KEY_PATTERN),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], PackageItemRequest.prototype, "itemKey", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_transformer_1.Expose)(),
|
|
27
|
+
(0, class_validator_1.IsString)(),
|
|
28
|
+
(0, class_validator_1.Matches)(BackofficeLimits_1.REWARD_ID_PATTERN),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], PackageItemRequest.prototype, "catalogItemId", void 0);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
2
|
+
import { PackageItemRequest } from './PackageItemRequest';
|
|
3
|
+
export declare class PackageRequest {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
status: RewardStatusEnum;
|
|
7
|
+
/** Ordenada: el orden es el de ejecución. De 1 a 4 ítems (el tope depende del presupuesto de tiempo del worker, B-12; el lambda lo valida otra vez). */
|
|
8
|
+
items: PackageItemRequest[];
|
|
9
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PackageRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const BackofficeLimits_1 = require("../../constants/BackofficeLimits");
|
|
16
|
+
const RewardStatusEnum_1 = require("../../enums/RewardStatusEnum");
|
|
17
|
+
const PackageItemRequest_1 = require("./PackageItemRequest");
|
|
18
|
+
class PackageRequest {
|
|
19
|
+
}
|
|
20
|
+
exports.PackageRequest = PackageRequest;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_transformer_1.Expose)(),
|
|
23
|
+
(0, class_validator_1.IsString)(),
|
|
24
|
+
(0, class_validator_1.Matches)(BackofficeLimits_1.REWARD_ID_PATTERN),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], PackageRequest.prototype, "id", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, class_transformer_1.Expose)(),
|
|
29
|
+
(0, class_validator_1.IsString)(),
|
|
30
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
31
|
+
(0, class_validator_1.MaxLength)(120),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], PackageRequest.prototype, "name", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
(0, class_validator_1.IsEnum)(RewardStatusEnum_1.RewardStatusEnum),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], PackageRequest.prototype, "status", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, class_transformer_1.Expose)(),
|
|
41
|
+
(0, class_validator_1.IsArray)(),
|
|
42
|
+
(0, class_validator_1.ArrayMinSize)(1),
|
|
43
|
+
(0, class_validator_1.ArrayMaxSize)(BackofficeLimits_1.REWARD_PACKAGE_MAX_ITEMS),
|
|
44
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
45
|
+
(0, class_transformer_1.Type)(() => PackageItemRequest_1.PackageItemRequest),
|
|
46
|
+
__metadata("design:type", Array)
|
|
47
|
+
], PackageRequest.prototype, "items", void 0);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
2
|
+
import { RewardCost } from '../RewardCost';
|
|
3
|
+
export declare class PackageItemResponse {
|
|
4
|
+
itemKey: string;
|
|
5
|
+
catalogItemId: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class PackageResponse {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
status: RewardStatusEnum;
|
|
11
|
+
version: number;
|
|
12
|
+
items: PackageItemResponse[];
|
|
13
|
+
/** Costo total declarado por moneda (spec 5.2). */
|
|
14
|
+
totalCost: RewardCost[];
|
|
15
|
+
updatedBy: string;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
updatedAt: number;
|
|
18
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PackageResponse = exports.PackageItemResponse = void 0;
|
|
4
|
+
class PackageItemResponse {
|
|
5
|
+
}
|
|
6
|
+
exports.PackageItemResponse = PackageItemResponse;
|
|
7
|
+
class PackageResponse {
|
|
8
|
+
}
|
|
9
|
+
exports.PackageResponse = PackageResponse;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RewardChargeToInput = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
class RewardChargeToInput {
|
|
16
|
+
}
|
|
17
|
+
exports.RewardChargeToInput = RewardChargeToInput;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, class_transformer_1.Expose)(),
|
|
20
|
+
(0, class_validator_1.IsString)(),
|
|
21
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
22
|
+
(0, class_validator_1.MaxLength)(64),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], RewardChargeToInput.prototype, "partnerId", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_transformer_1.Expose)(),
|
|
27
|
+
(0, class_validator_1.IsString)(),
|
|
28
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
29
|
+
(0, class_validator_1.MaxLength)(120),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], RewardChargeToInput.prototype, "partnerName", void 0);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RewardCostInput = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const currency_1 = require("../../../currency");
|
|
16
|
+
class RewardCostInput {
|
|
17
|
+
}
|
|
18
|
+
exports.RewardCostInput = RewardCostInput;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, class_transformer_1.Expose)(),
|
|
21
|
+
(0, class_validator_1.IsNumber)({ maxDecimalPlaces: 2 }),
|
|
22
|
+
(0, class_validator_1.Min)(0),
|
|
23
|
+
__metadata("design:type", Number)
|
|
24
|
+
], RewardCostInput.prototype, "amount", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_transformer_1.Expose)(),
|
|
27
|
+
(0, class_validator_1.IsEnum)(currency_1.CurrencyId),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], RewardCostInput.prototype, "currency", void 0);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RewardTypeResponse = void 0;
|
|
4
|
+
/** `GET /reward-types`: un tipo registrado y el formulario dinámico de su `config`. */
|
|
5
|
+
class RewardTypeResponse {
|
|
6
|
+
}
|
|
7
|
+
exports.RewardTypeResponse = RewardTypeResponse;
|
package/bin/rewards/index.d.ts
CHANGED
|
@@ -22,3 +22,14 @@ export * from './dtos/responses/PackageContractResponse';
|
|
|
22
22
|
export * from './dtos/responses/GrantAttemptResponse';
|
|
23
23
|
export * from './dtos/responses/GrantItemResponse';
|
|
24
24
|
export * from './dtos/responses/GrantResponse';
|
|
25
|
+
export * from './constants/BackofficeLimits';
|
|
26
|
+
export * from './dtos/backoffice/RewardCostInput';
|
|
27
|
+
export * from './dtos/backoffice/RewardChargeToInput';
|
|
28
|
+
export * from './dtos/backoffice/CatalogItemRequest';
|
|
29
|
+
export * from './dtos/backoffice/CatalogItemResponse';
|
|
30
|
+
export * from './dtos/backoffice/PackageItemRequest';
|
|
31
|
+
export * from './dtos/backoffice/PackageRequest';
|
|
32
|
+
export * from './dtos/backoffice/PackageResponse';
|
|
33
|
+
export * from './dtos/backoffice/RewardTypeResponse';
|
|
34
|
+
export * from './dtos/backoffice/CatalogItemListResponse';
|
|
35
|
+
export * from './dtos/backoffice/PackageListResponse';
|
package/bin/rewards/index.js
CHANGED
|
@@ -45,3 +45,16 @@ __exportStar(require("./dtos/responses/PackageContractResponse"), exports);
|
|
|
45
45
|
__exportStar(require("./dtos/responses/GrantAttemptResponse"), exports);
|
|
46
46
|
__exportStar(require("./dtos/responses/GrantItemResponse"), exports);
|
|
47
47
|
__exportStar(require("./dtos/responses/GrantResponse"), exports);
|
|
48
|
+
//Constants backoffice
|
|
49
|
+
__exportStar(require("./constants/BackofficeLimits"), exports);
|
|
50
|
+
//DTOs backoffice
|
|
51
|
+
__exportStar(require("./dtos/backoffice/RewardCostInput"), exports);
|
|
52
|
+
__exportStar(require("./dtos/backoffice/RewardChargeToInput"), exports);
|
|
53
|
+
__exportStar(require("./dtos/backoffice/CatalogItemRequest"), exports);
|
|
54
|
+
__exportStar(require("./dtos/backoffice/CatalogItemResponse"), exports);
|
|
55
|
+
__exportStar(require("./dtos/backoffice/PackageItemRequest"), exports);
|
|
56
|
+
__exportStar(require("./dtos/backoffice/PackageRequest"), exports);
|
|
57
|
+
__exportStar(require("./dtos/backoffice/PackageResponse"), exports);
|
|
58
|
+
__exportStar(require("./dtos/backoffice/RewardTypeResponse"), exports);
|
|
59
|
+
__exportStar(require("./dtos/backoffice/CatalogItemListResponse"), exports);
|
|
60
|
+
__exportStar(require("./dtos/backoffice/PackageListResponse"), exports);
|
package/package.json
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Máximo del `itemKey` de un paquete: `RW-{grantId(32)}-{itemKey}` ≤ 64 (igual que REWARDS_MAX_ITEM_KEY_LENGTH de api-invoker). */
|
|
2
|
+
export const REWARD_ITEM_KEY_MAX_LENGTH = 28;
|
|
3
|
+
export const REWARD_ITEM_KEY_PATTERN = new RegExp(`^[A-Za-z0-9_-]{1,${REWARD_ITEM_KEY_MAX_LENGTH}}$`);
|
|
4
|
+
export const REWARD_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
5
|
+
/** Máximo de ítems de un paquete (B-12 de rewards-business: presupuesto de tiempo del worker). Igual a `MAX_ITEMS_PER_PACKAGE` del lambda. */
|
|
6
|
+
export const REWARD_PACKAGE_MAX_ITEMS = 4;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { IsEnum, IsNotEmpty, IsObject, IsString, Matches, MaxLength, ValidateNested } from 'class-validator';
|
|
3
|
+
import { JsonValue } from '../../../common';
|
|
4
|
+
import { REWARD_ID_PATTERN } from '../../constants/BackofficeLimits';
|
|
5
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
6
|
+
import { RewardChargeToInput } from './RewardChargeToInput';
|
|
7
|
+
import { RewardCostInput } from './RewardCostInput';
|
|
8
|
+
|
|
9
|
+
/** Crear (POST) o reemplazar (PUT) una recompensa del catálogo. `version`, `dependencies` y `updatedBy` los pone el servidor. */
|
|
10
|
+
export class CatalogItemRequest {
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsString()
|
|
13
|
+
@Matches(REWARD_ID_PATTERN)
|
|
14
|
+
id: string;
|
|
15
|
+
|
|
16
|
+
@Expose()
|
|
17
|
+
@IsString()
|
|
18
|
+
@IsNotEmpty()
|
|
19
|
+
@MaxLength(120)
|
|
20
|
+
name: string;
|
|
21
|
+
|
|
22
|
+
@Expose()
|
|
23
|
+
@IsString()
|
|
24
|
+
@MaxLength(500)
|
|
25
|
+
description: string;
|
|
26
|
+
|
|
27
|
+
/** `type` del adaptador (IRewardType.type). Inmutable una vez creada la recompensa. */
|
|
28
|
+
@Expose()
|
|
29
|
+
@IsString()
|
|
30
|
+
@IsNotEmpty()
|
|
31
|
+
@MaxLength(60)
|
|
32
|
+
type: string;
|
|
33
|
+
|
|
34
|
+
/** Forma definida por cada tipo; el lambda la valida con `IRewardType.validateConfig`. */
|
|
35
|
+
@Expose()
|
|
36
|
+
@IsObject()
|
|
37
|
+
config: { [key: string]: JsonValue };
|
|
38
|
+
|
|
39
|
+
@Expose()
|
|
40
|
+
@ValidateNested()
|
|
41
|
+
@Type(() => RewardCostInput)
|
|
42
|
+
cost: RewardCostInput;
|
|
43
|
+
|
|
44
|
+
@Expose()
|
|
45
|
+
@ValidateNested()
|
|
46
|
+
@Type(() => RewardChargeToInput)
|
|
47
|
+
chargeTo: RewardChargeToInput;
|
|
48
|
+
|
|
49
|
+
@Expose()
|
|
50
|
+
@IsEnum(RewardStatusEnum)
|
|
51
|
+
status: RewardStatusEnum;
|
|
52
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { JsonValue } from '../../../common';
|
|
2
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
3
|
+
import { RewardChargeTo } from '../RewardChargeTo';
|
|
4
|
+
import { RewardCost } from '../RewardCost';
|
|
5
|
+
import { RewardDependency } from '../RewardDependency';
|
|
6
|
+
|
|
7
|
+
export class CatalogItemResponse {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
type: string;
|
|
12
|
+
config: { [key: string]: JsonValue };
|
|
13
|
+
cost: RewardCost;
|
|
14
|
+
chargeTo: RewardChargeTo;
|
|
15
|
+
/** Solo lectura: las calcula el tipo a partir de `config`. */
|
|
16
|
+
dependencies: RewardDependency[];
|
|
17
|
+
status: RewardStatusEnum;
|
|
18
|
+
version: number;
|
|
19
|
+
updatedBy: string;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
updatedAt: number;
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsString, Matches } from 'class-validator';
|
|
3
|
+
import { REWARD_ID_PATTERN, REWARD_ITEM_KEY_PATTERN } from '../../constants/BackofficeLimits';
|
|
4
|
+
|
|
5
|
+
export class PackageItemRequest {
|
|
6
|
+
@Expose()
|
|
7
|
+
@IsString()
|
|
8
|
+
@Matches(REWARD_ITEM_KEY_PATTERN)
|
|
9
|
+
itemKey: string;
|
|
10
|
+
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsString()
|
|
13
|
+
@Matches(REWARD_ID_PATTERN)
|
|
14
|
+
catalogItemId: string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, IsNotEmpty, IsString, Matches, MaxLength, ValidateNested } from 'class-validator';
|
|
3
|
+
import { REWARD_ID_PATTERN, REWARD_PACKAGE_MAX_ITEMS } from '../../constants/BackofficeLimits';
|
|
4
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
5
|
+
import { PackageItemRequest } from './PackageItemRequest';
|
|
6
|
+
|
|
7
|
+
export class PackageRequest {
|
|
8
|
+
@Expose()
|
|
9
|
+
@IsString()
|
|
10
|
+
@Matches(REWARD_ID_PATTERN)
|
|
11
|
+
id: string;
|
|
12
|
+
|
|
13
|
+
@Expose()
|
|
14
|
+
@IsString()
|
|
15
|
+
@IsNotEmpty()
|
|
16
|
+
@MaxLength(120)
|
|
17
|
+
name: string;
|
|
18
|
+
|
|
19
|
+
@Expose()
|
|
20
|
+
@IsEnum(RewardStatusEnum)
|
|
21
|
+
status: RewardStatusEnum;
|
|
22
|
+
|
|
23
|
+
/** Ordenada: el orden es el de ejecución. De 1 a 4 ítems (el tope depende del presupuesto de tiempo del worker, B-12; el lambda lo valida otra vez). */
|
|
24
|
+
@Expose()
|
|
25
|
+
@IsArray()
|
|
26
|
+
@ArrayMinSize(1)
|
|
27
|
+
@ArrayMaxSize(REWARD_PACKAGE_MAX_ITEMS)
|
|
28
|
+
@ValidateNested({ each: true })
|
|
29
|
+
@Type(() => PackageItemRequest)
|
|
30
|
+
items: PackageItemRequest[];
|
|
31
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RewardStatusEnum } from '../../enums/RewardStatusEnum';
|
|
2
|
+
import { RewardCost } from '../RewardCost';
|
|
3
|
+
|
|
4
|
+
export class PackageItemResponse {
|
|
5
|
+
itemKey: string;
|
|
6
|
+
catalogItemId: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class PackageResponse {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
status: RewardStatusEnum;
|
|
13
|
+
version: number;
|
|
14
|
+
items: PackageItemResponse[];
|
|
15
|
+
/** Costo total declarado por moneda (spec 5.2). */
|
|
16
|
+
totalCost: RewardCost[];
|
|
17
|
+
updatedBy: string;
|
|
18
|
+
createdAt: number;
|
|
19
|
+
updatedAt: number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsNotEmpty, IsString, MaxLength } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
export class RewardChargeToInput {
|
|
5
|
+
@Expose()
|
|
6
|
+
@IsString()
|
|
7
|
+
@IsNotEmpty()
|
|
8
|
+
@MaxLength(64)
|
|
9
|
+
partnerId: string;
|
|
10
|
+
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsString()
|
|
13
|
+
@IsNotEmpty()
|
|
14
|
+
@MaxLength(120)
|
|
15
|
+
partnerName: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsEnum, IsNumber, Min } from 'class-validator';
|
|
3
|
+
import { CurrencyId } from '../../../currency';
|
|
4
|
+
|
|
5
|
+
export class RewardCostInput {
|
|
6
|
+
@Expose()
|
|
7
|
+
@IsNumber({ maxDecimalPlaces: 2 })
|
|
8
|
+
@Min(0)
|
|
9
|
+
amount: number;
|
|
10
|
+
|
|
11
|
+
@Expose()
|
|
12
|
+
@IsEnum(CurrencyId)
|
|
13
|
+
currency: CurrencyId;
|
|
14
|
+
}
|
package/src/rewards/index.ts
CHANGED
|
@@ -35,3 +35,18 @@ export * from './dtos/responses/PackageContractResponse';
|
|
|
35
35
|
export * from './dtos/responses/GrantAttemptResponse';
|
|
36
36
|
export * from './dtos/responses/GrantItemResponse';
|
|
37
37
|
export * from './dtos/responses/GrantResponse';
|
|
38
|
+
|
|
39
|
+
//Constants backoffice
|
|
40
|
+
export * from './constants/BackofficeLimits';
|
|
41
|
+
|
|
42
|
+
//DTOs backoffice
|
|
43
|
+
export * from './dtos/backoffice/RewardCostInput';
|
|
44
|
+
export * from './dtos/backoffice/RewardChargeToInput';
|
|
45
|
+
export * from './dtos/backoffice/CatalogItemRequest';
|
|
46
|
+
export * from './dtos/backoffice/CatalogItemResponse';
|
|
47
|
+
export * from './dtos/backoffice/PackageItemRequest';
|
|
48
|
+
export * from './dtos/backoffice/PackageRequest';
|
|
49
|
+
export * from './dtos/backoffice/PackageResponse';
|
|
50
|
+
export * from './dtos/backoffice/RewardTypeResponse';
|
|
51
|
+
export * from './dtos/backoffice/CatalogItemListResponse';
|
|
52
|
+
export * from './dtos/backoffice/PackageListResponse';
|