@fiado/type-kit 3.76.0 → 3.78.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/bin/complaint/dtos/ComplaintResponse.d.ts +23 -0
- package/bin/complaint/dtos/ComplaintResponse.js +77 -0
- package/bin/complaint/dtos/CreateComplaintRequest.d.ts +16 -0
- package/bin/complaint/dtos/CreateComplaintRequest.js +56 -0
- package/bin/complaint/index.d.ts +2 -0
- package/bin/complaint/index.js +18 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +1 -0
- package/bin/platformRbac/dtos/TenantSecurityPolicyResponse.d.ts +10 -0
- package/bin/platformRbac/dtos/UpdateTenantSecurityPolicyRequest.d.ts +3 -0
- package/bin/{benefitCenter/dtos/InputSchemaOverrideRequest.js → platformRbac/dtos/UpdateTenantSecurityPolicyRequest.js} +10 -14
- package/bin/platformRbac/index.d.ts +3 -0
- package/bin/platformRbac/index.js +5 -0
- package/bin/platformRbac/mfa/MfaOptionsResponse.d.ts +6 -0
- package/bin/{credit/dtos/internal/CreditReversalRequest.js → platformRbac/mfa/MfaOptionsResponse.js} +13 -14
- package/package.json +1 -1
- package/src/complaint/dtos/ComplaintResponse.ts +26 -0
- package/src/complaint/dtos/CreateComplaintRequest.ts +43 -0
- package/src/complaint/index.ts +2 -0
- package/src/index.ts +1 -0
- package/src/platformRbac/dtos/TenantSecurityPolicyResponse.ts +10 -0
- package/src/platformRbac/dtos/UpdateTenantSecurityPolicyRequest.ts +11 -0
- package/src/platformRbac/index.ts +7 -0
- package/src/platformRbac/mfa/MfaOptionsResponse.ts +14 -0
- package/bin/benefitCenter/dtos/BackofficeLeafOverrideUpsertRequest.d.ts +0 -22
- package/bin/benefitCenter/dtos/BackofficeLeafOverrideUpsertRequest.js +0 -91
- package/bin/benefitCenter/dtos/FieldOverrideRequest.d.ts +0 -19
- package/bin/benefitCenter/dtos/FieldOverrideRequest.js +0 -80
- package/bin/benefitCenter/dtos/InputSchemaOverrideRequest.d.ts +0 -9
- package/bin/benefitCenter/enums/LeafOverrideStatusEnum.d.ts +0 -10
- package/bin/benefitCenter/enums/LeafOverrideStatusEnum.js +0 -14
- package/bin/cognitoBackofficeConnector/dtos/MfaPoolConfig.d.ts +0 -7
- package/bin/cognitoBackofficeConnector/dtos/MfaPoolConfig.js +0 -36
- package/bin/cognitoBackofficeConnector/validators/MfaTypesRequiresOne.d.ts +0 -17
- package/bin/cognitoBackofficeConnector/validators/MfaTypesRequiresOne.js +0 -39
- package/bin/cognitoConnector/dtos/SignUpBackofficeRequest.d.ts +0 -13
- package/bin/cognitoConnector/dtos/SignUpBackofficeRequest.js +0 -71
- package/bin/comission-business/dtos/GenerateReportRequest.d.ts +0 -10
- package/bin/comission-business/dtos/GenerateReportResponse.d.ts +0 -6
- package/bin/comission-business/dtos/GenerateReportResponse.js +0 -2
- package/bin/comission-business/enums/PaymentStatusEnum.d.ts +0 -5
- package/bin/comission-business/enums/PaymentStatusEnum.js +0 -9
- package/bin/credit/dtos/CreditBannerStateResponse.d.ts +0 -10
- package/bin/credit/dtos/CreditBannerStateResponse.js +0 -6
- package/bin/credit/dtos/CreditDetailResponse.d.ts +0 -23
- package/bin/credit/dtos/CreditDetailResponse.js +0 -6
- package/bin/credit/dtos/CreditEligibilityResponse.d.ts +0 -9
- package/bin/credit/dtos/CreditEligibilityResponse.js +0 -6
- package/bin/credit/dtos/CreditMovementResponse.d.ts +0 -20
- package/bin/credit/dtos/CreditMovementResponse.js +0 -9
- package/bin/credit/dtos/CreditRequestCreate.d.ts +0 -4
- package/bin/credit/dtos/CreditRequestCreate.js +0 -26
- package/bin/credit/dtos/CreditRequestResponse.d.ts +0 -7
- package/bin/credit/dtos/CreditRequestResponse.js +0 -6
- package/bin/credit/dtos/CreditScheduleResponse.d.ts +0 -18
- package/bin/credit/dtos/CreditScheduleResponse.js +0 -9
- package/bin/credit/dtos/CreditStatementResponse.d.ts +0 -11
- package/bin/credit/dtos/CreditStatementResponse.js +0 -9
- package/bin/credit/dtos/EarlyPaymentRequest.d.ts +0 -7
- package/bin/credit/dtos/EarlyPaymentRequest.js +0 -37
- package/bin/credit/dtos/EarlyPaymentResponse.d.ts +0 -11
- package/bin/credit/dtos/EarlyPaymentResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditBalanceRequest.d.ts +0 -3
- package/bin/credit/dtos/internal/CreditBalanceRequest.js +0 -21
- package/bin/credit/dtos/internal/CreditCollectionRequest.d.ts +0 -11
- package/bin/credit/dtos/internal/CreditCollectionRequest.js +0 -59
- package/bin/credit/dtos/internal/CreditCollectionResponse.d.ts +0 -12
- package/bin/credit/dtos/internal/CreditCollectionResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditDisbursementRequest.d.ts +0 -7
- package/bin/credit/dtos/internal/CreditDisbursementRequest.js +0 -43
- package/bin/credit/dtos/internal/CreditDisbursementResponse.d.ts +0 -8
- package/bin/credit/dtos/internal/CreditDisbursementResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditProfileRequest.d.ts +0 -3
- package/bin/credit/dtos/internal/CreditProfileRequest.js +0 -23
- package/bin/credit/dtos/internal/CreditReversalRequest.d.ts +0 -5
- package/bin/credit/dtos/internal/CreditReversalResponse.d.ts +0 -7
- package/bin/credit/dtos/internal/CreditReversalResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditTransferLoancoRequest.d.ts +0 -8
- package/bin/credit/dtos/internal/CreditTransferLoancoRequest.js +0 -46
- package/bin/credit/dtos/internal/CreditTransferLoancoResponse.d.ts +0 -8
- package/bin/credit/dtos/internal/CreditTransferLoancoResponse.js +0 -6
- package/bin/credit/dtos/internal/DocumentSignRequest.d.ts +0 -3
- package/bin/credit/dtos/internal/DocumentSignRequest.js +0 -21
- package/bin/credit/dtos/internal/LienApplyRequest.d.ts +0 -7
- package/bin/credit/dtos/internal/LienApplyRequest.js +0 -45
- package/bin/credit/enums/CollectionFrequencyEnum.d.ts +0 -5
- package/bin/credit/enums/CollectionFrequencyEnum.js +0 -9
- package/bin/credit/enums/CreditOperationEnum.d.ts +0 -11
- package/bin/credit/enums/CreditOperationEnum.js +0 -15
- package/bin/credit/enums/CreditStatusEnum.d.ts +0 -12
- package/bin/credit/enums/CreditStatusEnum.js +0 -16
- package/bin/credit/enums/DelinquencyLevelEnum.d.ts +0 -9
- package/bin/credit/enums/DelinquencyLevelEnum.js +0 -13
- package/bin/credit/enums/DocumentTypeEnum.d.ts +0 -8
- package/bin/credit/enums/DocumentTypeEnum.js +0 -12
- package/bin/credit/enums/OfferStatusEnum.d.ts +0 -8
- package/bin/credit/enums/OfferStatusEnum.js +0 -12
- package/bin/credit/enums/PaymentTypeEnum.d.ts +0 -9
- package/bin/credit/enums/PaymentTypeEnum.js +0 -13
- package/bin/credit/enums/ReconciliationStatusEnum.d.ts +0 -6
- package/bin/credit/enums/ReconciliationStatusEnum.js +0 -10
- package/bin/credit/enums/TransferStatusEnum.d.ts +0 -8
- package/bin/credit/enums/TransferStatusEnum.js +0 -12
- package/docs/superpowers/plans/2026-05-22-http-client-inversify-v8.md +0 -243
- package/docs/superpowers/specs/2026-05-22-inversify-v8-migration-design.md +0 -191
- /package/bin/{comission-business/dtos/GenerateReportRequest.js → platformRbac/dtos/TenantSecurityPolicyResponse.js} +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Respuesta de lectura de una denuncia (`GET /complaints/{complaintId}`).
|
|
3
|
+
* NO incluye `createdBy` (email real) — solo `createdByHash`. El Dashboard
|
|
4
|
+
* nunca conoce la identidad del denunciante.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ComplaintResponse {
|
|
7
|
+
id: string;
|
|
8
|
+
category: string;
|
|
9
|
+
title: string;
|
|
10
|
+
message: string;
|
|
11
|
+
status: string;
|
|
12
|
+
alertId?: string;
|
|
13
|
+
createdByHash?: string;
|
|
14
|
+
deadlineAt: string;
|
|
15
|
+
dictamenAt?: string | null;
|
|
16
|
+
dictamenBy?: string | null;
|
|
17
|
+
createdAt?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Respuesta del create — ids para enlazar denuncia ↔ alerta. */
|
|
20
|
+
export declare class CreateComplaintResponse {
|
|
21
|
+
complaintId: string;
|
|
22
|
+
alertId: string;
|
|
23
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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.CreateComplaintResponse = exports.ComplaintResponse = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
/**
|
|
15
|
+
* Respuesta de lectura de una denuncia (`GET /complaints/{complaintId}`).
|
|
16
|
+
* NO incluye `createdBy` (email real) — solo `createdByHash`. El Dashboard
|
|
17
|
+
* nunca conoce la identidad del denunciante.
|
|
18
|
+
*/
|
|
19
|
+
class ComplaintResponse {
|
|
20
|
+
}
|
|
21
|
+
exports.ComplaintResponse = ComplaintResponse;
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, class_transformer_1.Expose)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], ComplaintResponse.prototype, "id", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_transformer_1.Expose)(),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], ComplaintResponse.prototype, "category", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, class_transformer_1.Expose)(),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], ComplaintResponse.prototype, "title", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
__metadata("design:type", String)
|
|
37
|
+
], ComplaintResponse.prototype, "message", void 0);
|
|
38
|
+
__decorate([
|
|
39
|
+
(0, class_transformer_1.Expose)(),
|
|
40
|
+
__metadata("design:type", String)
|
|
41
|
+
], ComplaintResponse.prototype, "status", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, class_transformer_1.Expose)(),
|
|
44
|
+
__metadata("design:type", String)
|
|
45
|
+
], ComplaintResponse.prototype, "alertId", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
(0, class_transformer_1.Expose)(),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], ComplaintResponse.prototype, "createdByHash", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, class_transformer_1.Expose)(),
|
|
52
|
+
__metadata("design:type", String)
|
|
53
|
+
], ComplaintResponse.prototype, "deadlineAt", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, class_transformer_1.Expose)(),
|
|
56
|
+
__metadata("design:type", String)
|
|
57
|
+
], ComplaintResponse.prototype, "dictamenAt", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
(0, class_transformer_1.Expose)(),
|
|
60
|
+
__metadata("design:type", String)
|
|
61
|
+
], ComplaintResponse.prototype, "dictamenBy", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, class_transformer_1.Expose)(),
|
|
64
|
+
__metadata("design:type", String)
|
|
65
|
+
], ComplaintResponse.prototype, "createdAt", void 0);
|
|
66
|
+
/** Respuesta del create — ids para enlazar denuncia ↔ alerta. */
|
|
67
|
+
class CreateComplaintResponse {
|
|
68
|
+
}
|
|
69
|
+
exports.CreateComplaintResponse = CreateComplaintResponse;
|
|
70
|
+
__decorate([
|
|
71
|
+
(0, class_transformer_1.Expose)(),
|
|
72
|
+
__metadata("design:type", String)
|
|
73
|
+
], CreateComplaintResponse.prototype, "complaintId", void 0);
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, class_transformer_1.Expose)(),
|
|
76
|
+
__metadata("design:type", String)
|
|
77
|
+
], CreateComplaintResponse.prototype, "alertId", void 0);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catálogo de categorías del buzón anónimo de denuncias (BO-19, Manual cap. 20.3).
|
|
3
|
+
*/
|
|
4
|
+
export declare const COMPLAINT_CATEGORIES: readonly ["Sospecha sobre un cliente", "Sospecha sobre un empleado", "Conflicto de interés", "Incumplimiento del Manual", "Otro"];
|
|
5
|
+
export type ComplaintCategory = (typeof COMPLAINT_CATEGORIES)[number];
|
|
6
|
+
/**
|
|
7
|
+
* Request para crear una denuncia en el buzón anónimo (`complaint-mailbox-business`).
|
|
8
|
+
* El `userEmail` se persiste interno como `createdBy` y se hashea (`createdByHash`);
|
|
9
|
+
* el Dashboard nunca conoce la identidad real del denunciante.
|
|
10
|
+
*/
|
|
11
|
+
export declare class CreateComplaintRequest {
|
|
12
|
+
category: string;
|
|
13
|
+
title: string;
|
|
14
|
+
message: string;
|
|
15
|
+
userEmail: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
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.CreateComplaintRequest = exports.COMPLAINT_CATEGORIES = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
/**
|
|
16
|
+
* Catálogo de categorías del buzón anónimo de denuncias (BO-19, Manual cap. 20.3).
|
|
17
|
+
*/
|
|
18
|
+
exports.COMPLAINT_CATEGORIES = [
|
|
19
|
+
"Sospecha sobre un cliente",
|
|
20
|
+
"Sospecha sobre un empleado",
|
|
21
|
+
"Conflicto de interés",
|
|
22
|
+
"Incumplimiento del Manual",
|
|
23
|
+
"Otro",
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Request para crear una denuncia en el buzón anónimo (`complaint-mailbox-business`).
|
|
27
|
+
* El `userEmail` se persiste interno como `createdBy` y se hashea (`createdByHash`);
|
|
28
|
+
* el Dashboard nunca conoce la identidad real del denunciante.
|
|
29
|
+
*/
|
|
30
|
+
class CreateComplaintRequest {
|
|
31
|
+
}
|
|
32
|
+
exports.CreateComplaintRequest = CreateComplaintRequest;
|
|
33
|
+
__decorate([
|
|
34
|
+
(0, class_transformer_1.Expose)(),
|
|
35
|
+
(0, class_validator_1.IsString)(),
|
|
36
|
+
(0, class_validator_1.IsIn)(exports.COMPLAINT_CATEGORIES, { message: "category inválida" }),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], CreateComplaintRequest.prototype, "category", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, class_transformer_1.Expose)(),
|
|
41
|
+
(0, class_validator_1.IsString)(),
|
|
42
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
43
|
+
(0, class_validator_1.MaxLength)(200),
|
|
44
|
+
__metadata("design:type", String)
|
|
45
|
+
], CreateComplaintRequest.prototype, "title", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
(0, class_transformer_1.Expose)(),
|
|
48
|
+
(0, class_validator_1.IsString)(),
|
|
49
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
50
|
+
__metadata("design:type", String)
|
|
51
|
+
], CreateComplaintRequest.prototype, "message", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
(0, class_transformer_1.Expose)(),
|
|
54
|
+
(0, class_validator_1.IsEmail)({}, { message: "userEmail debe ser un correo válido" }),
|
|
55
|
+
__metadata("design:type", String)
|
|
56
|
+
], CreateComplaintRequest.prototype, "userEmail", void 0);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./dtos/CreateComplaintRequest"), exports);
|
|
18
|
+
__exportStar(require("./dtos/ComplaintResponse"), exports);
|
package/bin/index.d.ts
CHANGED
package/bin/index.js
CHANGED
|
@@ -126,3 +126,4 @@ exports.Remittance = __importStar(require("./remittance"));
|
|
|
126
126
|
exports.WalletFunding = __importStar(require("./walletFunding"));
|
|
127
127
|
exports.TotpSecurity = __importStar(require("./totpSecurity"));
|
|
128
128
|
__exportStar(require("./messaging"), exports);
|
|
129
|
+
__exportStar(require("./complaint"), exports);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output de la consulta/actualización de la security policy del tenant. Response plain sin
|
|
3
|
+
* validators (no validamos lo que mandamos al cliente — fiado-validation-and-dtos § 7).
|
|
4
|
+
*
|
|
5
|
+
* TD-RBAC-071: methodsAllowed usa el value-set 'EMAIL'|'TOTP' (string), distinto de
|
|
6
|
+
* MfaMethodEnum ('EMAIL_OTP'|'TOTP') a propósito. Ver TECH_DEBT.md del platform-rbac-business.
|
|
7
|
+
*/
|
|
8
|
+
export interface TenantSecurityPolicyResponse {
|
|
9
|
+
methodsAllowed: ('EMAIL' | 'TOTP')[];
|
|
10
|
+
}
|
|
@@ -9,21 +9,17 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
13
|
-
const class_validator_1 = require("class-validator");
|
|
12
|
+
exports.UpdateTenantSecurityPolicyRequest = void 0;
|
|
14
13
|
const class_transformer_1 = require("class-transformer");
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* inputSchema del conector la hace el manager (no se puede expresar con class-validator).
|
|
20
|
-
*/
|
|
21
|
-
class InputSchemaOverrideRequest {
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
// TD-RBAC-071: methodsAllowed usa el value-set 'EMAIL'|'TOTP' (string), distinto de MfaMethodEnum
|
|
16
|
+
// ('EMAIL_OTP'|'TOTP') a propósito. Ver TECH_DEBT.md del platform-rbac-business.
|
|
17
|
+
class UpdateTenantSecurityPolicyRequest {
|
|
22
18
|
}
|
|
23
|
-
exports.
|
|
19
|
+
exports.UpdateTenantSecurityPolicyRequest = UpdateTenantSecurityPolicyRequest;
|
|
24
20
|
__decorate([
|
|
25
|
-
(0,
|
|
26
|
-
(0, class_validator_1.
|
|
27
|
-
(0,
|
|
21
|
+
(0, class_transformer_1.Expose)(),
|
|
22
|
+
(0, class_validator_1.ArrayNotEmpty)(),
|
|
23
|
+
(0, class_validator_1.IsIn)(['EMAIL', 'TOTP'], { each: true }),
|
|
28
24
|
__metadata("design:type", Array)
|
|
29
|
-
],
|
|
25
|
+
], UpdateTenantSecurityPolicyRequest.prototype, "methodsAllowed", void 0);
|
|
@@ -20,9 +20,12 @@ export * from './mfa/EnrollTotpResponse';
|
|
|
20
20
|
export * from './mfa/VerifyTotpEnrollmentRequest';
|
|
21
21
|
export * from './mfa/ChangeMfaMethodRequest';
|
|
22
22
|
export * from './mfa/MfaStatusResponse';
|
|
23
|
+
export * from './mfa/MfaOptionsResponse';
|
|
23
24
|
export { AuthorizeDenyReason } from './enums/AuthorizeDenyReason';
|
|
24
25
|
export * from './dtos/AuthorizeRequest';
|
|
25
26
|
export * from './dtos/AuthorizeResponse';
|
|
26
27
|
export * from './dtos/CreateTenantRequest';
|
|
27
28
|
export type { CreateTenantResponse } from './dtos/CreateTenantResponse';
|
|
29
|
+
export * from './dtos/UpdateTenantSecurityPolicyRequest';
|
|
30
|
+
export type { TenantSecurityPolicyResponse } from './dtos/TenantSecurityPolicyResponse';
|
|
28
31
|
export { TenantType, TENANT_TYPES, levelsOf, tableSuffixForLevel, scopeRankOrder } from './tenantTypes';
|
|
@@ -51,6 +51,7 @@ __exportStar(require("./mfa/EnrollTotpResponse"), exports);
|
|
|
51
51
|
__exportStar(require("./mfa/VerifyTotpEnrollmentRequest"), exports);
|
|
52
52
|
__exportStar(require("./mfa/ChangeMfaMethodRequest"), exports);
|
|
53
53
|
__exportStar(require("./mfa/MfaStatusResponse"), exports);
|
|
54
|
+
__exportStar(require("./mfa/MfaOptionsResponse"), exports);
|
|
54
55
|
// RBAC enforcement (capa de protección) — DTOs del POST /internal/authorize.
|
|
55
56
|
var AuthorizeDenyReason_1 = require("./enums/AuthorizeDenyReason");
|
|
56
57
|
Object.defineProperty(exports, "AuthorizeDenyReason", { enumerable: true, get: function () { return AuthorizeDenyReason_1.AuthorizeDenyReason; } });
|
|
@@ -59,6 +60,10 @@ __exportStar(require("./dtos/AuthorizeResponse"), exports);
|
|
|
59
60
|
// F-11 — onboarding de tenant (POST backoffice createTenant). CreateTenantRequest lleva
|
|
60
61
|
// decoradores class-validator → export de valor; CreateTenantResponse es interface → type-only.
|
|
61
62
|
__exportStar(require("./dtos/CreateTenantRequest"), exports);
|
|
63
|
+
// MFA por tenant — methodsAllowed (value-set 'EMAIL'|'TOTP', TD-RBAC-071, DEC-095).
|
|
64
|
+
// UpdateTenantSecurityPolicyRequest lleva decoradores class-validator → export de valor;
|
|
65
|
+
// TenantSecurityPolicyResponse es interface plain → type-only.
|
|
66
|
+
__exportStar(require("./dtos/UpdateTenantSecurityPolicyRequest"), exports);
|
|
62
67
|
// A1 — registro data-driven de tenant-types (niveles debajo de TENANT, por tipo).
|
|
63
68
|
// Consumido por ScopeValidationService._rank vía scopeRankOrder() y por los seeds.
|
|
64
69
|
// Accesible bajo el namespace PlatformRbac (el index raíz hace export * as PlatformRbac).
|
package/bin/{credit/dtos/internal/CreditReversalRequest.js → platformRbac/mfa/MfaOptionsResponse.js}
RENAMED
|
@@ -9,23 +9,22 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.MfaOptionsResponse = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
|
-
|
|
14
|
+
const MfaMethodEnum_1 = require("../enums/MfaMethodEnum");
|
|
15
|
+
class MfaOptionsResponse {
|
|
15
16
|
}
|
|
16
|
-
exports.
|
|
17
|
+
exports.MfaOptionsResponse = MfaOptionsResponse;
|
|
17
18
|
__decorate([
|
|
18
|
-
(0, class_validator_1.
|
|
19
|
-
(0, class_validator_1.
|
|
20
|
-
__metadata("design:type",
|
|
21
|
-
],
|
|
19
|
+
(0, class_validator_1.IsArray)(),
|
|
20
|
+
(0, class_validator_1.IsEnum)(MfaMethodEnum_1.MfaMethodEnum, { each: true }),
|
|
21
|
+
__metadata("design:type", Array)
|
|
22
|
+
], MfaOptionsResponse.prototype, "allowedMethods", void 0);
|
|
22
23
|
__decorate([
|
|
23
|
-
(0, class_validator_1.
|
|
24
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
24
|
+
(0, class_validator_1.IsEnum)(MfaMethodEnum_1.MfaMethodEnum),
|
|
25
25
|
__metadata("design:type", String)
|
|
26
|
-
],
|
|
26
|
+
], MfaOptionsResponse.prototype, "currentMethod", void 0);
|
|
27
27
|
__decorate([
|
|
28
|
-
(0, class_validator_1.
|
|
29
|
-
(
|
|
30
|
-
|
|
31
|
-
], CreditReversalRequest.prototype, "reason", void 0);
|
|
28
|
+
(0, class_validator_1.IsBoolean)(),
|
|
29
|
+
__metadata("design:type", Boolean)
|
|
30
|
+
], MfaOptionsResponse.prototype, "mfaConfigured", void 0);
|
package/package.json
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Expose } from "class-transformer";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Respuesta de lectura de una denuncia (`GET /complaints/{complaintId}`).
|
|
5
|
+
* NO incluye `createdBy` (email real) — solo `createdByHash`. El Dashboard
|
|
6
|
+
* nunca conoce la identidad del denunciante.
|
|
7
|
+
*/
|
|
8
|
+
export class ComplaintResponse {
|
|
9
|
+
@Expose() id!: string;
|
|
10
|
+
@Expose() category!: string;
|
|
11
|
+
@Expose() title!: string;
|
|
12
|
+
@Expose() message!: string;
|
|
13
|
+
@Expose() status!: string; // OPEN | CLOSE_JUSTIFIED | CLOSE_RULED
|
|
14
|
+
@Expose() alertId?: string;
|
|
15
|
+
@Expose() createdByHash?: string;
|
|
16
|
+
@Expose() deadlineAt!: string;
|
|
17
|
+
@Expose() dictamenAt?: string | null;
|
|
18
|
+
@Expose() dictamenBy?: string | null;
|
|
19
|
+
@Expose() createdAt?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Respuesta del create — ids para enlazar denuncia ↔ alerta. */
|
|
23
|
+
export class CreateComplaintResponse {
|
|
24
|
+
@Expose() complaintId!: string;
|
|
25
|
+
@Expose() alertId!: string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Expose } from "class-transformer";
|
|
2
|
+
import { IsEmail, IsIn, IsNotEmpty, IsString, MaxLength } from "class-validator";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Catálogo de categorías del buzón anónimo de denuncias (BO-19, Manual cap. 20.3).
|
|
6
|
+
*/
|
|
7
|
+
export const COMPLAINT_CATEGORIES = [
|
|
8
|
+
"Sospecha sobre un cliente",
|
|
9
|
+
"Sospecha sobre un empleado",
|
|
10
|
+
"Conflicto de interés",
|
|
11
|
+
"Incumplimiento del Manual",
|
|
12
|
+
"Otro",
|
|
13
|
+
] as const;
|
|
14
|
+
|
|
15
|
+
export type ComplaintCategory = (typeof COMPLAINT_CATEGORIES)[number];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Request para crear una denuncia en el buzón anónimo (`complaint-mailbox-business`).
|
|
19
|
+
* El `userEmail` se persiste interno como `createdBy` y se hashea (`createdByHash`);
|
|
20
|
+
* el Dashboard nunca conoce la identidad real del denunciante.
|
|
21
|
+
*/
|
|
22
|
+
export class CreateComplaintRequest {
|
|
23
|
+
|
|
24
|
+
@Expose()
|
|
25
|
+
@IsString()
|
|
26
|
+
@IsIn(COMPLAINT_CATEGORIES as unknown as string[], { message: "category inválida" })
|
|
27
|
+
category!: string;
|
|
28
|
+
|
|
29
|
+
@Expose()
|
|
30
|
+
@IsString()
|
|
31
|
+
@IsNotEmpty()
|
|
32
|
+
@MaxLength(200)
|
|
33
|
+
title!: string;
|
|
34
|
+
|
|
35
|
+
@Expose()
|
|
36
|
+
@IsString()
|
|
37
|
+
@IsNotEmpty()
|
|
38
|
+
message!: string; // HTML del editor
|
|
39
|
+
|
|
40
|
+
@Expose()
|
|
41
|
+
@IsEmail({}, { message: "userEmail debe ser un correo válido" })
|
|
42
|
+
userEmail!: string;
|
|
43
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output de la consulta/actualización de la security policy del tenant. Response plain sin
|
|
3
|
+
* validators (no validamos lo que mandamos al cliente — fiado-validation-and-dtos § 7).
|
|
4
|
+
*
|
|
5
|
+
* TD-RBAC-071: methodsAllowed usa el value-set 'EMAIL'|'TOTP' (string), distinto de
|
|
6
|
+
* MfaMethodEnum ('EMAIL_OTP'|'TOTP') a propósito. Ver TECH_DEBT.md del platform-rbac-business.
|
|
7
|
+
*/
|
|
8
|
+
export interface TenantSecurityPolicyResponse {
|
|
9
|
+
methodsAllowed: ('EMAIL' | 'TOTP')[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { ArrayNotEmpty, IsIn } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
// TD-RBAC-071: methodsAllowed usa el value-set 'EMAIL'|'TOTP' (string), distinto de MfaMethodEnum
|
|
5
|
+
// ('EMAIL_OTP'|'TOTP') a propósito. Ver TECH_DEBT.md del platform-rbac-business.
|
|
6
|
+
export class UpdateTenantSecurityPolicyRequest {
|
|
7
|
+
@Expose()
|
|
8
|
+
@ArrayNotEmpty()
|
|
9
|
+
@IsIn(['EMAIL', 'TOTP'], { each: true })
|
|
10
|
+
methodsAllowed!: ('EMAIL' | 'TOTP')[];
|
|
11
|
+
}
|
|
@@ -40,6 +40,7 @@ export * from './mfa/EnrollTotpResponse';
|
|
|
40
40
|
export * from './mfa/VerifyTotpEnrollmentRequest';
|
|
41
41
|
export * from './mfa/ChangeMfaMethodRequest';
|
|
42
42
|
export * from './mfa/MfaStatusResponse';
|
|
43
|
+
export * from './mfa/MfaOptionsResponse';
|
|
43
44
|
|
|
44
45
|
// RBAC enforcement (capa de protección) — DTOs del POST /internal/authorize.
|
|
45
46
|
export { AuthorizeDenyReason } from './enums/AuthorizeDenyReason';
|
|
@@ -51,6 +52,12 @@ export * from './dtos/AuthorizeResponse';
|
|
|
51
52
|
export * from './dtos/CreateTenantRequest';
|
|
52
53
|
export type { CreateTenantResponse } from './dtos/CreateTenantResponse';
|
|
53
54
|
|
|
55
|
+
// MFA por tenant — methodsAllowed (value-set 'EMAIL'|'TOTP', TD-RBAC-071, DEC-095).
|
|
56
|
+
// UpdateTenantSecurityPolicyRequest lleva decoradores class-validator → export de valor;
|
|
57
|
+
// TenantSecurityPolicyResponse es interface plain → type-only.
|
|
58
|
+
export * from './dtos/UpdateTenantSecurityPolicyRequest';
|
|
59
|
+
export type { TenantSecurityPolicyResponse } from './dtos/TenantSecurityPolicyResponse';
|
|
60
|
+
|
|
54
61
|
// A1 — registro data-driven de tenant-types (niveles debajo de TENANT, por tipo).
|
|
55
62
|
// Consumido por ScopeValidationService._rank vía scopeRankOrder() y por los seeds.
|
|
56
63
|
// Accesible bajo el namespace PlatformRbac (el index raíz hace export * as PlatformRbac).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IsArray, IsBoolean, IsEnum } from 'class-validator';
|
|
2
|
+
import { MfaMethodEnum } from '../enums/MfaMethodEnum';
|
|
3
|
+
|
|
4
|
+
export class MfaOptionsResponse {
|
|
5
|
+
@IsArray()
|
|
6
|
+
@IsEnum(MfaMethodEnum, { each: true })
|
|
7
|
+
allowedMethods!: MfaMethodEnum[];
|
|
8
|
+
|
|
9
|
+
@IsEnum(MfaMethodEnum)
|
|
10
|
+
currentMethod!: MfaMethodEnum;
|
|
11
|
+
|
|
12
|
+
@IsBoolean()
|
|
13
|
+
mfaConfigured!: boolean;
|
|
14
|
+
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { InputSchemaOverrideRequest } from "./InputSchemaOverrideRequest";
|
|
2
|
-
/**
|
|
3
|
-
* Body de PUT /backoffice/leaves/{leafId}. Upsert parcial:
|
|
4
|
-
* - undefined → no se toca
|
|
5
|
-
* - string/number/boolean seteado → pisa el valor previo del override
|
|
6
|
-
* - null NO se acepta (para borrar un campo, usar DELETE /fields/{fieldName})
|
|
7
|
-
*
|
|
8
|
-
* Si todos los campos llegan undefined → 400 INVALID_PATCH_PAYLOAD.
|
|
9
|
-
*/
|
|
10
|
-
export declare class BackofficeLeafOverrideUpsertRequest {
|
|
11
|
-
serviceName?: string;
|
|
12
|
-
logo?: string;
|
|
13
|
-
description?: string;
|
|
14
|
-
helpText?: string;
|
|
15
|
-
serviceOrder?: number;
|
|
16
|
-
subcategoryOrder?: number;
|
|
17
|
-
enabled?: boolean;
|
|
18
|
-
category?: string;
|
|
19
|
-
subcategory?: string;
|
|
20
|
-
requiresReferenceVerification?: boolean;
|
|
21
|
-
inputSchema?: InputSchemaOverrideRequest;
|
|
22
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
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.BackofficeLeafOverrideUpsertRequest = void 0;
|
|
13
|
-
const class_validator_1 = require("class-validator");
|
|
14
|
-
const class_transformer_1 = require("class-transformer");
|
|
15
|
-
const InputSchemaOverrideRequest_1 = require("./InputSchemaOverrideRequest");
|
|
16
|
-
/**
|
|
17
|
-
* Body de PUT /backoffice/leaves/{leafId}. Upsert parcial:
|
|
18
|
-
* - undefined → no se toca
|
|
19
|
-
* - string/number/boolean seteado → pisa el valor previo del override
|
|
20
|
-
* - null NO se acepta (para borrar un campo, usar DELETE /fields/{fieldName})
|
|
21
|
-
*
|
|
22
|
-
* Si todos los campos llegan undefined → 400 INVALID_PATCH_PAYLOAD.
|
|
23
|
-
*/
|
|
24
|
-
class BackofficeLeafOverrideUpsertRequest {
|
|
25
|
-
}
|
|
26
|
-
exports.BackofficeLeafOverrideUpsertRequest = BackofficeLeafOverrideUpsertRequest;
|
|
27
|
-
__decorate([
|
|
28
|
-
(0, class_validator_1.IsOptional)(),
|
|
29
|
-
(0, class_validator_1.IsString)(),
|
|
30
|
-
(0, class_validator_1.MaxLength)(120),
|
|
31
|
-
__metadata("design:type", String)
|
|
32
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "serviceName", void 0);
|
|
33
|
-
__decorate([
|
|
34
|
-
(0, class_validator_1.IsOptional)(),
|
|
35
|
-
(0, class_validator_1.IsUrl)({ protocols: ["https"], require_protocol: true }),
|
|
36
|
-
(0, class_validator_1.MaxLength)(500),
|
|
37
|
-
__metadata("design:type", String)
|
|
38
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "logo", void 0);
|
|
39
|
-
__decorate([
|
|
40
|
-
(0, class_validator_1.IsOptional)(),
|
|
41
|
-
(0, class_validator_1.IsString)(),
|
|
42
|
-
(0, class_validator_1.MaxLength)(2000),
|
|
43
|
-
__metadata("design:type", String)
|
|
44
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "description", void 0);
|
|
45
|
-
__decorate([
|
|
46
|
-
(0, class_validator_1.IsOptional)(),
|
|
47
|
-
(0, class_validator_1.IsString)(),
|
|
48
|
-
(0, class_validator_1.MaxLength)(1000),
|
|
49
|
-
__metadata("design:type", String)
|
|
50
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "helpText", void 0);
|
|
51
|
-
__decorate([
|
|
52
|
-
(0, class_validator_1.IsOptional)(),
|
|
53
|
-
(0, class_validator_1.IsInt)(),
|
|
54
|
-
(0, class_validator_1.Min)(0),
|
|
55
|
-
__metadata("design:type", Number)
|
|
56
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "serviceOrder", void 0);
|
|
57
|
-
__decorate([
|
|
58
|
-
(0, class_validator_1.IsOptional)(),
|
|
59
|
-
(0, class_validator_1.IsInt)(),
|
|
60
|
-
(0, class_validator_1.Min)(0),
|
|
61
|
-
__metadata("design:type", Number)
|
|
62
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "subcategoryOrder", void 0);
|
|
63
|
-
__decorate([
|
|
64
|
-
(0, class_validator_1.IsOptional)(),
|
|
65
|
-
(0, class_validator_1.IsBoolean)(),
|
|
66
|
-
__metadata("design:type", Boolean)
|
|
67
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "enabled", void 0);
|
|
68
|
-
__decorate([
|
|
69
|
-
(0, class_validator_1.IsOptional)(),
|
|
70
|
-
(0, class_validator_1.IsString)(),
|
|
71
|
-
(0, class_validator_1.MaxLength)(60),
|
|
72
|
-
(0, class_validator_1.Matches)(/^[A-Z][A-Z0-9_ ]*$/, { message: "category must be uppercase with underscores or spaces" }),
|
|
73
|
-
__metadata("design:type", String)
|
|
74
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "category", void 0);
|
|
75
|
-
__decorate([
|
|
76
|
-
(0, class_validator_1.IsOptional)(),
|
|
77
|
-
(0, class_validator_1.IsString)(),
|
|
78
|
-
(0, class_validator_1.MaxLength)(60),
|
|
79
|
-
__metadata("design:type", String)
|
|
80
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "subcategory", void 0);
|
|
81
|
-
__decorate([
|
|
82
|
-
(0, class_validator_1.IsOptional)(),
|
|
83
|
-
(0, class_validator_1.IsBoolean)(),
|
|
84
|
-
__metadata("design:type", Boolean)
|
|
85
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "requiresReferenceVerification", void 0);
|
|
86
|
-
__decorate([
|
|
87
|
-
(0, class_validator_1.IsOptional)(),
|
|
88
|
-
(0, class_validator_1.ValidateNested)(),
|
|
89
|
-
(0, class_transformer_1.Type)(() => InputSchemaOverrideRequest_1.InputSchemaOverrideRequest),
|
|
90
|
-
__metadata("design:type", InputSchemaOverrideRequest_1.InputSchemaOverrideRequest)
|
|
91
|
-
], BackofficeLeafOverrideUpsertRequest.prototype, "inputSchema", void 0);
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { InputFieldTypeEnum } from "../enums/InputFieldTypeEnum";
|
|
2
|
-
import { InputValidation } from "./InputValidation";
|
|
3
|
-
import { SelectOption } from "./SelectOption";
|
|
4
|
-
/**
|
|
5
|
-
* Override parcial de un field individual del `inputSchema` por `key`.
|
|
6
|
-
* El admin no puede agregar ni quitar fields — solo editar los existentes.
|
|
7
|
-
*/
|
|
8
|
-
export declare class FieldOverrideRequest {
|
|
9
|
-
key: string;
|
|
10
|
-
type?: InputFieldTypeEnum;
|
|
11
|
-
label?: string;
|
|
12
|
-
placeholder?: string;
|
|
13
|
-
required?: boolean;
|
|
14
|
-
helpImage?: string;
|
|
15
|
-
showHelp?: boolean;
|
|
16
|
-
options?: SelectOption[];
|
|
17
|
-
dependsOn?: string;
|
|
18
|
-
validation?: InputValidation;
|
|
19
|
-
}
|