@fiado/api-invoker 4.39.0 → 4.41.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.
@@ -48,8 +48,19 @@ let ApiInvokerPermissionResolver = class ApiInvokerPermissionResolver {
48
48
  // en el adapter, enforceRbac mapea solo PermissionDeniedError a 403; este error se re-lanza -> 5xx.
49
49
  // Es fail-closed (no concede), NO un 403, y es deliberado: un fallo de red NO debe verse como
50
50
  // "usuario sin permisos". NUNCA devolver { assignments: [] } en un catch.
51
- const resp = await this._api.resolvePermissions(input);
52
- const resolved = resp.body;
51
+ //
52
+ // SHAPE (TD-AI-003): @fiado/http-client (.post) devuelve `response.data` = el BODY HTTP crudo del
53
+ // ApiResponse de rbac, o sea `{ code, data, msg }` — NO un ApiGatewayResponse `{ statusCode, body }`
54
+ // (el tipo de retorno del publisher es histórico y no refleja el runtime). El ResolvedPermissions
55
+ // viene en `.data`. Leer `.body` daba undefined → crash en enforceRbac. Ver docs/TECH_DEBT.md.
56
+ const resp = (await this._api.resolvePermissions(input));
57
+ const resolved = resp?.data;
58
+ // Fail-closed (DEC-RBAC-071): si rbac no devolvió un payload válido (403 de PRIVATE/VPC, ruta
59
+ // inexistente, shape inesperado), NO devolver undefined (rompería enforceRbac con TypeError) →
60
+ // propagar para que el adapter deny. tenantId siempre es string en un ResolvedPermissions ('' = deny).
61
+ if (!resolved || typeof resolved.tenantId !== "string") {
62
+ throw new Error("ApiInvokerPermissionResolver: respuesta de rbac sin ResolvedPermissions válido (resolvePermissions)");
63
+ }
53
64
  if (cacheable)
54
65
  this._cache.set(key, resolved);
55
66
  return resolved;
@@ -1,7 +1,7 @@
1
1
  import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { ApiGatewayResponse } from "@fiado/gateway-adapter";
3
3
  import { ConnectorCatalogItem } from "@fiado/type-kit/bin/benefitCenter/index.js";
4
- import { RemittanceAddBeneficiaryRequest, RemittanceBackofficeDashboardSummary, RemittanceBackofficeStats, RemittanceBackofficeStatsPeriod, RemittanceBackofficeTransaction, RemittanceBackofficeTxListResponse, RemittanceBackofficeUserDetail, RemittanceBackofficeUserListResponse, RemittanceBeneficiary, RemittanceCancelRequest, RemittanceCancelResponse, RemittanceHomeResponse, RemittanceListBeneficiariesResponse, RemittanceOnboardRequest, RemittanceOnboardResponse, RemittancePayRequest, RemittancePayResponse, RemittancePayerAdditionalFieldDto, RemittancePayerBranchDto, RemittancePayerDto, RemittanceQuoteRequest, RemittanceQuoteResponse, RemittanceSecurityQuestionsResponse, RemittanceSendPreviewRequest, RemittanceSendPreviewResponse, RemittanceSmsRequest, RemittanceStateDto, RemittanceTransactionDetail, RemittanceTransactionReceipt, RemittanceTransactionsListRequest, RemittanceTransactionsListResponse, RemittanceUpdateBeneficiaryRequest } from "@fiado/type-kit/bin/remittance/index.js";
4
+ import { RemittanceAddBeneficiaryRequest, RemittanceBackofficeDashboardSummary, RemittanceBackofficeStats, RemittanceBackofficeStatsPeriod, RemittanceBackofficeTransaction, RemittanceBackofficeTxListResponse, RemittanceBackofficeUserDetail, RemittanceBackofficeUserListResponse, RemittanceBeneficiary, RemittanceCancelRequest, RemittanceCancelResponse, RemittanceHomeResponse, RemittanceListBeneficiariesResponse, RemittanceOnboardRequest, RemittanceOnboardResponse, RemittancePayRequest, RemittancePayResponse, RemittancePayerAdditionalFieldDto, RemittancePayerBranchDto, RemittancePayerDto, RemittanceQuoteRequest, RemittanceQuoteResponse, RemittanceSecurityQuestionsResponse, RemittanceSendPreviewRequest, RemittanceSendPreviewResponse, RemittanceSmsRequest, RemittanceStateDto, RemittanceTransactionDetail, RemittanceTransactionReceipt, RemittanceTransactionsListRequest, RemittanceTransactionsListResponse, RemittanceUpdateBeneficiaryRequest, RemittanceUserLimits, RemittanceUserLimitsBatchResponse } from "@fiado/type-kit/bin/remittance/index.js";
5
5
  import { IUnitellerConnectorApi } from "./interfaces/IUnitellerConnectorApi.js";
6
6
  export default class UnitellerConnectorApi implements IUnitellerConnectorApi {
7
7
  private httpRequest;
@@ -65,4 +65,6 @@ export default class UnitellerConnectorApi implements IUnitellerConnectorApi {
65
65
  }): Promise<ApiGatewayResponse<RemittanceBackofficeTxListResponse>>;
66
66
  backofficeTransactionDetail(txNumber: string): Promise<ApiGatewayResponse<RemittanceBackofficeTransaction>>;
67
67
  backofficeStats(period: RemittanceBackofficeStatsPeriod): Promise<ApiGatewayResponse<RemittanceBackofficeStats>>;
68
+ backofficeUserLimits(directoryId: string): Promise<ApiGatewayResponse<RemittanceUserLimits>>;
69
+ backofficeUserLimitsBatch(directoryIds: string[]): Promise<ApiGatewayResponse<RemittanceUserLimitsBatchResponse>>;
68
70
  }
