@fiado/api-invoker 4.77.0 → 4.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.
@@ -3,7 +3,7 @@ import { StandardResponse } from "@fiado/gateway-adapter";
3
3
  import { UpsertCustomerFromKycRequest, AccountResultRequest, CustomerResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
4
4
  import { IRetailCustomerBusinessApi } from "./interfaces/IRetailCustomerBusinessApi.js";
5
5
  /**
6
- * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 4
6
+ * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 5
7
7
  * endpoints privados de cliente. Contrato y semántica completos → `IRetailCustomerBusinessApi`.
8
8
  *
9
9
  * Los paths y el `?tenantId=` matchean `openapi/private.yaml` del lambda destino (mismo patrón que
@@ -24,4 +24,5 @@ export default class RetailCustomerBusinessApi implements IRetailCustomerBusines
24
24
  setAccountResult(customerId: string, payload: AccountResultRequest, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
25
25
  getCustomerByPhone(phone: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
26
26
  getCustomer(customerId: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
27
+ markWelcomeAccredited(customerId: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
27
28
  }
@@ -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 4
15
+ * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 5
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
@@ -47,6 +47,11 @@ let RetailCustomerBusinessApi = class RetailCustomerBusinessApi {
47
47
  const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}?tenantId=${encodeURIComponent(tenantId)}`;
48
48
  return await this.httpRequest.get(url);
49
49
  }
50
+ async markWelcomeAccredited(customerId, tenantId) {
51
+ const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}/welcome-accreditation?tenantId=${encodeURIComponent(tenantId)}`;
52
+ // Sin body: el cliente va en el path y el actor lo pone el destino desde el contexto privado.
53
+ return await this.httpRequest.post(url, {});
54
+ }
50
55
  };
51
56
  RetailCustomerBusinessApi = __decorate([
52
57
  injectable(),
@@ -2,14 +2,14 @@ import { StandardResponse } from "@fiado/gateway-adapter";
2
2
  import { UpsertCustomerFromKycRequest, AccountResultRequest, CustomerResponse } from "@fiado/type-kit/bin/retailCustomer/index.js";
3
3
  /**
4
4
  * Contrato del publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail)
5
- * para sus 4 endpoints privados de cliente (service-to-service, VPC-only).
5
+ * para sus 5 endpoints privados de cliente (service-to-service, VPC-only).
6
6
  *
7
7
  * Consumidor previsto:
8
8
  * - `retail-wizard-business` → upsert del cliente post-KYC, aterrizaje del resultado de apertura
9
9
  * de cuenta (D35), y lecturas del cliente por teléfono / id durante la saga de venta.
10
10
  *
11
11
  * ─────────────────────────────────────────────────────────────────────────────
12
- * `tenantId` es OBLIGATORIO en los 4 métodos — no es un detalle de firma.
12
+ * `tenantId` es OBLIGATORIO en los 5 métodos — no es un detalle de firma.
13
13
  * ─────────────────────────────────────────────────────────────────────────────
14
14
  * Los privados NO llevan token de usuario (`Feature.ANONIMUS`; la protección es la red VPC), así que
15
15
  * el lambda destino no tiene `AuthContext.issuer` y NO puede inferir el silo. El caller declara el
@@ -73,4 +73,21 @@ export interface IRetailCustomerBusinessApi {
73
73
  * @throws si el cliente no existe (`404 CUSTOMER_NOT_FOUND`).
74
74
  */
75
75
  getCustomer(customerId: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
76
+ /**
77
+ * POST /private/customers/{customerId}/welcome-accreditation?tenantId= — RESERVA la acreditación
78
+ * del bono de bienvenida (D33). Sin body: el cliente va en el path, el actor lo pone el destino.
79
+ *
80
+ * ⚠️ Reserva, NO acredita. El lambda destino es dueño del flag `welcomeAccredited` y su transición
81
+ * `false → true` es el candado de idempotencia PERMANENTE por cliente (una sola vez para siempre,
82
+ * ni una segunda venta la repite). La condición vive en la transacción DDB, así que dos requests
83
+ * concurrentes NO pueden ganar los dos.
84
+ *
85
+ * Orden obligatorio en el caller: reservar acá PRIMERO, mover plata en el processor DESPUÉS. Al
86
+ * revés, un doble click acredita dos veces plata real.
87
+ *
88
+ * @throws `409 WELCOME_ALREADY_ACCREDITED` si el bono ya se entregó. Para el caller NO es falla:
89
+ * es la señal de "no acredites" — la venta sigue su curso normal.
90
+ * @throws `404 CUSTOMER_NOT_FOUND` si el cliente no existe.
91
+ */
92
+ markWelcomeAccredited(customerId: string, tenantId: string): Promise<StandardResponse<CustomerResponse>>;
76
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "4.77.0",
3
+ "version": "4.78.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",
@@ -9,7 +9,7 @@ import {
9
9
  import { IRetailCustomerBusinessApi } from "./interfaces/IRetailCustomerBusinessApi.js";
10
10
 
11
11
  /**
12
- * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 4
12
+ * Publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail) para sus 5
13
13
  * endpoints privados de cliente. Contrato y semántica completos → `IRetailCustomerBusinessApi`.
14
14
  *
15
15
  * Los paths y el `?tenantId=` matchean `openapi/private.yaml` del lambda destino (mismo patrón que
@@ -60,4 +60,13 @@ export default class RetailCustomerBusinessApi implements IRetailCustomerBusines
60
60
  const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}?tenantId=${encodeURIComponent(tenantId)}`;
61
61
  return await this.httpRequest.get(url);
62
62
  }
63
+
64
+ async markWelcomeAccredited(
65
+ customerId: string,
66
+ tenantId: string,
67
+ ): Promise<StandardResponse<CustomerResponse>> {
68
+ const url = `${this.baseUrl}/private/customers/${encodeURIComponent(customerId)}/welcome-accreditation?tenantId=${encodeURIComponent(tenantId)}`;
69
+ // Sin body: el cliente va en el path y el actor lo pone el destino desde el contexto privado.
70
+ return await this.httpRequest.post(url, {});
71
+ }
63
72
  }
@@ -7,14 +7,14 @@ import {
7
7
 
8
8
  /**
9
9
  * Contrato del publisher HTTP del lambda `retail-customer-business` (SureKeep Fase 2, pista Retail)
10
- * para sus 4 endpoints privados de cliente (service-to-service, VPC-only).
10
+ * para sus 5 endpoints privados de cliente (service-to-service, VPC-only).
11
11
  *
12
12
  * Consumidor previsto:
13
13
  * - `retail-wizard-business` → upsert del cliente post-KYC, aterrizaje del resultado de apertura
14
14
  * de cuenta (D35), y lecturas del cliente por teléfono / id durante la saga de venta.
15
15
  *
16
16
  * ─────────────────────────────────────────────────────────────────────────────
17
- * `tenantId` es OBLIGATORIO en los 4 métodos — no es un detalle de firma.
17
+ * `tenantId` es OBLIGATORIO en los 5 métodos — no es un detalle de firma.
18
18
  * ─────────────────────────────────────────────────────────────────────────────
19
19
  * Los privados NO llevan token de usuario (`Feature.ANONIMUS`; la protección es la red VPC), así que
20
20
  * el lambda destino no tiene `AuthContext.issuer` y NO puede inferir el silo. El caller declara el
@@ -94,4 +94,25 @@ export interface IRetailCustomerBusinessApi {
94
94
  customerId: string,
95
95
  tenantId: string,
96
96
  ): Promise<StandardResponse<CustomerResponse>>;
97
+
98
+ /**
99
+ * POST /private/customers/{customerId}/welcome-accreditation?tenantId= — RESERVA la acreditación
100
+ * del bono de bienvenida (D33). Sin body: el cliente va en el path, el actor lo pone el destino.
101
+ *
102
+ * ⚠️ Reserva, NO acredita. El lambda destino es dueño del flag `welcomeAccredited` y su transición
103
+ * `false → true` es el candado de idempotencia PERMANENTE por cliente (una sola vez para siempre,
104
+ * ni una segunda venta la repite). La condición vive en la transacción DDB, así que dos requests
105
+ * concurrentes NO pueden ganar los dos.
106
+ *
107
+ * Orden obligatorio en el caller: reservar acá PRIMERO, mover plata en el processor DESPUÉS. Al
108
+ * revés, un doble click acredita dos veces plata real.
109
+ *
110
+ * @throws `409 WELCOME_ALREADY_ACCREDITED` si el bono ya se entregó. Para el caller NO es falla:
111
+ * es la señal de "no acredites" — la venta sigue su curso normal.
112
+ * @throws `404 CUSTOMER_NOT_FOUND` si el cliente no existe.
113
+ */
114
+ markWelcomeAccredited(
115
+ customerId: string,
116
+ tenantId: string,
117
+ ): Promise<StandardResponse<CustomerResponse>>;
97
118
  }