@fiado/api-invoker 5.46.0 → 5.47.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.
@@ -1,9 +1,10 @@
1
1
  import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { StandardResponse } from "@fiado/gateway-adapter";
3
3
  import { UpsertCustomerFromKycRequest, AccountResultRequest, CustomerResponse, WelcomeAccreditationRequest, WelcomeAccreditationResponse, WelcomeAccreditationResultRequest, WelcomeBonusResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
4
+ import { CustomersBatchRequest, CustomersBatchResponse } from "./dtos/CustomersBatch.js";
4
5
  import { IRetailCustomerBusinessApi } from "./interfaces/IRetailCustomerBusinessApi.js";
5
6
  /**
6
- * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 6
7
+ * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 7
7
8
  * endpoints privados de cliente. Contrato y semántica completos → `IRetailCustomerBusinessApi`.
8
9
  *
9
10
  * Los paths y el `?tenantId=` matchean `openapi/private.yaml` del lambda destino (mismo patrón que
@@ -26,4 +27,5 @@ export default class RetailCustomerBusinessApi implements IRetailCustomerBusines
26
27
  getCustomer(customerId: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
27
28
  markWelcomeAccredited(customerId: string, tenantId: string, payload?: WelcomeAccreditationRequest): Promise<StandardResponse<WelcomeAccreditationResponse>>;
28
29
  setWelcomeAccreditationResult(customerId: string, payload: WelcomeAccreditationResultRequest, tenantId: string): Promise<StandardResponse<WelcomeBonusResponse>>;
30
+ getCustomersBatch(payload: CustomersBatchRequest, tenantId: string): Promise<StandardResponse<CustomersBatchResponse>>;
29
31
  }
@@ -12,7 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from "inversify";
14
14
  /**
15
- * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 6
15
+ * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 7
16
16
  * endpoints privados de cliente. Contrato y semántica completos → `IRetailCustomerBusinessApi`.
17
17
  *
18
18
  * Los paths y el `?tenantId=` matchean `openapi/private.yaml` del lambda destino (mismo patrón que
@@ -56,6 +56,10 @@ let RetailCustomerBusinessApi = class RetailCustomerBusinessApi {
56
56
  const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}/welcome-accreditation/result?tenantId=${encodeURIComponent(tenantId)}`;
57
57
  return await this.httpRequest.put(url, payload);
58
58
  }
59
+ async getCustomersBatch(payload, tenantId) {
60
+ const url = `${this.baseUrl}/private/customers/batch?tenantId=${encodeURIComponent(tenantId)}`;
61
+ return await this.httpRequest.post(url, payload);
62
+ }
59
63
  };
60
64
  RetailCustomerBusinessApi = __decorate([
61
65
  injectable(),
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Tipos del lote de nombres de cliente. Viven en esta lib (y no en `@fiado/type-kit`) porque el
3
+ * type-kit todavía no modela esta vista reducida — el lambda destino la tiene como DTO local (TD-029).
4
+ */
5
+ /** Body de `POST /private/customers/batch`. Hasta 100 ids por request; el caller pagina. */
6
+ export interface CustomersBatchRequest {
7
+ retailCustomerIds: string[];
8
+ }
9
+ /**
10
+ * Lo mínimo para pintar un nombre. `fullName: null` significa que el cliente existe pero no tiene
11
+ * nombre resuelto — es distinto de que el id no vuelva.
12
+ */
13
+ export interface CustomerBatchItem {
14
+ retailCustomerId: string;
15
+ fullName: string | null;
16
+ }
17
+ /**
18
+ * Los ids que no existen simplemente NO vuelven: `items` puede ser más corto que lo que mandaste.
19
+ * El caller indexa por `retailCustomerId`, nunca aparea por posición.
20
+ */
21
+ export interface CustomersBatchResponse {
22
+ items: CustomerBatchItem[];
23
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tipos del lote de nombres de cliente. Viven en esta lib (y no en `@fiado/type-kit`) porque el
3
+ * type-kit todavía no modela esta vista reducida — el lambda destino la tiene como DTO local (TD-029).
4
+ */
5
+ export {};
@@ -1,15 +1,16 @@
1
1
  import { StandardResponse } from "@fiado/gateway-adapter";
2
2
  import { UpsertCustomerFromKycRequest, AccountResultRequest, CustomerResponse, WelcomeAccreditationRequest, WelcomeAccreditationResponse, WelcomeAccreditationResultRequest, WelcomeBonusResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
3
+ import { CustomersBatchRequest, CustomersBatchResponse } from "../dtos/CustomersBatch.js";
3
4
  /**
4
5
  * Contrato del publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail)
5
- * para sus 6 endpoints privados de cliente (service-to-service, VPC-only).
6
+ * para sus 7 endpoints privados de cliente (service-to-service, VPC-only).
6
7
  *
7
8
  * Consumidor previsto:
8
9
  * - `retail-wizard-business` → upsert del cliente post-KYC, aterrizaje del resultado de apertura
9
10
  * de cuenta (D35), y lecturas del cliente por teléfono / id durante la saga de venta.
10
11
  *
11
12
  * ─────────────────────────────────────────────────────────────────────────────
12
- * `tenantId` es OBLIGATORIO en los 6 métodos — no es un detalle de firma.
13
+ * `tenantId` es OBLIGATORIO en los 7 métodos — no es un detalle de firma.
13
14
  * ─────────────────────────────────────────────────────────────────────────────
14
15
  * Los privados NO llevan token de usuario (`Feature.ANONIMUS`; la protección es la red VPC), así que
15
16
  * el lambda destino no tiene `AuthContext.issuer` y NO puede inferir el silo. El caller declara el
@@ -114,4 +115,23 @@ export interface IRetailCustomerBusinessApi {
114
115
  * @throws `400 WELCOME_BONUS_KEY_INVALID` si el `bonusKey` no decodifica (bug del caller).
115
116
  */
116
117
  setWelcomeAccreditationResult(customerId: string, payload: WelcomeAccreditationResultRequest, tenantId: string): Promise<StandardResponse<WelcomeBonusResponse>>;
118
+ /**
119
+ * POST /private/customers/batch?tenantId= — resuelve NOMBRES de cliente EN LOTE por sus ids.
120
+ * Pensado para pintar una lista sin caer en N+1 contra el privado de un cliente por vez.
121
+ *
122
+ * ⚠️ Un id que NO existe simplemente no aparece en `items`: el arreglo puede volver más corto que
123
+ * lo que mandaste. Indexa el resultado por `retailCustomerId` — NUNCA aparees por posición.
124
+ * `fullName: null` es otra cosa: el cliente existe y no tiene nombre resuelto.
125
+ *
126
+ * El resultado puede ser PARCIAL si DynamoDB deja claves sin procesar tras sus reintentos: faltan
127
+ * renglones, no explota. Trata la ausencia como «sin nombre», no como error.
128
+ *
129
+ * Tope de 100 ids por request, medido sobre lo que manda el caller (el destino deduplica adentro,
130
+ * pero eso no baja tu cuenta). Lista vacía → `200` con `items: []`, no es error.
131
+ *
132
+ * @throws `400 CUSTOMER_BATCH_TOO_LARGE` si el lote pasa de 100 ids. Reintentar igual vuelve a
133
+ * fallar: hay que paginar.
134
+ * @throws `400 UNKNOWN_TENANT` si el `tenantId` viene ausente o desconocido.
135
+ */
136
+ getCustomersBatch(payload: CustomersBatchRequest, tenantId: string): Promise<StandardResponse<CustomersBatchResponse>>;
117
137
  }
@@ -1,2 +1,3 @@
1
+ export * from "./api/dtos/CustomersBatch.js";
1
2
  export * from "./api/interfaces/IRetailCustomerBusinessApi.js";
2
3
  export { default as RetailCustomerBusinessApi } from "./api/RetailCustomerBusinessApi.js";
@@ -1,2 +1,3 @@
1
+ export * from "./api/dtos/CustomersBatch.js";
1
2
  export * from "./api/interfaces/IRetailCustomerBusinessApi.js";
2
3
  export { default as RetailCustomerBusinessApi } from "./api/RetailCustomerBusinessApi.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "5.46.0",
3
+ "version": "5.47.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",
@@ -10,10 +10,11 @@ import {
10
10
  WelcomeAccreditationResultRequest,
11
11
  WelcomeBonusResponse,
12
12
  } from "@fiado/type-kit/bin/retailCustomer/index.js";
13
+ import { CustomersBatchRequest, CustomersBatchResponse } from "./dtos/CustomersBatch.js";
13
14
  import { IRetailCustomerBusinessApi } from "./interfaces/IRetailCustomerBusinessApi.js";
14
15
 
15
16
  /**
16
- * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 6
17
+ * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 7
17
18
  * endpoints privados de cliente. Contrato y semántica completos → `IRetailCustomerBusinessApi`.
18
19
  *
19
20
  * Los paths y el `?tenantId=` matchean `openapi/private.yaml` del lambda destino (mismo patrón que
@@ -83,4 +84,12 @@ export default class RetailCustomerBusinessApi implements IRetailCustomerBusines
83
84
  const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}/welcome-accreditation/result?tenantId=${encodeURIComponent(tenantId)}`;
84
85
  return await this.httpRequest.put(url, payload);
85
86
  }
87
+
88
+ async getCustomersBatch(
89
+ payload: CustomersBatchRequest,
90
+ tenantId: string,
91
+ ): Promise<StandardResponse<CustomersBatchResponse>> {
92
+ const url = `${this.baseUrl}/private/customers/batch?tenantId=${encodeURIComponent(tenantId)}`;
93
+ return await this.httpRequest.post(url, payload);
94
+ }
86
95
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Tipos del lote de nombres de cliente. Viven en esta lib (y no en `@fiado/type-kit`) porque el
3
+ * type-kit todavía no modela esta vista reducida — el lambda destino la tiene como DTO local (TD-029).
4
+ */
5
+
6
+ /** Body de `POST /private/customers/batch`. Hasta 100 ids por request; el caller pagina. */
7
+ export interface CustomersBatchRequest {
8
+ retailCustomerIds: string[];
9
+ }
10
+
11
+ /**
12
+ * Lo mínimo para pintar un nombre. `fullName: null` significa que el cliente existe pero no tiene
13
+ * nombre resuelto — es distinto de que el id no vuelva.
14
+ */
15
+ export interface CustomerBatchItem {
16
+ retailCustomerId: string;
17
+ fullName: string | null;
18
+ }
19
+
20
+ /**
21
+ * Los ids que no existen simplemente NO vuelven: `items` puede ser más corto que lo que mandaste.
22
+ * El caller indexa por `retailCustomerId`, nunca aparea por posición.
23
+ */
24
+ export interface CustomersBatchResponse {
25
+ items: CustomerBatchItem[];
26
+ }
@@ -8,17 +8,18 @@ import {
8
8
  WelcomeAccreditationResultRequest,
9
9
  WelcomeBonusResponse,
10
10
  } from "@fiado/type-kit/bin/retailCustomer/index.js";
11
+ import { CustomersBatchRequest, CustomersBatchResponse } from "../dtos/CustomersBatch.js";
11
12
 
12
13
  /**
13
14
  * Contrato del publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail)
14
- * para sus 6 endpoints privados de cliente (service-to-service, VPC-only).
15
+ * para sus 7 endpoints privados de cliente (service-to-service, VPC-only).
15
16
  *
16
17
  * Consumidor previsto:
17
18
  * - `retail-wizard-business` → upsert del cliente post-KYC, aterrizaje del resultado de apertura
18
19
  * de cuenta (D35), y lecturas del cliente por teléfono / id durante la saga de venta.
19
20
  *
20
21
  * ─────────────────────────────────────────────────────────────────────────────
21
- * `tenantId` es OBLIGATORIO en los 6 métodos — no es un detalle de firma.
22
+ * `tenantId` es OBLIGATORIO en los 7 métodos — no es un detalle de firma.
22
23
  * ─────────────────────────────────────────────────────────────────────────────
23
24
  * Los privados NO llevan token de usuario (`Feature.ANONIMUS`; la protección es la red VPC), así que
24
25
  * el lambda destino no tiene `AuthContext.issuer` y NO puede inferir el silo. El caller declara el
@@ -149,4 +150,27 @@ export interface IRetailCustomerBusinessApi {
149
150
  payload: WelcomeAccreditationResultRequest,
150
151
  tenantId: string,
151
152
  ): Promise<StandardResponse<WelcomeBonusResponse>>;
153
+
154
+ /**
155
+ * POST /private/customers/batch?tenantId= — resuelve NOMBRES de cliente EN LOTE por sus ids.
156
+ * Pensado para pintar una lista sin caer en N+1 contra el privado de un cliente por vez.
157
+ *
158
+ * ⚠️ Un id que NO existe simplemente no aparece en `items`: el arreglo puede volver más corto que
159
+ * lo que mandaste. Indexa el resultado por `retailCustomerId` — NUNCA aparees por posición.
160
+ * `fullName: null` es otra cosa: el cliente existe y no tiene nombre resuelto.
161
+ *
162
+ * El resultado puede ser PARCIAL si DynamoDB deja claves sin procesar tras sus reintentos: faltan
163
+ * renglones, no explota. Trata la ausencia como «sin nombre», no como error.
164
+ *
165
+ * Tope de 100 ids por request, medido sobre lo que manda el caller (el destino deduplica adentro,
166
+ * pero eso no baja tu cuenta). Lista vacía → `200` con `items: []`, no es error.
167
+ *
168
+ * @throws `400 CUSTOMER_BATCH_TOO_LARGE` si el lote pasa de 100 ids. Reintentar igual vuelve a
169
+ * fallar: hay que paginar.
170
+ * @throws `400 UNKNOWN_TENANT` si el `tenantId` viene ausente o desconocido.
171
+ */
172
+ getCustomersBatch(
173
+ payload: CustomersBatchRequest,
174
+ tenantId: string,
175
+ ): Promise<StandardResponse<CustomersBatchResponse>>;
152
176
  }
@@ -1,2 +1,3 @@
1
+ export * from "./api/dtos/CustomersBatch.js";
1
2
  export * from "./api/interfaces/IRetailCustomerBusinessApi.js";
2
3
  export { default as RetailCustomerBusinessApi } from "./api/RetailCustomerBusinessApi.js";