@@ -141,6 +141,14 @@ let UnitellerConnectorApi = class UnitellerConnectorApi {
141
141
  const url = `${this.baseUrl}/backoffice/stats`;
142
142
  return await this.httpRequest.get(url, { period });
143
143
  }
144
+ async backofficeUserLimits(directoryId) {
145
+ const url = `${this.baseUrl}/backoffice/users/${encodeURIComponent(directoryId)}/limits`;
146
+ return await this.httpRequest.get(url);
147
+ }
148
+ async backofficeUserLimitsBatch(directoryIds) {
149
+ const url = `${this.baseUrl}/backoffice/users/limits`;
150
+ return await this.httpRequest.get(url, { directoryIds: directoryIds.join(",") });
151
+ }
144
152
  };
145
153
  UnitellerConnectorApi = __decorate([
146
154
  injectable(),
@@ -1,6 +1,6 @@
1
1
  import { ApiGatewayResponse } from "@fiado/gateway-adapter";
2
2
  import { ConnectorCatalogItem } from "@fiado/type-kit/bin/benefitCenter/index.js";
3
- import { RemittanceAddBeneficiaryRequest, RemittanceBackofficeDashboardSummary, RemittanceBackofficeStats, RemittanceBackofficeStatsPeriod, RemittanceBackofficeTransaction, RemittanceBackofficeTxListResponse, RemittanceBackofficeUserDetail, RemittanceBackofficeUserListResponse, RemittanceBeneficiary, RemittanceCancelRequest, RemittanceCancelResponse, RemittanceHomeResponse, RemittanceListBeneficiariesResponse, RemittanceOnboardRequest, RemittanceOnboardResponse, RemittancePayRequest, RemittancePayResponse, RemittancePayerAdditionalFieldDto, RemittancePayerBranchDto, RemittancePayerDto, RemittanceQuoteRequest, RemittanceQuoteResponse, RemittanceSecurityQuestionsResponse, RemittanceSendPreviewRequest, RemittanceSendPreviewResponse, RemittanceSmsRequest, RemittanceStateDto, RemittanceTransactionDetail, RemittanceTransactionReceipt, RemittanceTransactionsListRequest, RemittanceTransactionsListResponse, RemittanceUpdateBeneficiaryRequest } from "@fiado/type-kit/bin/remittance/index.js";
3
+ import { RemittanceAddBeneficiaryRequest, RemittanceBackofficeDashboardSummary, RemittanceBackofficeStats, RemittanceBackofficeStatsPeriod, RemittanceBackofficeTransaction, RemittanceBackofficeTxListResponse, RemittanceBackofficeUserDetail, RemittanceBackofficeUserListResponse, RemittanceBeneficiary, RemittanceCancelRequest, RemittanceCancelResponse, RemittanceHomeResponse, RemittanceListBeneficiariesResponse, RemittanceOnboardRequest, RemittanceOnboardResponse, RemittancePayRequest, RemittancePayResponse, RemittancePayerAdditionalFieldDto, RemittancePayerBranchDto, RemittancePayerDto, RemittanceQuoteRequest, RemittanceQuoteResponse, RemittanceSecurityQuestionsResponse, RemittanceSendPreviewRequest, RemittanceSendPreviewResponse, RemittanceSmsRequest, RemittanceStateDto, RemittanceTransactionDetail, RemittanceTransactionReceipt, RemittanceTransactionsListRequest, RemittanceTransactionsListResponse, RemittanceUpdateBeneficiaryRequest, RemittanceUserLimits, RemittanceUserLimitsBatchResponse } from "@fiado/type-kit/bin/remittance/index.js";
4
4
  export interface IUnitellerConnectorApi {
5
5
  /** Estado del módulo remesas para un directoryId. */
6
6
  getHome(directoryId: string): Promise<ApiGatewayResponse<RemittanceHomeResponse>>;
@@ -108,4 +108,8 @@ export interface IUnitellerConnectorApi {
108
108
  }): Promise<ApiGatewayResponse<RemittanceBackofficeTxListResponse>>;
109
109
  backofficeTransactionDetail(txNumber: string): Promise<ApiGatewayResponse<RemittanceBackofficeTransaction>>;
110
110
  backofficeStats(period: RemittanceBackofficeStatsPeriod): Promise<ApiGatewayResponse<RemittanceBackofficeStats>>;
111
+ /** Límites por usuario (Operación · read-only): ventanas (límite del provider + usage) + nivel + discrepancia. */
112
+ backofficeUserLimits(directoryId: string): Promise<ApiGatewayResponse<RemittanceUserLimits>>;
113
+ /** Batch de límites para la tabla de Límites (CSV de directoryIds). */
114
+ backofficeUserLimitsBatch(directoryIds: string[]): Promise<ApiGatewayResponse<RemittanceUserLimitsBatchResponse>>;
111
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "4.39.0",
3
+ "version": "4.41.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.9.0",
35
35
  "@fiado/http-client": "^2.0.1",
36
36
  "@fiado/logger": "^1.1.3",
37
- "@fiado/type-kit": "^3.123.0",
37
+ "@fiado/type-kit": "^3.133.0",
38
38
  "dotenv": "^16.4.7"
39
39
  },
40
40
  "peerDependencies": {
@@ -40,8 +40,19 @@ export class ApiInvokerPermissionResolver {
40
40
  // en el adapter, enforceRbac mapea solo PermissionDeniedError a 403; este error se re-lanza -> 5xx.
41
41
  // Es fail-closed (no concede), NO un 403, y es deliberado: un fallo de red NO debe verse como
42
42
  // "usuario sin permisos". NUNCA devolver { assignments: [] } en un catch.
43
- const resp = await this._api.resolvePermissions(input);
44
- const resolved = resp.body;
43
+ //
44
+ // SHAPE (TD-AI-003): @fiado/http-client (.post) devuelve `response.data` = el BODY HTTP crudo del
45
+ // ApiResponse de rbac, o sea `{ code, data, msg }` — NO un ApiGatewayResponse `{ statusCode, body }`
46
+ // (el tipo de retorno del publisher es histórico y no refleja el runtime). El ResolvedPermissions
47
+ // viene en `.data`. Leer `.body` daba undefined → crash en enforceRbac. Ver docs/TECH_DEBT.md.
48
+ const resp = (await this._api.resolvePermissions(input)) as unknown as { data?: ResolvedPermissions };
49
+ const resolved = resp?.data;
50
+ // Fail-closed (DEC-RBAC-071): si rbac no devolvió un payload válido (403 de PRIVATE/VPC, ruta
51
+ // inexistente, shape inesperado), NO devolver undefined (rompería enforceRbac con TypeError) →
52
+ // propagar para que el adapter deny. tenantId siempre es string en un ResolvedPermissions ('' = deny).
53
+ if (!resolved || typeof resolved.tenantId !== "string") {
54
+ throw new Error("ApiInvokerPermissionResolver: respuesta de rbac sin ResolvedPermissions válido (resolvePermissions)");
55
+ }
45
56
  if (cacheable) this._cache.set(key, resolved);
46
57
  return resolved;
47
58
  }
@@ -35,6 +35,8 @@ import {
35
35
  RemittanceTransactionsListRequest,
36
36
  RemittanceTransactionsListResponse,
37
37
  RemittanceUpdateBeneficiaryRequest,
38
+ RemittanceUserLimits,
39
+ RemittanceUserLimitsBatchResponse,
38
40
  } from "@fiado/type-kit/bin/remittance/index.js";
39
41
  import { IUnitellerConnectorApi } from "./interfaces/IUnitellerConnectorApi.js";
40
42
 
@@ -199,6 +201,16 @@ export default class UnitellerConnectorApi implements IUnitellerConnectorApi {
199
201
  const url = `${this.baseUrl}/backoffice/stats`;
200
202
  return await this.httpRequest.get(url, { period });
201
203
  }
204
+
205
+ async backofficeUserLimits(directoryId: string): Promise<ApiGatewayResponse<RemittanceUserLimits>> {
206
+ const url = `${this.baseUrl}/backoffice/users/${encodeURIComponent(directoryId)}/limits`;
207
+ return await this.httpRequest.get(url);
208
+ }
209
+
210
+ async backofficeUserLimitsBatch(directoryIds: string[]): Promise<ApiGatewayResponse<RemittanceUserLimitsBatchResponse>> {
211
+ const url = `${this.baseUrl}/backoffice/users/limits`;
212
+ return await this.httpRequest.get(url, { directoryIds: directoryIds.join(",") });
213
+ }
202
214
  }
203
215
 
204
216
  /** Quita las keys undefined para no mandar query params vacíos. */
@@ -33,6 +33,8 @@ import {
33
33
  RemittanceTransactionsListRequest,
34
34
  RemittanceTransactionsListResponse,
35
35
  RemittanceUpdateBeneficiaryRequest,
36
+ RemittanceUserLimits,
37
+ RemittanceUserLimitsBatchResponse,
36
38
  } from "@fiado/type-kit/bin/remittance/index.js";
37
39
 
38
40
  export interface IUnitellerConnectorApi {
@@ -157,4 +159,8 @@ export interface IUnitellerConnectorApi {
157
159
  backofficeListTransactions(filters?: { txNumber?: string; directoryId?: string; status?: string; countryISO?: string; from?: string; to?: string; pageSize?: number; index?: string }): Promise<ApiGatewayResponse<RemittanceBackofficeTxListResponse>>;
158
160
  backofficeTransactionDetail(txNumber: string): Promise<ApiGatewayResponse<RemittanceBackofficeTransaction>>;
159
161
  backofficeStats(period: RemittanceBackofficeStatsPeriod): Promise<ApiGatewayResponse<RemittanceBackofficeStats>>;
162
+ /** Límites por usuario (Operación · read-only): ventanas (límite del provider + usage) + nivel + discrepancia. */
163
+ backofficeUserLimits(directoryId: string): Promise<ApiGatewayResponse<RemittanceUserLimits>>;
164
+ /** Batch de límites para la tabla de Límites (CSV de directoryIds). */
165
+ backofficeUserLimitsBatch(directoryIds: string[]): Promise<ApiGatewayResponse<RemittanceUserLimitsBatchResponse>>;
160
166
  }