@fiado/api-invoker 5.128.0 → 5.130.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/retailCustomer/api/RetailCustomerBusinessApi.d.ts +2 -1
- package/bin/retailCustomer/api/RetailCustomerBusinessApi.js +4 -0
- package/bin/retailCustomer/api/interfaces/IRetailCustomerBusinessApi.d.ts +12 -3
- package/bin/rules-business/api/RulesApi.d.ts +8 -1
- package/bin/rules-business/api/RulesApi.js +33 -0
- package/bin/rules-business/api/interfaces/IRulesApi.d.ts +18 -1
- package/package.json +2 -2
- package/src/retailCustomer/api/RetailCustomerBusinessApi.ts +10 -0
- package/src/retailCustomer/api/interfaces/IRetailCustomerBusinessApi.ts +17 -2
- package/src/rules-business/api/RulesApi.ts +60 -0
- package/src/rules-business/api/interfaces/IRulesApi.ts +33 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { IHttpRequest } from "@fiado/http-client";
|
|
2
2
|
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
3
|
-
import { UpsertCustomerFromKycRequest, AccountResultRequest, CustomerResponse, PromotionBonusEntryResponse, UpsertPromotionBonusRequest, WelcomeAccreditationRequest, WelcomeAccreditationResponse, WelcomeAccreditationResultRequest, WelcomeBonusResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
|
|
3
|
+
import { UpsertCustomerFromKycRequest, EnsureCustomerByPhoneRequest, EnsureCustomerByPhoneResponse, AccountResultRequest, CustomerResponse, PromotionBonusEntryResponse, UpsertPromotionBonusRequest, WelcomeAccreditationRequest, WelcomeAccreditationResponse, WelcomeAccreditationResultRequest, WelcomeBonusResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
|
|
4
4
|
import { CustomersBatchRequest, CustomersBatchResponse } from "./dtos/CustomersBatch.js";
|
|
5
5
|
import { CustomersPageQuery, PrivateCustomerListItem } from "./dtos/CustomersPage.js";
|
|
6
6
|
import { PaginatedResult } from "@fiado/type-kit/bin/retailOrg/index.js";
|
|
@@ -24,6 +24,7 @@ export default class RetailCustomerBusinessApi implements IRetailCustomerBusines
|
|
|
24
24
|
private readonly baseUrl;
|
|
25
25
|
constructor(httpRequest: IHttpRequest);
|
|
26
26
|
upsertCustomerFromKyc(payload: UpsertCustomerFromKycRequest, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
|
|
27
|
+
ensureCustomerByPhone(payload: EnsureCustomerByPhoneRequest, tenantId: string): Promise<StandardResponse<EnsureCustomerByPhoneResponse>>;
|
|
27
28
|
setAccountResult(customerId: string, payload: AccountResultRequest, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
|
|
28
29
|
getCustomerByPhone(phone: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
|
|
29
30
|
getCustomer(customerId: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
|
|
@@ -35,6 +35,10 @@ let RetailCustomerBusinessApi = class RetailCustomerBusinessApi {
|
|
|
35
35
|
const url = `${this.baseUrl}/private/customers/upsert-from-kyc?tenantId=${encodeURIComponent(tenantId)}`;
|
|
36
36
|
return await this.httpRequest.post(url, payload);
|
|
37
37
|
}
|
|
38
|
+
async ensureCustomerByPhone(payload, tenantId) {
|
|
39
|
+
const url = `${this.baseUrl}/private/customers/ensure-by-phone?tenantId=${encodeURIComponent(tenantId)}`;
|
|
40
|
+
return await this.httpRequest.post(url, payload);
|
|
41
|
+
}
|
|
38
42
|
async setAccountResult(customerId, payload, tenantId) {
|
|
39
43
|
const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}/account-result?tenantId=${encodeURIComponent(tenantId)}`;
|
|
40
44
|
return await this.httpRequest.put(url, payload);
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
2
|
-
import { UpsertCustomerFromKycRequest, AccountResultRequest, CustomerResponse, PromotionBonusEntryResponse, UpsertPromotionBonusRequest, WelcomeAccreditationRequest, WelcomeAccreditationResponse, WelcomeAccreditationResultRequest, WelcomeBonusResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
|
|
2
|
+
import { UpsertCustomerFromKycRequest, EnsureCustomerByPhoneRequest, EnsureCustomerByPhoneResponse, AccountResultRequest, CustomerResponse, PromotionBonusEntryResponse, UpsertPromotionBonusRequest, WelcomeAccreditationRequest, WelcomeAccreditationResponse, WelcomeAccreditationResultRequest, WelcomeBonusResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
|
|
3
3
|
import { CustomersBatchRequest, CustomersBatchResponse } from "../dtos/CustomersBatch.js";
|
|
4
4
|
import { CustomersPageQuery, PrivateCustomerListItem } from "../dtos/CustomersPage.js";
|
|
5
5
|
import { PaginatedResult } from "@fiado/type-kit/bin/retailOrg/index.js";
|
|
6
6
|
/**
|
|
7
7
|
* Contrato del publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail)
|
|
8
|
-
* para sus
|
|
8
|
+
* para sus endpoints privados de cliente (service-to-service, VPC-only).
|
|
9
9
|
*
|
|
10
10
|
* Consumidor previsto:
|
|
11
11
|
* - `retail-wizard-business` → upsert del cliente post-KYC, aterrizaje del resultado de apertura
|
|
12
12
|
* de cuenta (D35), y lecturas del cliente por teléfono / id durante la saga de venta.
|
|
13
13
|
*
|
|
14
14
|
* ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
-
* `tenantId` es OBLIGATORIO en los
|
|
15
|
+
* `tenantId` es OBLIGATORIO en todos los métodos — no es un detalle de firma.
|
|
16
16
|
* ─────────────────────────────────────────────────────────────────────────────
|
|
17
17
|
* Los privados NO llevan token de usuario (`Feature.ANONIMUS`; la protección es la red VPC), así que
|
|
18
18
|
* el lambda destino no tiene `AuthContext.issuer` y NO puede inferir el silo. El caller declara el
|
|
@@ -54,6 +54,15 @@ export interface IRetailCustomerBusinessApi {
|
|
|
54
54
|
* aditivo al type-kit (backlog) — no acá.
|
|
55
55
|
*/
|
|
56
56
|
upsertCustomerFromKyc(payload: UpsertCustomerFromKycRequest, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
|
|
57
|
+
/**
|
|
58
|
+
* POST /private/customers/ensure-by-phone?tenantId= — devuelve el cliente de ese celular o lo da
|
|
59
|
+
* de alta solo con el celular (ya verificado por OTP). Idempotente: dos llamadas con el mismo
|
|
60
|
+
* número devuelven el mismo cliente. `created=true` solo cuando esta llamada lo dio de alta.
|
|
61
|
+
*
|
|
62
|
+
* @throws `422 CUSTOMER_INACTIVE` si el número es de un cliente dado de baja.
|
|
63
|
+
* @throws `400 VALIDATION_ERROR` si el celular no trae 10 dígitos o falta la tienda.
|
|
64
|
+
*/
|
|
65
|
+
ensureCustomerByPhone(payload: EnsureCustomerByPhoneRequest, tenantId: string): Promise<StandardResponse<EnsureCustomerByPhoneResponse>>;
|
|
57
66
|
/**
|
|
58
67
|
* PUT /private/customers/{customerId}/account-result?tenantId= — aterriza el resultado terminal de
|
|
59
68
|
* la apertura de cuenta async (D35). Solo acepta OPEN/FAILED (nunca el intermedio OPENING). OPEN
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { StandardResponse } from "@fiado/gateway-adapter";
|
|
2
2
|
import type { IHttpRequest } from "@fiado/http-client";
|
|
3
|
-
import type { EvaluateRulesRequest, EvaluateRulesResponse, GenerateRulesRequest, GenerateRulesResponse, RulesCatalogResponse, ValidateRulesRequest, ValidateRulesResponse } from "@fiado/type-kit/bin/rules/index.js";
|
|
3
|
+
import type { EvaluateRulesRequest, EvaluateRulesResponse, GenerateRulesRequest, GenerateRulesResponse, PopulationCompileRequest, PopulationCompileResponse, PopulationExecutionPageResponse, PopulationExecutionRequest, PopulationExecutionResponse, PopulationTestRequest, PopulationTestResponse, RulesCatalogResponse, SegmentSchemaResponse, SegmentTableSchemaResponse, ValidateRulesRequest, ValidateRulesResponse } from "@fiado/type-kit/bin/rules/index.js";
|
|
4
4
|
import type { IRulesApi } from "./interfaces/IRulesApi.js";
|
|
5
5
|
/**
|
|
6
6
|
* Contrato y semántica completos → `IRulesApi` (`StandardResponse` → leer `result.data`).
|
|
@@ -14,4 +14,11 @@ export declare class RulesApi implements IRulesApi {
|
|
|
14
14
|
validate(request: ValidateRulesRequest): Promise<StandardResponse<ValidateRulesResponse>>;
|
|
15
15
|
generate(request: GenerateRulesRequest): Promise<StandardResponse<GenerateRulesResponse>>;
|
|
16
16
|
evaluate(request: EvaluateRulesRequest): Promise<StandardResponse<EvaluateRulesResponse>>;
|
|
17
|
+
populationSchema(consumer?: string): Promise<StandardResponse<SegmentSchemaResponse>>;
|
|
18
|
+
populationTableSchema(table: string, consumer?: string): Promise<StandardResponse<SegmentTableSchemaResponse>>;
|
|
19
|
+
populationCompile(request: PopulationCompileRequest): Promise<StandardResponse<PopulationCompileResponse>>;
|
|
20
|
+
populationTestStart(request: PopulationTestRequest): Promise<StandardResponse<PopulationTestResponse>>;
|
|
21
|
+
populationTestGet(testId: string, consumer?: string): Promise<StandardResponse<PopulationTestResponse>>;
|
|
22
|
+
populationExecutionStart(request: PopulationExecutionRequest): Promise<StandardResponse<PopulationExecutionResponse>>;
|
|
23
|
+
populationExecutionPage(executionId: string, nextToken?: string, consumer?: string): Promise<StandardResponse<PopulationExecutionPageResponse>>;
|
|
17
24
|
}
|
|
@@ -11,6 +11,13 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { inject, injectable } from "inversify";
|
|
14
|
+
// P2: el gateway de rewards corta a 29 s; el central corta la prueba a 12 s. Solo dispara ante falla real.
|
|
15
|
+
const POPULATION_TEST_CLIENT_TIMEOUT_MS = 20000;
|
|
16
|
+
const consumerQuery = (consumer) => consumer === undefined ? "" : `consumer=${encodeURIComponent(consumer)}`;
|
|
17
|
+
const withQuery = (url, ...parts) => {
|
|
18
|
+
const query = parts.filter((part) => part !== "").join("&");
|
|
19
|
+
return query === "" ? url : `${url}?${query}`;
|
|
20
|
+
};
|
|
14
21
|
/**
|
|
15
22
|
* Contrato y semántica completos → `IRulesApi` (`StandardResponse` → leer `result.data`).
|
|
16
23
|
* Env: `RULES_BUSINESS_LAMBDA_URL` (SSM `fiado-rulesbusiness-lambda`).
|
|
@@ -36,6 +43,32 @@ let RulesApi = class RulesApi {
|
|
|
36
43
|
async evaluate(request) {
|
|
37
44
|
return await this.httpRequest.post(`${this.baseUrl}/evaluate`, request);
|
|
38
45
|
}
|
|
46
|
+
async populationSchema(consumer) {
|
|
47
|
+
const url = withQuery(`${this.baseUrl}/population/schema`, consumerQuery(consumer));
|
|
48
|
+
return await this.httpRequest.get(url);
|
|
49
|
+
}
|
|
50
|
+
async populationTableSchema(table, consumer) {
|
|
51
|
+
const url = withQuery(`${this.baseUrl}/population/schema/${encodeURIComponent(table)}`, consumerQuery(consumer));
|
|
52
|
+
return await this.httpRequest.get(url);
|
|
53
|
+
}
|
|
54
|
+
async populationCompile(request) {
|
|
55
|
+
return await this.httpRequest.post(`${this.baseUrl}/population/compile`, request);
|
|
56
|
+
}
|
|
57
|
+
async populationTestStart(request) {
|
|
58
|
+
return await this.httpRequest.post(`${this.baseUrl}/population/tests`, request, undefined, undefined, undefined, { timeout: POPULATION_TEST_CLIENT_TIMEOUT_MS });
|
|
59
|
+
}
|
|
60
|
+
async populationTestGet(testId, consumer) {
|
|
61
|
+
const url = withQuery(`${this.baseUrl}/population/tests/${encodeURIComponent(testId)}`, consumerQuery(consumer));
|
|
62
|
+
return await this.httpRequest.get(url);
|
|
63
|
+
}
|
|
64
|
+
async populationExecutionStart(request) {
|
|
65
|
+
return await this.httpRequest.post(`${this.baseUrl}/population/executions`, request);
|
|
66
|
+
}
|
|
67
|
+
async populationExecutionPage(executionId, nextToken, consumer) {
|
|
68
|
+
const tokenQuery = nextToken === undefined ? "" : `nextToken=${encodeURIComponent(nextToken)}`;
|
|
69
|
+
const url = withQuery(`${this.baseUrl}/population/executions/${encodeURIComponent(executionId)}`, tokenQuery, consumerQuery(consumer));
|
|
70
|
+
return await this.httpRequest.get(url);
|
|
71
|
+
}
|
|
39
72
|
};
|
|
40
73
|
RulesApi = __decorate([
|
|
41
74
|
injectable(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { StandardResponse } from "@fiado/gateway-adapter";
|
|
2
|
-
import type { EvaluateRulesRequest, EvaluateRulesResponse, GenerateRulesRequest, GenerateRulesResponse, RulesCatalogResponse, ValidateRulesRequest, ValidateRulesResponse } from "@fiado/type-kit/bin/rules/index.js";
|
|
2
|
+
import type { EvaluateRulesRequest, EvaluateRulesResponse, GenerateRulesRequest, GenerateRulesResponse, PopulationCompileRequest, PopulationCompileResponse, PopulationExecutionPageResponse, PopulationExecutionRequest, PopulationExecutionResponse, PopulationTestRequest, PopulationTestResponse, RulesCatalogResponse, SegmentSchemaResponse, SegmentTableSchemaResponse, ValidateRulesRequest, ValidateRulesResponse } from "@fiado/type-kit/bin/rules/index.js";
|
|
3
3
|
/**
|
|
4
4
|
* Cliente del lambda central `rules-business` (catálogo, validación, generación con IA y evaluación de reglas).
|
|
5
5
|
*
|
|
@@ -15,4 +15,21 @@ export interface IRulesApi {
|
|
|
15
15
|
generate(request: GenerateRulesRequest): Promise<StandardResponse<GenerateRulesResponse>>;
|
|
16
16
|
/** POST /evaluate — evalúa reglas sobre hasta 100 sujetos por llamada (400 `TOO_MANY_SUBJECTS`). */
|
|
17
17
|
evaluate(request: EvaluateRulesRequest): Promise<StandardResponse<EvaluateRulesResponse>>;
|
|
18
|
+
/** GET /population/schema — tablas del datalake disponibles para segmentar población. */
|
|
19
|
+
populationSchema(consumer?: string): Promise<StandardResponse<SegmentSchemaResponse>>;
|
|
20
|
+
/** GET /population/schema/{table} — columnas de una tabla del datalake. */
|
|
21
|
+
populationTableSchema(table: string, consumer?: string): Promise<StandardResponse<SegmentTableSchemaResponse>>;
|
|
22
|
+
/** POST /population/compile — compila una `definition` a SQL parametrizado (no ejecuta nada). */
|
|
23
|
+
populationCompile(request: PopulationCompileRequest): Promise<StandardResponse<PopulationCompileResponse>>;
|
|
24
|
+
/**
|
|
25
|
+
* POST /population/tests — prueba sin estado. El central corta a 12 s y responde RUNNING + `testId`;
|
|
26
|
+
* el cliente usa un timeout explícito de 20000 ms (solo dispara ante falla real → 503).
|
|
27
|
+
*/
|
|
28
|
+
populationTestStart(request: PopulationTestRequest): Promise<StandardResponse<PopulationTestResponse>>;
|
|
29
|
+
/** GET /population/tests/{testId} — sondeo de una prueba iniciada. */
|
|
30
|
+
populationTestGet(testId: string, consumer?: string): Promise<StandardResponse<PopulationTestResponse>>;
|
|
31
|
+
/** POST /population/executions — inicia la ejecución de una población. */
|
|
32
|
+
populationExecutionStart(request: PopulationExecutionRequest): Promise<StandardResponse<PopulationExecutionResponse>>;
|
|
33
|
+
/** GET /population/executions/{id} — página (≤1000 ids) de una ejecución; `nextToken` para continuar. */
|
|
34
|
+
populationExecutionPage(executionId: string, nextToken?: string, consumer?: string): Promise<StandardResponse<PopulationExecutionPageResponse>>;
|
|
18
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fiado/api-invoker",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.130.0",
|
|
4
4
|
"description": "Sirve como un puente entre diferentes funciones lambda, facilitando la comunicación entre ellas a través de invocaciones http",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@fiado/gateway-adapter": "^3.14.0",
|
|
35
35
|
"@fiado/http-client": "^2.0.1",
|
|
36
36
|
"@fiado/logger": "^1.1.3",
|
|
37
|
-
"@fiado/type-kit": "^3.
|
|
37
|
+
"@fiado/type-kit": "^3.541.0",
|
|
38
38
|
"dotenv": "^16.4.7"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
@@ -3,6 +3,8 @@ import type { IHttpRequest } from "@fiado/http-client";
|
|
|
3
3
|
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
4
4
|
import {
|
|
5
5
|
UpsertCustomerFromKycRequest,
|
|
6
|
+
EnsureCustomerByPhoneRequest,
|
|
7
|
+
EnsureCustomerByPhoneResponse,
|
|
6
8
|
AccountResultRequest,
|
|
7
9
|
CustomerResponse,
|
|
8
10
|
PromotionBonusEntryResponse,
|
|
@@ -45,6 +47,14 @@ export default class RetailCustomerBusinessApi implements IRetailCustomerBusines
|
|
|
45
47
|
return await this.httpRequest.post(url, payload);
|
|
46
48
|
}
|
|
47
49
|
|
|
50
|
+
async ensureCustomerByPhone(
|
|
51
|
+
payload: EnsureCustomerByPhoneRequest,
|
|
52
|
+
tenantId: string,
|
|
53
|
+
): Promise<StandardResponse<EnsureCustomerByPhoneResponse>> {
|
|
54
|
+
const url = `${this.baseUrl}/private/customers/ensure-by-phone?tenantId=${encodeURIComponent(tenantId)}`;
|
|
55
|
+
return await this.httpRequest.post(url, payload);
|
|
56
|
+
}
|
|
57
|
+
|
|
48
58
|
async setAccountResult(
|
|
49
59
|
customerId: string,
|
|
50
60
|
payload: AccountResultRequest,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
2
2
|
import {
|
|
3
3
|
UpsertCustomerFromKycRequest,
|
|
4
|
+
EnsureCustomerByPhoneRequest,
|
|
5
|
+
EnsureCustomerByPhoneResponse,
|
|
4
6
|
AccountResultRequest,
|
|
5
7
|
CustomerResponse,
|
|
6
8
|
PromotionBonusEntryResponse,
|
|
@@ -16,14 +18,14 @@ import { PaginatedResult } from "@fiado/type-kit/bin/retailOrg/index.js";
|
|
|
16
18
|
|
|
17
19
|
/**
|
|
18
20
|
* Contrato del publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail)
|
|
19
|
-
* para sus
|
|
21
|
+
* para sus endpoints privados de cliente (service-to-service, VPC-only).
|
|
20
22
|
*
|
|
21
23
|
* Consumidor previsto:
|
|
22
24
|
* - `retail-wizard-business` → upsert del cliente post-KYC, aterrizaje del resultado de apertura
|
|
23
25
|
* de cuenta (D35), y lecturas del cliente por teléfono / id durante la saga de venta.
|
|
24
26
|
*
|
|
25
27
|
* ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
-
* `tenantId` es OBLIGATORIO en los
|
|
28
|
+
* `tenantId` es OBLIGATORIO en todos los métodos — no es un detalle de firma.
|
|
27
29
|
* ─────────────────────────────────────────────────────────────────────────────
|
|
28
30
|
* Los privados NO llevan token de usuario (`Feature.ANONIMUS`; la protección es la red VPC), así que
|
|
29
31
|
* el lambda destino no tiene `AuthContext.issuer` y NO puede inferir el silo. El caller declara el
|
|
@@ -69,6 +71,19 @@ export interface IRetailCustomerBusinessApi {
|
|
|
69
71
|
tenantId: string,
|
|
70
72
|
): Promise<StandardResponse<CustomerResponse>>;
|
|
71
73
|
|
|
74
|
+
/**
|
|
75
|
+
* POST /private/customers/ensure-by-phone?tenantId= — devuelve el cliente de ese celular o lo da
|
|
76
|
+
* de alta solo con el celular (ya verificado por OTP). Idempotente: dos llamadas con el mismo
|
|
77
|
+
* número devuelven el mismo cliente. `created=true` solo cuando esta llamada lo dio de alta.
|
|
78
|
+
*
|
|
79
|
+
* @throws `422 CUSTOMER_INACTIVE` si el número es de un cliente dado de baja.
|
|
80
|
+
* @throws `400 VALIDATION_ERROR` si el celular no trae 10 dígitos o falta la tienda.
|
|
81
|
+
*/
|
|
82
|
+
ensureCustomerByPhone(
|
|
83
|
+
payload: EnsureCustomerByPhoneRequest,
|
|
84
|
+
tenantId: string,
|
|
85
|
+
): Promise<StandardResponse<EnsureCustomerByPhoneResponse>>;
|
|
86
|
+
|
|
72
87
|
/**
|
|
73
88
|
* PUT /private/customers/{customerId}/account-result?tenantId= — aterriza el resultado terminal de
|
|
74
89
|
* la apertura de cuenta async (D35). Solo acepta OPEN/FAILED (nunca el intermedio OPENING). OPEN
|
|
@@ -6,12 +6,32 @@ import type {
|
|
|
6
6
|
EvaluateRulesResponse,
|
|
7
7
|
GenerateRulesRequest,
|
|
8
8
|
GenerateRulesResponse,
|
|
9
|
+
PopulationCompileRequest,
|
|
10
|
+
PopulationCompileResponse,
|
|
11
|
+
PopulationExecutionPageResponse,
|
|
12
|
+
PopulationExecutionRequest,
|
|
13
|
+
PopulationExecutionResponse,
|
|
14
|
+
PopulationTestRequest,
|
|
15
|
+
PopulationTestResponse,
|
|
9
16
|
RulesCatalogResponse,
|
|
17
|
+
SegmentSchemaResponse,
|
|
18
|
+
SegmentTableSchemaResponse,
|
|
10
19
|
ValidateRulesRequest,
|
|
11
20
|
ValidateRulesResponse,
|
|
12
21
|
} from "@fiado/type-kit/bin/rules/index.js";
|
|
13
22
|
import type { IRulesApi } from "./interfaces/IRulesApi.js";
|
|
14
23
|
|
|
24
|
+
// P2: el gateway de rewards corta a 29 s; el central corta la prueba a 12 s. Solo dispara ante falla real.
|
|
25
|
+
const POPULATION_TEST_CLIENT_TIMEOUT_MS = 20000;
|
|
26
|
+
|
|
27
|
+
const consumerQuery = (consumer?: string): string =>
|
|
28
|
+
consumer === undefined ? "" : `consumer=${encodeURIComponent(consumer)}`;
|
|
29
|
+
|
|
30
|
+
const withQuery = (url: string, ...parts: string[]): string => {
|
|
31
|
+
const query = parts.filter((part) => part !== "").join("&");
|
|
32
|
+
return query === "" ? url : `${url}?${query}`;
|
|
33
|
+
};
|
|
34
|
+
|
|
15
35
|
/**
|
|
16
36
|
* Contrato y semántica completos → `IRulesApi` (`StandardResponse` → leer `result.data`).
|
|
17
37
|
* Env: `RULES_BUSINESS_LAMBDA_URL` (SSM `fiado-rulesbusiness-lambda`).
|
|
@@ -41,4 +61,44 @@ export class RulesApi implements IRulesApi {
|
|
|
41
61
|
async evaluate(request: EvaluateRulesRequest): Promise<StandardResponse<EvaluateRulesResponse>> {
|
|
42
62
|
return await this.httpRequest.post<StandardResponse<EvaluateRulesResponse>>(`${this.baseUrl}/evaluate`, request);
|
|
43
63
|
}
|
|
64
|
+
|
|
65
|
+
async populationSchema(consumer?: string): Promise<StandardResponse<SegmentSchemaResponse>> {
|
|
66
|
+
const url = withQuery(`${this.baseUrl}/population/schema`, consumerQuery(consumer));
|
|
67
|
+
return await this.httpRequest.get<StandardResponse<SegmentSchemaResponse>>(url);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async populationTableSchema(table: string, consumer?: string): Promise<StandardResponse<SegmentTableSchemaResponse>> {
|
|
71
|
+
const url = withQuery(`${this.baseUrl}/population/schema/${encodeURIComponent(table)}`, consumerQuery(consumer));
|
|
72
|
+
return await this.httpRequest.get<StandardResponse<SegmentTableSchemaResponse>>(url);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async populationCompile(request: PopulationCompileRequest): Promise<StandardResponse<PopulationCompileResponse>> {
|
|
76
|
+
return await this.httpRequest.post<StandardResponse<PopulationCompileResponse>>(`${this.baseUrl}/population/compile`, request);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async populationTestStart(request: PopulationTestRequest): Promise<StandardResponse<PopulationTestResponse>> {
|
|
80
|
+
return await this.httpRequest.post<StandardResponse<PopulationTestResponse>>(
|
|
81
|
+
`${this.baseUrl}/population/tests`,
|
|
82
|
+
request,
|
|
83
|
+
undefined,
|
|
84
|
+
undefined,
|
|
85
|
+
undefined,
|
|
86
|
+
{ timeout: POPULATION_TEST_CLIENT_TIMEOUT_MS },
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async populationTestGet(testId: string, consumer?: string): Promise<StandardResponse<PopulationTestResponse>> {
|
|
91
|
+
const url = withQuery(`${this.baseUrl}/population/tests/${encodeURIComponent(testId)}`, consumerQuery(consumer));
|
|
92
|
+
return await this.httpRequest.get<StandardResponse<PopulationTestResponse>>(url);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async populationExecutionStart(request: PopulationExecutionRequest): Promise<StandardResponse<PopulationExecutionResponse>> {
|
|
96
|
+
return await this.httpRequest.post<StandardResponse<PopulationExecutionResponse>>(`${this.baseUrl}/population/executions`, request);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async populationExecutionPage(executionId: string, nextToken?: string, consumer?: string): Promise<StandardResponse<PopulationExecutionPageResponse>> {
|
|
100
|
+
const tokenQuery = nextToken === undefined ? "" : `nextToken=${encodeURIComponent(nextToken)}`;
|
|
101
|
+
const url = withQuery(`${this.baseUrl}/population/executions/${encodeURIComponent(executionId)}`, tokenQuery, consumerQuery(consumer));
|
|
102
|
+
return await this.httpRequest.get<StandardResponse<PopulationExecutionPageResponse>>(url);
|
|
103
|
+
}
|
|
44
104
|
}
|
|
@@ -4,7 +4,16 @@ import type {
|
|
|
4
4
|
EvaluateRulesResponse,
|
|
5
5
|
GenerateRulesRequest,
|
|
6
6
|
GenerateRulesResponse,
|
|
7
|
+
PopulationCompileRequest,
|
|
8
|
+
PopulationCompileResponse,
|
|
9
|
+
PopulationExecutionPageResponse,
|
|
10
|
+
PopulationExecutionRequest,
|
|
11
|
+
PopulationExecutionResponse,
|
|
12
|
+
PopulationTestRequest,
|
|
13
|
+
PopulationTestResponse,
|
|
7
14
|
RulesCatalogResponse,
|
|
15
|
+
SegmentSchemaResponse,
|
|
16
|
+
SegmentTableSchemaResponse,
|
|
8
17
|
ValidateRulesRequest,
|
|
9
18
|
ValidateRulesResponse,
|
|
10
19
|
} from "@fiado/type-kit/bin/rules/index.js";
|
|
@@ -27,4 +36,28 @@ export interface IRulesApi {
|
|
|
27
36
|
|
|
28
37
|
/** POST /evaluate — evalúa reglas sobre hasta 100 sujetos por llamada (400 `TOO_MANY_SUBJECTS`). */
|
|
29
38
|
evaluate(request: EvaluateRulesRequest): Promise<StandardResponse<EvaluateRulesResponse>>;
|
|
39
|
+
|
|
40
|
+
/** GET /population/schema — tablas del datalake disponibles para segmentar población. */
|
|
41
|
+
populationSchema(consumer?: string): Promise<StandardResponse<SegmentSchemaResponse>>;
|
|
42
|
+
|
|
43
|
+
/** GET /population/schema/{table} — columnas de una tabla del datalake. */
|
|
44
|
+
populationTableSchema(table: string, consumer?: string): Promise<StandardResponse<SegmentTableSchemaResponse>>;
|
|
45
|
+
|
|
46
|
+
/** POST /population/compile — compila una `definition` a SQL parametrizado (no ejecuta nada). */
|
|
47
|
+
populationCompile(request: PopulationCompileRequest): Promise<StandardResponse<PopulationCompileResponse>>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* POST /population/tests — prueba sin estado. El central corta a 12 s y responde RUNNING + `testId`;
|
|
51
|
+
* el cliente usa un timeout explícito de 20000 ms (solo dispara ante falla real → 503).
|
|
52
|
+
*/
|
|
53
|
+
populationTestStart(request: PopulationTestRequest): Promise<StandardResponse<PopulationTestResponse>>;
|
|
54
|
+
|
|
55
|
+
/** GET /population/tests/{testId} — sondeo de una prueba iniciada. */
|
|
56
|
+
populationTestGet(testId: string, consumer?: string): Promise<StandardResponse<PopulationTestResponse>>;
|
|
57
|
+
|
|
58
|
+
/** POST /population/executions — inicia la ejecución de una población. */
|
|
59
|
+
populationExecutionStart(request: PopulationExecutionRequest): Promise<StandardResponse<PopulationExecutionResponse>>;
|
|
60
|
+
|
|
61
|
+
/** GET /population/executions/{id} — página (≤1000 ids) de una ejecución; `nextToken` para continuar. */
|
|
62
|
+
populationExecutionPage(executionId: string, nextToken?: string, consumer?: string): Promise<StandardResponse<PopulationExecutionPageResponse>>;
|
|
30
63
|
}
|