@fiado/api-invoker 5.70.0 → 5.72.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.
@@ -122,6 +122,8 @@ import { WalletFundingSettlementApi } from "./walletFundingSettlement/index.js";
122
122
  import { WalletFundingRulesApi } from "./wallet-funding-rules/index.js";
123
123
  // SNS/SES connector — envío SMS/MAIL síncrono (restaurado para RBAC — DEC-002 messages-business)
124
124
  import { SnsSesConnectorApi } from "./sns-ses-connector/index.js";
125
+ // Twilio connector — envío WhatsApp/SMS por Twilio (lee TWILIO_CONNECTOR_LAMBDA_URL)
126
+ import { TwilioConnectorApi } from "./twilio-connector/index.js";
125
127
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
126
128
  import { RemittanceBusinessApi } from "./remittance-business/index.js";
127
129
  import { BeneficiaryApi } from "./beneficiary/index.js";
@@ -269,6 +271,9 @@ export const apiInvokerBindings = new ContainerModule(({ bind }) => {
269
271
  bind("IWalletFundingRulesApi").to(WalletFundingRulesApi);
270
272
  // SNS/SES connector — envío SMS/MAIL síncrono (restaurado para RBAC — DEC-002 messages-business)
271
273
  bind("ISnsSesConnectorApi").to(SnsSesConnectorApi);
274
+ // Twilio connector — envío WhatsApp/SMS por Twilio, elegido por el `provider` del senderConfig.
275
+ // El consumidor necesita TWILIO_CONNECTOR_LAMBDA_URL desde el SSM `fiado-twilio-connector`.
276
+ bind("ITwilioConnectorApi").to(TwilioConnectorApi);
272
277
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
273
278
  bind("IRemittanceBusinessApi").to(RemittanceBusinessApi);
274
279
  // Borrado en cascada del directorio — deleteByDirectoryId por dominio
package/bin/index.d.ts CHANGED
@@ -103,6 +103,7 @@ export * from "./uniteller-connector/index.js";
103
103
  export * from "./walletFundingSettlement/index.js";
104
104
  export * from "./wallet-funding-rules/index.js";
105
105
  export * from "./sns-ses-connector/index.js";
106
+ export * from "./twilio-connector/index.js";
106
107
  export * from "./remittance-business/index.js";
107
108
  export * from "./modelias-connector/index.js";
108
109
  export * from "./beneficiary/index.js";
package/bin/index.js CHANGED
@@ -103,6 +103,7 @@ export * from "./uniteller-connector/index.js";
103
103
  export * from "./walletFundingSettlement/index.js";
104
104
  export * from "./wallet-funding-rules/index.js";
105
105
  export * from "./sns-ses-connector/index.js";
106
+ export * from "./twilio-connector/index.js";
106
107
  export * from "./remittance-business/index.js";
107
108
  export * from "./modelias-connector/index.js";
108
109
  export * from "./beneficiary/index.js";
@@ -1,6 +1,6 @@
1
1
  import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { StandardResponse } from "@fiado/gateway-adapter";
3
- import { ActivationCheckRequest, ActivationCheckResponse, LoanBorrowerResponse, LoanCreditResponse, OriginateLoanCreditRequest, OriginateLoanCreditResponse, QuoteLoanCreditRequest, QuoteLoanCreditResponse, SignLoanCreditRequest, SignLoanCreditResponse, UpsertLoanBorrowerRequest } from "@fiado/type-kit/bin/loanCredit/index.js";
3
+ import { ActivationCheckRequest, ActivationCheckResponse, CreditPaymentAppliedRequest, CreditPaymentAppliedResponse, CreditSettledRequest, CreditSettledResponse, LoanBorrowerResponse, LoanCreditResponse, OriginateLoanCreditRequest, OriginateLoanCreditResponse, QuoteLoanCreditRequest, QuoteLoanCreditResponse, SignLoanCreditRequest, SignLoanCreditResponse, UpsertLoanBorrowerRequest } from "@fiado/type-kit/bin/loanCredit/index.js";
4
4
  import { LoanCreditAnalyticsBatchRequest, LoanCreditAnalyticsBatchResponse } from "./dtos/LoanCreditAnalyticsBatch.js";
5
5
  import { CustomerCreditHistoryResponse } from "./dtos/CustomerCreditHistory.js";
6
6
  import { ILoanCreditBusinessApi } from "./interfaces/ILoanCreditBusinessApi.js";
@@ -23,6 +23,8 @@ export default class LoanCreditBusinessApi implements ILoanCreditBusinessApi {
23
23
  originate(input: OriginateLoanCreditRequest, tenantId: string): Promise<StandardResponse<OriginateLoanCreditResponse>>;
24
24
  quote(creditId: string, input: QuoteLoanCreditRequest, tenantId: string): Promise<StandardResponse<QuoteLoanCreditResponse>>;
25
25
  sign(creditId: string, input: SignLoanCreditRequest, tenantId: string): Promise<StandardResponse<SignLoanCreditResponse>>;
26
+ applyPayment(creditId: string, input: CreditPaymentAppliedRequest, tenantId: string): Promise<StandardResponse<CreditPaymentAppliedResponse>>;
27
+ settle(creditId: string, input: CreditSettledRequest, tenantId: string): Promise<StandardResponse<CreditSettledResponse>>;
26
28
  activateCheck(creditId: string, input: ActivationCheckRequest, tenantId: string): Promise<StandardResponse<ActivationCheckResponse>>;
27
29
  discard(creditId: string, tenantId: string): Promise<StandardResponse<LoanCreditResponse>>;
28
30
  getCredit(creditId: string, tenantId: string): Promise<StandardResponse<LoanCreditResponse>>;
@@ -42,6 +42,14 @@ let LoanCreditBusinessApi = class LoanCreditBusinessApi {
42
42
  const url = `${this.baseUrl}/private/credits/${encodeURIComponent(creditId)}/sign?tenantId=${encodeURIComponent(tenantId)}`;
43
43
  return await this.httpRequest.post(url, input);
44
44
  }
45
+ async applyPayment(creditId, input, tenantId) {
46
+ const url = `${this.baseUrl}/private/credits/${encodeURIComponent(creditId)}/payment-applied?tenantId=${encodeURIComponent(tenantId)}`;
47
+ return await this.httpRequest.post(url, input);
48
+ }
49
+ async settle(creditId, input, tenantId) {
50
+ const url = `${this.baseUrl}/private/credits/${encodeURIComponent(creditId)}/settled?tenantId=${encodeURIComponent(tenantId)}`;
51
+ return await this.httpRequest.post(url, input);
52
+ }
45
53
  async activateCheck(creditId, input, tenantId) {
46
54
  const url = `${this.baseUrl}/private/credits/${encodeURIComponent(creditId)}/activate-check?tenantId=${encodeURIComponent(tenantId)}`;
47
55
  return await this.httpRequest.post(url, input);
@@ -1,5 +1,5 @@
1
1
  import { StandardResponse } from "@fiado/gateway-adapter";
2
- import { ActivationCheckRequest, ActivationCheckResponse, LoanBorrowerResponse, LoanCreditResponse, OriginateLoanCreditRequest, OriginateLoanCreditResponse, QuoteLoanCreditRequest, QuoteLoanCreditResponse, SignLoanCreditRequest, SignLoanCreditResponse, UpsertLoanBorrowerRequest } from "@fiado/type-kit/bin/loanCredit/index.js";
2
+ import { ActivationCheckRequest, CreditPaymentAppliedRequest, CreditPaymentAppliedResponse, CreditSettledRequest, CreditSettledResponse, ActivationCheckResponse, LoanBorrowerResponse, LoanCreditResponse, OriginateLoanCreditRequest, OriginateLoanCreditResponse, QuoteLoanCreditRequest, QuoteLoanCreditResponse, SignLoanCreditRequest, SignLoanCreditResponse, UpsertLoanBorrowerRequest } from "@fiado/type-kit/bin/loanCredit/index.js";
3
3
  import { LoanCreditAnalyticsBatchRequest, LoanCreditAnalyticsBatchResponse } from "../dtos/LoanCreditAnalyticsBatch.js";
4
4
  import { CustomerCreditHistoryResponse } from "../dtos/CustomerCreditHistory.js";
5
5
  /**
@@ -43,6 +43,18 @@ export interface ILoanCreditBusinessApi {
43
43
  * `imeiEnrolled`/`lockVerified` (paso 09, dispara el MDM vía abstracción). Con las 4 en `true`
44
44
  * el crédito pasa a `ACTIVE` (vencimientos +7d, ventana de cancelación 7d).
45
45
  */
46
+ /**
47
+ * Pago aplicado: cura la mora del crédito y suelta el equipo si el candado era el de la mora.
48
+ * El body es opcional. Un candado por fraude o manual NO se suelta pagando, y un pago que no
49
+ * alcanza el umbral escalonado deja el equipo bloqueado — el `unlockDecision` dice cuál fue.
50
+ */
51
+ applyPayment(creditId: string, input: CreditPaymentAppliedRequest, tenantId: string): Promise<StandardResponse<CreditPaymentAppliedResponse>>;
52
+ /**
53
+ * Liquidación: VERIFICA que el crédito no deba nada, lo pasa a `SETTLED` y libera el equipo.
54
+ * No le cree al caller — un plan incompleto o una cuota viva lo rechazan. La liberación es
55
+ * IRREVERSIBLE: el equipo sale del enrolamiento, no queda desbloqueado.
56
+ */
57
+ settle(creditId: string, input: CreditSettledRequest, tenantId: string): Promise<StandardResponse<CreditSettledResponse>>;
46
58
  activateCheck(creditId: string, input: ActivationCheckRequest, tenantId: string): Promise<StandardResponse<ActivationCheckResponse>>;
47
59
  /**
48
60
  * Descarta un crédito PENDING_ACTIVATION → DISCARDED (compensación del wizard al cancelar la
@@ -11,6 +11,7 @@ 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
+ import { joinUrl } from '../../utils/joinUrl.js';
14
15
  let SnsSesConnectorApi = class SnsSesConnectorApi {
15
16
  httpRequest;
16
17
  baseUrl = process.env.SNS_SES_CONNECTOR_LAMBDA_URL || '';
@@ -18,7 +19,7 @@ let SnsSesConnectorApi = class SnsSesConnectorApi {
18
19
  this.httpRequest = httpRequest;
19
20
  }
20
21
  async send(request) {
21
- const url = `${this.baseUrl}send`;
22
+ const url = joinUrl(this.baseUrl, 'send');
22
23
  return await this.httpRequest.post(url, request, { 'operationName': 'privateSend' });
23
24
  }
24
25
  };
@@ -1,4 +1,4 @@
1
- import { IHttpRequest } from "@fiado/http-client";
1
+ import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { ConnectorSendMessageRequest, ConnectorSendMessageResponse } from "@fiado/type-kit/bin/twilioConnector/index.js";
3
3
  import { ITwilioConnectorApi } from "./interfaces/ITwilioConnectorApi.js";
4
4
  type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
@@ -11,6 +11,7 @@ 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
+ import { joinUrl } from "../../utils/joinUrl.js";
14
15
  let TwilioConnectorApi = class TwilioConnectorApi {
15
16
  httpRequest;
16
17
  baseUrl = process.env.TWILIO_CONNECTOR_LAMBDA_URL || "";
@@ -18,7 +19,7 @@ let TwilioConnectorApi = class TwilioConnectorApi {
18
19
  this.httpRequest = httpRequest;
19
20
  }
20
21
  async send(request) {
21
- const url = `${this.baseUrl}/messages/send`;
22
+ const url = joinUrl(this.baseUrl, "messages/send");
22
23
  return await this.httpRequest.post(url, request, { operationName: "privateSendMessage" });
23
24
  }
24
25
  };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Une la URL base de un lambda con un path relativo dejando exactamente una barra
3
+ * entre ambos, venga o no la base con barra final desde SSM.
4
+ */
5
+ export declare function joinUrl(baseUrl: string, path: string): string;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Une la URL base de un lambda con un path relativo dejando exactamente una barra
3
+ * entre ambos, venga o no la base con barra final desde SSM.
4
+ */
5
+ export function joinUrl(baseUrl, path) {
6
+ const base = baseUrl.replace(/\/+$/, '');
7
+ const relativePath = path.replace(/^\/+/, '');
8
+ return `${base}/${relativePath}`;
9
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "5.70.0",
3
+ "version": "5.72.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",
@@ -187,6 +187,8 @@ import { IWalletFundingSettlementApi, WalletFundingSettlementApi } from "./walle
187
187
  import { IWalletFundingRulesApi, WalletFundingRulesApi } from "./wallet-funding-rules/index.js";
188
188
  // SNS/SES connector — envío SMS/MAIL síncrono (restaurado para RBAC — DEC-002 messages-business)
189
189
  import { ISnsSesConnectorApi, SnsSesConnectorApi } from "./sns-ses-connector/index.js";
190
+ // Twilio connector — envío WhatsApp/SMS por Twilio (lee TWILIO_CONNECTOR_LAMBDA_URL)
191
+ import { ITwilioConnectorApi, TwilioConnectorApi } from "./twilio-connector/index.js";
190
192
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
191
193
  import { IRemittanceBusinessApi, RemittanceBusinessApi } from "./remittance-business/index.js";
192
194
  import { IBeneficiaryApi, BeneficiaryApi } from "./beneficiary/index.js";
@@ -360,6 +362,10 @@ export const apiInvokerBindings = new ContainerModule(({ bind }) => {
360
362
  // SNS/SES connector — envío SMS/MAIL síncrono (restaurado para RBAC — DEC-002 messages-business)
361
363
  bind<ISnsSesConnectorApi>("ISnsSesConnectorApi").to(SnsSesConnectorApi);
362
364
 
365
+ // Twilio connector — envío WhatsApp/SMS por Twilio, elegido por el `provider` del senderConfig.
366
+ // El consumidor necesita TWILIO_CONNECTOR_LAMBDA_URL desde el SSM `fiado-twilio-connector`.
367
+ bind<ITwilioConnectorApi>("ITwilioConnectorApi").to(TwilioConnectorApi);
368
+
363
369
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
364
370
  bind<IRemittanceBusinessApi>("IRemittanceBusinessApi").to(RemittanceBusinessApi);
365
371
 
package/src/index.ts CHANGED
@@ -103,6 +103,7 @@ export * from "./uniteller-connector/index.js";
103
103
  export * from "./walletFundingSettlement/index.js";
104
104
  export * from "./wallet-funding-rules/index.js";
105
105
  export * from "./sns-ses-connector/index.js";
106
+ export * from "./twilio-connector/index.js";
106
107
  export * from "./remittance-business/index.js";
107
108
  export * from "./modelias-connector/index.js";
108
109
  export * from "./beneficiary/index.js";
@@ -4,6 +4,10 @@ import { StandardResponse } from "@fiado/gateway-adapter";
4
4
  import {
5
5
  ActivationCheckRequest,
6
6
  ActivationCheckResponse,
7
+ CreditPaymentAppliedRequest,
8
+ CreditPaymentAppliedResponse,
9
+ CreditSettledRequest,
10
+ CreditSettledResponse,
7
11
  LoanBorrowerResponse,
8
12
  LoanCreditResponse,
9
13
  OriginateLoanCreditRequest,
@@ -66,6 +70,24 @@ export default class LoanCreditBusinessApi implements ILoanCreditBusinessApi {
66
70
  return await this.httpRequest.post(url, input);
67
71
  }
68
72
 
73
+ async applyPayment(
74
+ creditId: string,
75
+ input: CreditPaymentAppliedRequest,
76
+ tenantId: string,
77
+ ): Promise<StandardResponse<CreditPaymentAppliedResponse>> {
78
+ const url = `${this.baseUrl}/private/credits/${encodeURIComponent(creditId)}/payment-applied?tenantId=${encodeURIComponent(tenantId)}`;
79
+ return await this.httpRequest.post(url, input);
80
+ }
81
+
82
+ async settle(
83
+ creditId: string,
84
+ input: CreditSettledRequest,
85
+ tenantId: string,
86
+ ): Promise<StandardResponse<CreditSettledResponse>> {
87
+ const url = `${this.baseUrl}/private/credits/${encodeURIComponent(creditId)}/settled?tenantId=${encodeURIComponent(tenantId)}`;
88
+ return await this.httpRequest.post(url, input);
89
+ }
90
+
69
91
  async activateCheck(
70
92
  creditId: string,
71
93
  input: ActivationCheckRequest,
@@ -1,6 +1,10 @@
1
1
  import { StandardResponse } from "@fiado/gateway-adapter";
2
2
  import {
3
3
  ActivationCheckRequest,
4
+ CreditPaymentAppliedRequest,
5
+ CreditPaymentAppliedResponse,
6
+ CreditSettledRequest,
7
+ CreditSettledResponse,
4
8
  ActivationCheckResponse,
5
9
  LoanBorrowerResponse,
6
10
  LoanCreditResponse,
@@ -73,6 +77,28 @@ export interface ILoanCreditBusinessApi {
73
77
  * `imeiEnrolled`/`lockVerified` (paso 09, dispara el MDM vía abstracción). Con las 4 en `true`
74
78
  * el crédito pasa a `ACTIVE` (vencimientos +7d, ventana de cancelación 7d).
75
79
  */
80
+ /**
81
+ * Pago aplicado: cura la mora del crédito y suelta el equipo si el candado era el de la mora.
82
+ * El body es opcional. Un candado por fraude o manual NO se suelta pagando, y un pago que no
83
+ * alcanza el umbral escalonado deja el equipo bloqueado — el `unlockDecision` dice cuál fue.
84
+ */
85
+ applyPayment(
86
+ creditId: string,
87
+ input: CreditPaymentAppliedRequest,
88
+ tenantId: string,
89
+ ): Promise<StandardResponse<CreditPaymentAppliedResponse>>;
90
+
91
+ /**
92
+ * Liquidación: VERIFICA que el crédito no deba nada, lo pasa a `SETTLED` y libera el equipo.
93
+ * No le cree al caller — un plan incompleto o una cuota viva lo rechazan. La liberación es
94
+ * IRREVERSIBLE: el equipo sale del enrolamiento, no queda desbloqueado.
95
+ */
96
+ settle(
97
+ creditId: string,
98
+ input: CreditSettledRequest,
99
+ tenantId: string,
100
+ ): Promise<StandardResponse<CreditSettledResponse>>;
101
+
76
102
  activateCheck(
77
103
  creditId: string,
78
104
  input: ActivationCheckRequest,
@@ -2,6 +2,7 @@ import { inject, injectable } from 'inversify';
2
2
  import type { IHttpRequest } from '@fiado/http-client';
3
3
  import { MessageDeliveryRequest, MessageDeliveryResponse } from '@fiado/type-kit/bin/messaging/index.js';
4
4
  import { ISnsSesConnectorApi } from './interfaces/ISnsSesConnectorApi.js';
5
+ import { joinUrl } from '../../utils/joinUrl.js';
5
6
 
6
7
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
7
8
 
@@ -12,7 +13,7 @@ export class SnsSesConnectorApi implements ISnsSesConnectorApi {
12
13
  constructor(@inject('IHttpRequest') private readonly httpRequest: IHttpRequest) {}
13
14
 
14
15
  async send(request: MessageDeliveryRequest): Promise<FiadoApiResponse<MessageDeliveryResponse>> {
15
- const url = `${this.baseUrl}send`;
16
+ const url = joinUrl(this.baseUrl, 'send');
16
17
  return await this.httpRequest.post(url, request, { 'operationName': 'privateSend' });
17
18
  }
18
19
  }
@@ -1,7 +1,8 @@
1
1
  import { inject, injectable } from "inversify";
2
- import { IHttpRequest } from "@fiado/http-client";
2
+ import type { IHttpRequest } from "@fiado/http-client";
3
3
  import { ConnectorSendMessageRequest, ConnectorSendMessageResponse } from "@fiado/type-kit/bin/twilioConnector/index.js";
4
4
  import { ITwilioConnectorApi } from "./interfaces/ITwilioConnectorApi.js";
5
+ import { joinUrl } from "../../utils/joinUrl.js";
5
6
 
6
7
  type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
7
8
 
@@ -12,7 +13,7 @@ export default class TwilioConnectorApi implements ITwilioConnectorApi {
12
13
  constructor(@inject("IHttpRequest") private httpRequest: IHttpRequest) {}
13
14
 
14
15
  async send(request: ConnectorSendMessageRequest): Promise<FiadoApiResponse<ConnectorSendMessageResponse>> {
15
- const url = `${this.baseUrl}/messages/send`;
16
+ const url = joinUrl(this.baseUrl, "messages/send");
16
17
  return await this.httpRequest.post(url, request, { operationName: "privateSendMessage" });
17
18
  }
18
19
  }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Une la URL base de un lambda con un path relativo dejando exactamente una barra
3
+ * entre ambos, venga o no la base con barra final desde SSM.
4
+ */
5
+ export function joinUrl(baseUrl: string, path: string): string {
6
+ const base = baseUrl.replace(/\/+$/, '');
7
+ const relativePath = path.replace(/^\/+/, '');
8
+ return `${base}/${relativePath}`;
9
+ }