@fiado/api-invoker 5.33.1 → 5.35.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/loanCredit/api/LoanCreditDeviceApi.d.ts +27 -0
- package/bin/loanCredit/api/LoanCreditDeviceApi.js +63 -0
- package/bin/loanCredit/api/interfaces/ILoanCreditDeviceApi.d.ts +57 -0
- package/bin/loanCredit/api/interfaces/ILoanCreditDeviceApi.js +1 -0
- package/bin/loanCredit/index.d.ts +2 -0
- package/bin/loanCredit/index.js +2 -0
- package/bin/membership/MembershipApi.d.ts +12 -0
- package/bin/membership/MembershipApi.js +32 -0
- package/bin/membership/index.d.ts +2 -0
- package/bin/membership/index.js +2 -0
- package/bin/membership/interfaces/IMembershipApi.d.ts +15 -0
- package/bin/membership/interfaces/IMembershipApi.js +1 -0
- package/bin/notificationWebsockets/NotificationWebsocketApi.d.ts +12 -0
- package/bin/notificationWebsockets/NotificationWebsocketApi.js +32 -0
- package/bin/notificationWebsockets/interfaces/INotificationWebsocketApi.d.ts +15 -0
- package/bin/notificationWebsockets/interfaces/INotificationWebsocketApi.js +1 -0
- package/bin/performance-profile/PerformanceProfileApi.d.ts +12 -0
- package/bin/performance-profile/PerformanceProfileApi.js +32 -0
- package/bin/performance-profile/index.d.ts +2 -0
- package/bin/performance-profile/index.js +2 -0
- package/bin/performance-profile/interfaces/IPerformanceProfileApi.d.ts +15 -0
- package/bin/performance-profile/interfaces/IPerformanceProfileApi.js +1 -0
- package/bin/presence-websocket/PresenceWebsocketApi.d.ts +12 -0
- package/bin/presence-websocket/PresenceWebsocketApi.js +32 -0
- package/bin/presence-websocket/index.d.ts +2 -0
- package/bin/presence-websocket/index.js +2 -0
- package/bin/presence-websocket/interfaces/IPresenceWebsocketApi.d.ts +15 -0
- package/bin/presence-websocket/interfaces/IPresenceWebsocketApi.js +1 -0
- package/bin/synergypay-connector/api/SynergyPayConnectorApi.d.ts +8 -2
- package/bin/synergypay-connector/api/SynergyPayConnectorApi.js +23 -0
- package/bin/synergypay-connector/api/interfaces/ISynergyPayConnectorApi.d.ts +32 -1
- package/package.json +2 -2
- package/src/loanCredit/api/LoanCreditDeviceApi.ts +86 -0
- package/src/loanCredit/api/interfaces/ILoanCreditDeviceApi.ts +94 -0
- package/src/loanCredit/index.ts +3 -0
- package/src/synergypay-connector/api/SynergyPayConnectorApi.ts +34 -1
- package/src/synergypay-connector/api/interfaces/ISynergyPayConnectorApi.ts +38 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IHttpRequest } from "@fiado/http-client";
|
|
2
|
+
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
3
|
+
import { LoanDeviceEnrollRequest, LoanDeviceEnrollResponse, LoanDeviceEnrollStatusRequest, LoanDeviceEnrollStatusResponse, LoanDeviceLastSeenRequest, LoanDeviceLastSeenResponse, LoanDeviceManualLockRequest, LoanDeviceManualLockResponse, LoanDeviceManualUnlockRequest, LoanDeviceManualUnlockResponse, LoanDeviceStatusRequest, LoanDeviceStatusResponse } from "@fiado/type-kit/bin/loanCredit/index.js";
|
|
4
|
+
import { ILoanCreditDeviceApi } from "./interfaces/ILoanCreditDeviceApi.js";
|
|
5
|
+
/**
|
|
6
|
+
* Publisher HTTP de los endpoints de dispositivo/MDM del lambda `loan-credit-business`
|
|
7
|
+
* (componente 09 SureKeep F2). Contrato y semántica completos → `ILoanCreditDeviceApi`
|
|
8
|
+
* (tenantId obligatorio, `StandardResponse` → leer `result.data`, granularidad por ítem).
|
|
9
|
+
*
|
|
10
|
+
* Env var requerida en el consumer: `LOAN_CREDIT_BUSINESS_URL`.
|
|
11
|
+
* El template.yml del consumer la setea con:
|
|
12
|
+
*
|
|
13
|
+
* LOAN_CREDIT_BUSINESS_URL: '{{resolve:ssm:loan-credit-business}}'
|
|
14
|
+
*
|
|
15
|
+
* Convención CLAUDE.md global: SSM key = nombre del lambda owner de la URL.
|
|
16
|
+
*/
|
|
17
|
+
export default class LoanCreditDeviceApi implements ILoanCreditDeviceApi {
|
|
18
|
+
private httpRequest;
|
|
19
|
+
private readonly baseUrl;
|
|
20
|
+
constructor(httpRequest: IHttpRequest);
|
|
21
|
+
enroll(input: LoanDeviceEnrollRequest, tenantId: string): Promise<StandardResponse<LoanDeviceEnrollResponse>>;
|
|
22
|
+
getEnrollStatus(input: LoanDeviceEnrollStatusRequest, tenantId: string): Promise<StandardResponse<LoanDeviceEnrollStatusResponse>>;
|
|
23
|
+
getStatus(input: LoanDeviceStatusRequest, tenantId: string): Promise<StandardResponse<LoanDeviceStatusResponse>>;
|
|
24
|
+
getLastSeen(input: LoanDeviceLastSeenRequest, tenantId: string): Promise<StandardResponse<LoanDeviceLastSeenResponse>>;
|
|
25
|
+
manualLock(input: LoanDeviceManualLockRequest, tenantId: string): Promise<StandardResponse<LoanDeviceManualLockResponse>>;
|
|
26
|
+
manualUnlock(input: LoanDeviceManualUnlockRequest, tenantId: string): Promise<StandardResponse<LoanDeviceManualUnlockResponse>>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from "inversify";
|
|
14
|
+
/**
|
|
15
|
+
* Publisher HTTP de los endpoints de dispositivo/MDM del lambda `loan-credit-business`
|
|
16
|
+
* (componente 09 SureKeep F2). Contrato y semántica completos → `ILoanCreditDeviceApi`
|
|
17
|
+
* (tenantId obligatorio, `StandardResponse` → leer `result.data`, granularidad por ítem).
|
|
18
|
+
*
|
|
19
|
+
* Env var requerida en el consumer: `LOAN_CREDIT_BUSINESS_URL`.
|
|
20
|
+
* El template.yml del consumer la setea con:
|
|
21
|
+
*
|
|
22
|
+
* LOAN_CREDIT_BUSINESS_URL: '{{resolve:ssm:loan-credit-business}}'
|
|
23
|
+
*
|
|
24
|
+
* Convención CLAUDE.md global: SSM key = nombre del lambda owner de la URL.
|
|
25
|
+
*/
|
|
26
|
+
let LoanCreditDeviceApi = class LoanCreditDeviceApi {
|
|
27
|
+
httpRequest;
|
|
28
|
+
// El buildspec publica la URL en SSM con "/" final — se normaliza para no armar "//private".
|
|
29
|
+
baseUrl = (process.env.LOAN_CREDIT_BUSINESS_URL || "").replace(/\/+$/, "");
|
|
30
|
+
constructor(httpRequest) {
|
|
31
|
+
this.httpRequest = httpRequest;
|
|
32
|
+
}
|
|
33
|
+
async enroll(input, tenantId) {
|
|
34
|
+
const url = `${this.baseUrl}/private/devices/enroll?tenantId=${encodeURIComponent(tenantId)}`;
|
|
35
|
+
return await this.httpRequest.post(url, input);
|
|
36
|
+
}
|
|
37
|
+
async getEnrollStatus(input, tenantId) {
|
|
38
|
+
const url = `${this.baseUrl}/private/devices/enroll-status?tenantId=${encodeURIComponent(tenantId)}`;
|
|
39
|
+
return await this.httpRequest.post(url, input);
|
|
40
|
+
}
|
|
41
|
+
async getStatus(input, tenantId) {
|
|
42
|
+
const url = `${this.baseUrl}/private/devices/status?tenantId=${encodeURIComponent(tenantId)}`;
|
|
43
|
+
return await this.httpRequest.post(url, input);
|
|
44
|
+
}
|
|
45
|
+
async getLastSeen(input, tenantId) {
|
|
46
|
+
const url = `${this.baseUrl}/private/devices/last-seen?tenantId=${encodeURIComponent(tenantId)}`;
|
|
47
|
+
return await this.httpRequest.post(url, input);
|
|
48
|
+
}
|
|
49
|
+
async manualLock(input, tenantId) {
|
|
50
|
+
const url = `${this.baseUrl}/private/devices/manual-lock?tenantId=${encodeURIComponent(tenantId)}`;
|
|
51
|
+
return await this.httpRequest.post(url, input);
|
|
52
|
+
}
|
|
53
|
+
async manualUnlock(input, tenantId) {
|
|
54
|
+
const url = `${this.baseUrl}/private/devices/manual-unlock?tenantId=${encodeURIComponent(tenantId)}`;
|
|
55
|
+
return await this.httpRequest.post(url, input);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
LoanCreditDeviceApi = __decorate([
|
|
59
|
+
injectable(),
|
|
60
|
+
__param(0, inject("IHttpRequest")),
|
|
61
|
+
__metadata("design:paramtypes", [Object])
|
|
62
|
+
], LoanCreditDeviceApi);
|
|
63
|
+
export default LoanCreditDeviceApi;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
2
|
+
import { LoanDeviceEnrollRequest, LoanDeviceEnrollResponse, LoanDeviceEnrollStatusRequest, LoanDeviceEnrollStatusResponse, LoanDeviceLastSeenRequest, LoanDeviceLastSeenResponse, LoanDeviceManualLockRequest, LoanDeviceManualLockResponse, LoanDeviceManualUnlockRequest, LoanDeviceManualUnlockResponse, LoanDeviceStatusRequest, LoanDeviceStatusResponse } from "@fiado/type-kit/bin/loanCredit/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Contrato del publisher de dispositivo/MDM de `loan-credit-business` (componente 09 SureKeep F2).
|
|
5
|
+
* Endpoints PRIVADOS (VPC) que envuelven al motor MDM: enrolamiento del equipo, consulta de estado
|
|
6
|
+
* y bloqueo/desbloqueo manual. El contrato de crédito vive en `ILoanCreditBusinessApi`.
|
|
7
|
+
*
|
|
8
|
+
* Convenciones (idénticas a `ILoanCreditBusinessApi`):
|
|
9
|
+
* - `tenantId` OBLIGATORIO en todos los métodos — viaja por query `?tenantId=` (convención de los
|
|
10
|
+
* privados Fiado). Sin él el lambda responde `400 UNKNOWN_TENANT` (fail-closed, nunca default).
|
|
11
|
+
* - Retorna `StandardResponse<T>` → leer `result.data` (NO `result.body`).
|
|
12
|
+
* - Errores de transporte (falla el lambda entero, no un ítem): el publisher RECHAZA con el
|
|
13
|
+
* `DomainError` tipado del motor — `400 UNKNOWN_TENANT` / `400` de validación del body /
|
|
14
|
+
* `5xx` del motor. Nunca fallback: el caller jamás recibe un batch vacío disfrazado de éxito.
|
|
15
|
+
* - Idempotencia: las 3 mutaciones (`enroll`, `manualLock`, `manualUnlock`) son idempotentes por
|
|
16
|
+
* `input.operationReference` — es el idempotencyKey del caller. Reintentar el mismo lote con la
|
|
17
|
+
* misma referencia no vuelve a enrolar ni a bloquear; sin ella un retry tras timeout duplica.
|
|
18
|
+
*
|
|
19
|
+
* Granularidad POR ÍTEM — el batch NUNCA falla entero:
|
|
20
|
+
* - Cada `results[i]` trae su propio `status` (`SUCCESS` | `PENDING` | `ERROR`) y un `error`
|
|
21
|
+
* opcional. Un `StandardResponse` 200 puede traer ítems en `ERROR`: el caller TIENE que recorrer
|
|
22
|
+
* `results` y decidir por ítem — nunca asumir éxito global por el status HTTP.
|
|
23
|
+
* - El `error.code` del ítem es un `MdmErrorCodeEnum` (`PROVIDER_NOT_SUPPORTED`, `DEVICE_NOT_FOUND`,
|
|
24
|
+
* `PROVIDER_TIMEOUT`, …). El `status` del ítem NO lleva el motivo: el motivo vive solo en `error`.
|
|
25
|
+
* - `status: PENDING` = operación asíncrona en vuelo (típico de `enroll`). La resuelve el polling
|
|
26
|
+
* interno del motor; el caller la consulta después con `getEnrollStatus`.
|
|
27
|
+
*
|
|
28
|
+
* Env var requerida en el consumer:
|
|
29
|
+
*
|
|
30
|
+
* LOAN_CREDIT_BUSINESS_URL: '{{resolve:ssm:loan-credit-business}}'
|
|
31
|
+
*/
|
|
32
|
+
export interface ILoanCreditDeviceApi {
|
|
33
|
+
/**
|
|
34
|
+
* Enrola el equipo del crédito en el MDM (paso 09 del wizard). Típicamente devuelve el ítem en
|
|
35
|
+
* `PENDING`: el enrolamiento es asíncrono y se confirma después con `getEnrollStatus`.
|
|
36
|
+
*/
|
|
37
|
+
enroll(input: LoanDeviceEnrollRequest, tenantId: string): Promise<StandardResponse<LoanDeviceEnrollResponse>>;
|
|
38
|
+
/**
|
|
39
|
+
* Consulta en qué punto va el enrolamiento de cada crédito.
|
|
40
|
+
* Es POST y no GET porque el lote de `creditIds` puede traer miles de ids y no caben en la URL.
|
|
41
|
+
*/
|
|
42
|
+
getEnrollStatus(input: LoanDeviceEnrollStatusRequest, tenantId: string): Promise<StandardResponse<LoanDeviceEnrollStatusResponse>>;
|
|
43
|
+
/**
|
|
44
|
+
* Estado actual del dispositivo de cada crédito (bloqueado, libre, sin enrolar).
|
|
45
|
+
* Es POST y no GET porque el lote de `creditIds` puede traer miles de ids y no caben en la URL.
|
|
46
|
+
*/
|
|
47
|
+
getStatus(input: LoanDeviceStatusRequest, tenantId: string): Promise<StandardResponse<LoanDeviceStatusResponse>>;
|
|
48
|
+
/**
|
|
49
|
+
* Último contacto reportado por el dispositivo de cada crédito (señal de vida para cobranza).
|
|
50
|
+
* Es POST y no GET porque el lote de `creditIds` puede traer miles de ids y no caben en la URL.
|
|
51
|
+
*/
|
|
52
|
+
getLastSeen(input: LoanDeviceLastSeenRequest, tenantId: string): Promise<StandardResponse<LoanDeviceLastSeenResponse>>;
|
|
53
|
+
/** Bloqueo manual del dispositivo disparado desde el backoffice (acción de un operador). */
|
|
54
|
+
manualLock(input: LoanDeviceManualLockRequest, tenantId: string): Promise<StandardResponse<LoanDeviceManualLockResponse>>;
|
|
55
|
+
/** Desbloqueo manual del dispositivo disparado desde el backoffice (acción de un operador). */
|
|
56
|
+
manualUnlock(input: LoanDeviceManualUnlockRequest, tenantId: string): Promise<StandardResponse<LoanDeviceManualUnlockResponse>>;
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export * from "./api/interfaces/ILoanCreditBusinessApi.js";
|
|
2
2
|
export { default as LoanCreditBusinessApi } from "./api/LoanCreditBusinessApi.js";
|
|
3
|
+
export * from "./api/interfaces/ILoanCreditDeviceApi.js";
|
|
4
|
+
export { default as LoanCreditDeviceApi } from "./api/LoanCreditDeviceApi.js";
|
package/bin/loanCredit/index.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export * from "./api/interfaces/ILoanCreditBusinessApi.js";
|
|
2
2
|
export { default as LoanCreditBusinessApi } from "./api/LoanCreditBusinessApi.js";
|
|
3
|
+
export * from "./api/interfaces/ILoanCreditDeviceApi.js";
|
|
4
|
+
export { default as LoanCreditDeviceApi } from "./api/LoanCreditDeviceApi.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IHttpRequest } from "@fiado/http-client";
|
|
2
|
+
import { IMembershipApi } from "./interfaces/IMembershipApi.js";
|
|
3
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
4
|
+
export declare class MembershipApi implements IMembershipApi {
|
|
5
|
+
private httpRequest;
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(httpRequest: IHttpRequest);
|
|
8
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
9
|
+
deletedCount: number;
|
|
10
|
+
}>>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from "inversify";
|
|
14
|
+
import dotenv from 'dotenv';
|
|
15
|
+
dotenv.config();
|
|
16
|
+
let MembershipApi = class MembershipApi {
|
|
17
|
+
httpRequest;
|
|
18
|
+
baseUrl = process.env.MEMBERSHIP_BUSINESS_LAMBDA_URL || "";
|
|
19
|
+
constructor(httpRequest) {
|
|
20
|
+
this.httpRequest = httpRequest;
|
|
21
|
+
}
|
|
22
|
+
async deleteByDirectoryId(directoryId) {
|
|
23
|
+
const url = `${this.baseUrl}private/directory/${directoryId}`;
|
|
24
|
+
return await this.httpRequest.delete(url);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
MembershipApi = __decorate([
|
|
28
|
+
injectable(),
|
|
29
|
+
__param(0, inject("IHttpRequest")),
|
|
30
|
+
__metadata("design:paramtypes", [Object])
|
|
31
|
+
], MembershipApi);
|
|
32
|
+
export { MembershipApi };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
2
|
+
/**
|
|
3
|
+
* Interfaz para el servicio Membership (membership-business).
|
|
4
|
+
*/
|
|
5
|
+
export interface IMembershipApi {
|
|
6
|
+
/**
|
|
7
|
+
* Borra en cascada las membresías asociadas a un directoryId.
|
|
8
|
+
* @param directoryId ID del directorio.
|
|
9
|
+
* @throws {Error} Lanza un error si los parámetros de entrada son inválidos.
|
|
10
|
+
*/
|
|
11
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
12
|
+
deletedCount: number;
|
|
13
|
+
}>>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IHttpRequest } from "@fiado/http-client";
|
|
2
|
+
import { INotificationWebsocketApi } from "./interfaces/INotificationWebsocketApi.js";
|
|
3
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
4
|
+
export declare class NotificationWebsocketApi implements INotificationWebsocketApi {
|
|
5
|
+
private httpRequest;
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(httpRequest: IHttpRequest);
|
|
8
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
9
|
+
deletedCount: number;
|
|
10
|
+
}>>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from "inversify";
|
|
14
|
+
import dotenv from 'dotenv';
|
|
15
|
+
dotenv.config();
|
|
16
|
+
let NotificationWebsocketApi = class NotificationWebsocketApi {
|
|
17
|
+
httpRequest;
|
|
18
|
+
baseUrl = process.env.NOTIFICATIONS_WEBSOCKET_LAMBDA_URL || "";
|
|
19
|
+
constructor(httpRequest) {
|
|
20
|
+
this.httpRequest = httpRequest;
|
|
21
|
+
}
|
|
22
|
+
async deleteByDirectoryId(directoryId) {
|
|
23
|
+
const url = `${this.baseUrl}private/directory/${directoryId}`;
|
|
24
|
+
return await this.httpRequest.delete(url);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
NotificationWebsocketApi = __decorate([
|
|
28
|
+
injectable(),
|
|
29
|
+
__param(0, inject("IHttpRequest")),
|
|
30
|
+
__metadata("design:paramtypes", [Object])
|
|
31
|
+
], NotificationWebsocketApi);
|
|
32
|
+
export { NotificationWebsocketApi };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
2
|
+
/**
|
|
3
|
+
* Interfaz para el servicio Notifications Websocket (notifications-websocket).
|
|
4
|
+
*/
|
|
5
|
+
export interface INotificationWebsocketApi {
|
|
6
|
+
/**
|
|
7
|
+
* Borra en cascada las conexiones/notificaciones WS asociadas a un directoryId.
|
|
8
|
+
* @param directoryId ID del directorio.
|
|
9
|
+
* @throws {Error} Lanza un error si los parámetros de entrada son inválidos.
|
|
10
|
+
*/
|
|
11
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
12
|
+
deletedCount: number;
|
|
13
|
+
}>>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IHttpRequest } from "@fiado/http-client";
|
|
2
|
+
import { IPerformanceProfileApi } from "./interfaces/IPerformanceProfileApi.js";
|
|
3
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
4
|
+
export declare class PerformanceProfileApi implements IPerformanceProfileApi {
|
|
5
|
+
private httpRequest;
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(httpRequest: IHttpRequest);
|
|
8
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
9
|
+
deletedCount: number;
|
|
10
|
+
}>>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from "inversify";
|
|
14
|
+
import dotenv from 'dotenv';
|
|
15
|
+
dotenv.config();
|
|
16
|
+
let PerformanceProfileApi = class PerformanceProfileApi {
|
|
17
|
+
httpRequest;
|
|
18
|
+
baseUrl = process.env.PERFORMANCE_PROFILE_BUSINESS_LAMBDA_URL || "";
|
|
19
|
+
constructor(httpRequest) {
|
|
20
|
+
this.httpRequest = httpRequest;
|
|
21
|
+
}
|
|
22
|
+
async deleteByDirectoryId(directoryId) {
|
|
23
|
+
const url = `${this.baseUrl}private/directory/${directoryId}`;
|
|
24
|
+
return await this.httpRequest.delete(url);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
PerformanceProfileApi = __decorate([
|
|
28
|
+
injectable(),
|
|
29
|
+
__param(0, inject("IHttpRequest")),
|
|
30
|
+
__metadata("design:paramtypes", [Object])
|
|
31
|
+
], PerformanceProfileApi);
|
|
32
|
+
export { PerformanceProfileApi };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
2
|
+
/**
|
|
3
|
+
* Interfaz para el servicio Performance Profile (performance-profile-business).
|
|
4
|
+
*/
|
|
5
|
+
export interface IPerformanceProfileApi {
|
|
6
|
+
/**
|
|
7
|
+
* Borra en cascada los perfiles de desempeño asociados a un directoryId.
|
|
8
|
+
* @param directoryId ID del directorio.
|
|
9
|
+
* @throws {Error} Lanza un error si los parámetros de entrada son inválidos.
|
|
10
|
+
*/
|
|
11
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
12
|
+
deletedCount: number;
|
|
13
|
+
}>>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IHttpRequest } from "@fiado/http-client";
|
|
2
|
+
import { IPresenceWebsocketApi } from "./interfaces/IPresenceWebsocketApi.js";
|
|
3
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
4
|
+
export declare class PresenceWebsocketApi implements IPresenceWebsocketApi {
|
|
5
|
+
private httpRequest;
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(httpRequest: IHttpRequest);
|
|
8
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
9
|
+
deletedCount: number;
|
|
10
|
+
}>>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable } from "inversify";
|
|
14
|
+
import dotenv from 'dotenv';
|
|
15
|
+
dotenv.config();
|
|
16
|
+
let PresenceWebsocketApi = class PresenceWebsocketApi {
|
|
17
|
+
httpRequest;
|
|
18
|
+
baseUrl = process.env.PRESENCE_WEBSOCKET_LAMBDA_URL || "";
|
|
19
|
+
constructor(httpRequest) {
|
|
20
|
+
this.httpRequest = httpRequest;
|
|
21
|
+
}
|
|
22
|
+
async deleteByDirectoryId(directoryId) {
|
|
23
|
+
const url = `${this.baseUrl}private/directory/${directoryId}`;
|
|
24
|
+
return await this.httpRequest.delete(url);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
PresenceWebsocketApi = __decorate([
|
|
28
|
+
injectable(),
|
|
29
|
+
__param(0, inject("IHttpRequest")),
|
|
30
|
+
__metadata("design:paramtypes", [Object])
|
|
31
|
+
], PresenceWebsocketApi);
|
|
32
|
+
export { PresenceWebsocketApi };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
|
|
2
|
+
/**
|
|
3
|
+
* Interfaz para el servicio Presence Websocket (presence-websocket).
|
|
4
|
+
*/
|
|
5
|
+
export interface IPresenceWebsocketApi {
|
|
6
|
+
/**
|
|
7
|
+
* Borra en cascada los registros de presencia asociados a un directoryId.
|
|
8
|
+
* @param directoryId ID del directorio.
|
|
9
|
+
* @throws {Error} Lanza un error si los parámetros de entrada son inválidos.
|
|
10
|
+
*/
|
|
11
|
+
deleteByDirectoryId(directoryId: string): Promise<FiadoApiResponse<{
|
|
12
|
+
deletedCount: number;
|
|
13
|
+
}>>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { IHttpRequest } from "@fiado/http-client";
|
|
1
|
+
import type { IHttpRequest } from "@fiado/http-client";
|
|
2
2
|
import { ApiGatewayResponse } from "@fiado/gateway-adapter";
|
|
3
3
|
import { ConnectorCatalogResponse } from "@fiado/type-kit/bin/benefitCenter/index.js";
|
|
4
|
-
import { CreateFundingReferenceRequest, CreateFundingReferenceResponse, ListFundingReferencesResponse, ApplyWalletFundingRequest, ApplyWalletFundingResponse } from "@fiado/type-kit/bin/walletFunding/index.js";
|
|
4
|
+
import { CreateFundingReferenceRequest, CreateFundingReferenceResponse, ListFundingReferencesResponse, ApplyWalletFundingRequest, ApplyWalletFundingResponse, ListFundingStoresRequest, ListFundingStoresResponse, WalletFundingReferenceStatusEnum } from "@fiado/type-kit/bin/walletFunding/index.js";
|
|
5
5
|
import { ISynergyPayConnectorApi } from "./interfaces/ISynergyPayConnectorApi.js";
|
|
6
6
|
export default class SynergyPayConnectorApi implements ISynergyPayConnectorApi {
|
|
7
7
|
private httpRequest;
|
|
@@ -14,5 +14,11 @@ export default class SynergyPayConnectorApi implements ISynergyPayConnectorApi {
|
|
|
14
14
|
includeDisabled?: boolean;
|
|
15
15
|
}): Promise<ApiGatewayResponse<ConnectorCatalogResponse>>;
|
|
16
16
|
applyFunding(request: ApplyWalletFundingRequest): Promise<ApiGatewayResponse<ApplyWalletFundingResponse>>;
|
|
17
|
+
listStores(query: ListFundingStoresRequest): Promise<ApiGatewayResponse<ListFundingStoresResponse>>;
|
|
18
|
+
cancelFundingReference(reference: string, reason?: "USER" | "WALLET_DEACTIVATED" | "OPS"): Promise<ApiGatewayResponse<{
|
|
19
|
+
reference: string;
|
|
20
|
+
status: WalletFundingReferenceStatusEnum;
|
|
21
|
+
cancelled: boolean;
|
|
22
|
+
}>>;
|
|
17
23
|
getPendingFunding(directoryId: string): Promise<ApiGatewayResponse<any>>;
|
|
18
24
|
}
|
|
@@ -39,6 +39,29 @@ let SynergyPayConnectorApi = class SynergyPayConnectorApi {
|
|
|
39
39
|
const url = `${this.baseUrl}/funding/apply`;
|
|
40
40
|
return await this.httpRequest.post(url, request);
|
|
41
41
|
}
|
|
42
|
+
async listStores(query) {
|
|
43
|
+
const params = new URLSearchParams({
|
|
44
|
+
latitude: String(query.latitude),
|
|
45
|
+
longitude: String(query.longitude),
|
|
46
|
+
});
|
|
47
|
+
// `radius` y `product` ausentes se OMITEN: el connector aplica sus
|
|
48
|
+
// defaults (el radio del proveedor y `cashin`). Mandarlos vacios los
|
|
49
|
+
// convertiria en filtros invalidos.
|
|
50
|
+
if (query.radius !== undefined)
|
|
51
|
+
params.set("radius", String(query.radius));
|
|
52
|
+
if (query.product !== undefined)
|
|
53
|
+
params.set("product", query.product);
|
|
54
|
+
const url = `${this.baseUrl}/stores?${params.toString()}`;
|
|
55
|
+
return await this.httpRequest.get(url);
|
|
56
|
+
}
|
|
57
|
+
async cancelFundingReference(reference, reason) {
|
|
58
|
+
const params = new URLSearchParams();
|
|
59
|
+
if (reason)
|
|
60
|
+
params.set("reason", reason);
|
|
61
|
+
const qs = params.toString();
|
|
62
|
+
const url = `${this.baseUrl}/funding/references/${encodeURIComponent(reference)}${qs ? `?${qs}` : ""}`;
|
|
63
|
+
return await this.httpRequest.delete(url);
|
|
64
|
+
}
|
|
42
65
|
async getPendingFunding(directoryId) {
|
|
43
66
|
const url = `${this.baseUrl}/funding/pending?directoryId=${encodeURIComponent(directoryId)}`;
|
|
44
67
|
return await this.httpRequest.get(url);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ApiGatewayResponse } from "@fiado/gateway-adapter";
|
|
2
2
|
import { ConnectorCatalogResponse } from "@fiado/type-kit/bin/benefitCenter/index.js";
|
|
3
|
-
import { CreateFundingReferenceRequest, CreateFundingReferenceResponse, ListFundingReferencesResponse, ApplyWalletFundingRequest, ApplyWalletFundingResponse } from "@fiado/type-kit/bin/walletFunding/index.js";
|
|
3
|
+
import { CreateFundingReferenceRequest, CreateFundingReferenceResponse, ListFundingReferencesResponse, ApplyWalletFundingRequest, ApplyWalletFundingResponse, ListFundingStoresRequest, ListFundingStoresResponse, WalletFundingReferenceStatusEnum } from "@fiado/type-kit/bin/walletFunding/index.js";
|
|
4
4
|
/**
|
|
5
5
|
* Cliente del marketplace hacia synergypay-connector (privado, dentro de la VPC).
|
|
6
6
|
*
|
|
@@ -14,6 +14,8 @@ import { CreateFundingReferenceRequest, CreateFundingReferenceResponse, ListFund
|
|
|
14
14
|
* - GET /funding/references?directoryId=&status=
|
|
15
15
|
* - GET /catalog/standard?benefitId=&includeDisabled=
|
|
16
16
|
* - POST /funding/apply
|
|
17
|
+
* - GET /stores?latitude=&longitude=&radius=&product=
|
|
18
|
+
* - DELETE /funding/references/{reference}?reason=
|
|
17
19
|
*
|
|
18
20
|
* NOTA: los endpoints `/passport/*` del BackOffice (SPEC 1.3) NO están incluidos —
|
|
19
21
|
* el synergypay-connector aún no los expone (F6.1 construyó solo el money-path).
|
|
@@ -42,6 +44,35 @@ export interface ISynergyPayConnectorApi {
|
|
|
42
44
|
* queda para el cierre SETTLED (conciliación bancaria) — mismo contrato canónico.
|
|
43
45
|
*/
|
|
44
46
|
applyFunding(request: ApplyWalletFundingRequest): Promise<ApiGatewayResponse<ApplyWalletFundingResponse>>;
|
|
47
|
+
/**
|
|
48
|
+
* Directorio de tiendas cercanas donde el cliente puede presentar su
|
|
49
|
+
* referencia y entregar el efectivo.
|
|
50
|
+
*
|
|
51
|
+
* Va APARTE de la referencia a proposito: una referencia sirve en cualquier
|
|
52
|
+
* tienda afiliada, asi que el directorio cambia —altas, bajas, horarios,
|
|
53
|
+
* comisiones— sin tocar referencias vivas. El connector filtra por
|
|
54
|
+
* `product=cashin` cuando no se especifica: sin ese filtro, buena parte de
|
|
55
|
+
* las tiendas que devuelve el proveedor no aceptan deposito.
|
|
56
|
+
*/
|
|
57
|
+
listStores(query: ListFundingStoresRequest): Promise<ApiGatewayResponse<ListFundingStoresResponse>>;
|
|
58
|
+
/**
|
|
59
|
+
* Cancela una referencia en el proveedor Y en la tabla del connector, en ese
|
|
60
|
+
* orden.
|
|
61
|
+
*
|
|
62
|
+
* Es la unica palanca que frena el efectivo ANTES de que entre a la caja:
|
|
63
|
+
* rechazar el webhook no alcanza, porque cuando el proveedor llama el cobro
|
|
64
|
+
* ya ocurrio. NO cancelar por fuera (curl directo al proveedor) — las dos
|
|
65
|
+
* mitades quedan desincronizadas y creeriamos que el cliente puede
|
|
66
|
+
* depositar cuando la caja ya no se lo permite.
|
|
67
|
+
*
|
|
68
|
+
* Idempotente: cancelar algo ya cancelado devuelve `cancelled: false`, no
|
|
69
|
+
* un error.
|
|
70
|
+
*/
|
|
71
|
+
cancelFundingReference(reference: string, reason?: "USER" | "WALLET_DEACTIVATED" | "OPS"): Promise<ApiGatewayResponse<{
|
|
72
|
+
reference: string;
|
|
73
|
+
status: WalletFundingReferenceStatusEnum;
|
|
74
|
+
cancelled: boolean;
|
|
75
|
+
}>>;
|
|
45
76
|
/**
|
|
46
77
|
* Cash-in AUTORIZADO pero aun no acreditado del cliente, en el mes en curso.
|
|
47
78
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fiado/api-invoker",
|
|
3
|
-
|
|
3
|
+
"version": "5.35.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.
|
|
37
|
+
"@fiado/type-kit": "^3.329.0",
|
|
38
38
|
"dotenv": "^16.4.7"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { inject, injectable } from "inversify";
|
|
2
|
+
import type { IHttpRequest } from "@fiado/http-client";
|
|
3
|
+
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
4
|
+
import {
|
|
5
|
+
LoanDeviceEnrollRequest,
|
|
6
|
+
LoanDeviceEnrollResponse,
|
|
7
|
+
LoanDeviceEnrollStatusRequest,
|
|
8
|
+
LoanDeviceEnrollStatusResponse,
|
|
9
|
+
LoanDeviceLastSeenRequest,
|
|
10
|
+
LoanDeviceLastSeenResponse,
|
|
11
|
+
LoanDeviceManualLockRequest,
|
|
12
|
+
LoanDeviceManualLockResponse,
|
|
13
|
+
LoanDeviceManualUnlockRequest,
|
|
14
|
+
LoanDeviceManualUnlockResponse,
|
|
15
|
+
LoanDeviceStatusRequest,
|
|
16
|
+
LoanDeviceStatusResponse,
|
|
17
|
+
} from "@fiado/type-kit/bin/loanCredit/index.js";
|
|
18
|
+
import { ILoanCreditDeviceApi } from "./interfaces/ILoanCreditDeviceApi.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Publisher HTTP de los endpoints de dispositivo/MDM del lambda `loan-credit-business`
|
|
22
|
+
* (componente 09 SureKeep F2). Contrato y semántica completos → `ILoanCreditDeviceApi`
|
|
23
|
+
* (tenantId obligatorio, `StandardResponse` → leer `result.data`, granularidad por ítem).
|
|
24
|
+
*
|
|
25
|
+
* Env var requerida en el consumer: `LOAN_CREDIT_BUSINESS_URL`.
|
|
26
|
+
* El template.yml del consumer la setea con:
|
|
27
|
+
*
|
|
28
|
+
* LOAN_CREDIT_BUSINESS_URL: '{{resolve:ssm:loan-credit-business}}'
|
|
29
|
+
*
|
|
30
|
+
* Convención CLAUDE.md global: SSM key = nombre del lambda owner de la URL.
|
|
31
|
+
*/
|
|
32
|
+
@injectable()
|
|
33
|
+
export default class LoanCreditDeviceApi implements ILoanCreditDeviceApi {
|
|
34
|
+
// El buildspec publica la URL en SSM con "/" final — se normaliza para no armar "//private".
|
|
35
|
+
private readonly baseUrl = (process.env.LOAN_CREDIT_BUSINESS_URL || "").replace(/\/+$/, "");
|
|
36
|
+
|
|
37
|
+
constructor(@inject("IHttpRequest") private httpRequest: IHttpRequest) {}
|
|
38
|
+
|
|
39
|
+
async enroll(
|
|
40
|
+
input: LoanDeviceEnrollRequest,
|
|
41
|
+
tenantId: string,
|
|
42
|
+
): Promise<StandardResponse<LoanDeviceEnrollResponse>> {
|
|
43
|
+
const url = `${this.baseUrl}/private/devices/enroll?tenantId=${encodeURIComponent(tenantId)}`;
|
|
44
|
+
return await this.httpRequest.post(url, input);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async getEnrollStatus(
|
|
48
|
+
input: LoanDeviceEnrollStatusRequest,
|
|
49
|
+
tenantId: string,
|
|
50
|
+
): Promise<StandardResponse<LoanDeviceEnrollStatusResponse>> {
|
|
51
|
+
const url = `${this.baseUrl}/private/devices/enroll-status?tenantId=${encodeURIComponent(tenantId)}`;
|
|
52
|
+
return await this.httpRequest.post(url, input);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async getStatus(
|
|
56
|
+
input: LoanDeviceStatusRequest,
|
|
57
|
+
tenantId: string,
|
|
58
|
+
): Promise<StandardResponse<LoanDeviceStatusResponse>> {
|
|
59
|
+
const url = `${this.baseUrl}/private/devices/status?tenantId=${encodeURIComponent(tenantId)}`;
|
|
60
|
+
return await this.httpRequest.post(url, input);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async getLastSeen(
|
|
64
|
+
input: LoanDeviceLastSeenRequest,
|
|
65
|
+
tenantId: string,
|
|
66
|
+
): Promise<StandardResponse<LoanDeviceLastSeenResponse>> {
|
|
67
|
+
const url = `${this.baseUrl}/private/devices/last-seen?tenantId=${encodeURIComponent(tenantId)}`;
|
|
68
|
+
return await this.httpRequest.post(url, input);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async manualLock(
|
|
72
|
+
input: LoanDeviceManualLockRequest,
|
|
73
|
+
tenantId: string,
|
|
74
|
+
): Promise<StandardResponse<LoanDeviceManualLockResponse>> {
|
|
75
|
+
const url = `${this.baseUrl}/private/devices/manual-lock?tenantId=${encodeURIComponent(tenantId)}`;
|
|
76
|
+
return await this.httpRequest.post(url, input);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async manualUnlock(
|
|
80
|
+
input: LoanDeviceManualUnlockRequest,
|
|
81
|
+
tenantId: string,
|
|
82
|
+
): Promise<StandardResponse<LoanDeviceManualUnlockResponse>> {
|
|
83
|
+
const url = `${this.baseUrl}/private/devices/manual-unlock?tenantId=${encodeURIComponent(tenantId)}`;
|
|
84
|
+
return await this.httpRequest.post(url, input);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { StandardResponse } from "@fiado/gateway-adapter";
|
|
2
|
+
import {
|
|
3
|
+
LoanDeviceEnrollRequest,
|
|
4
|
+
LoanDeviceEnrollResponse,
|
|
5
|
+
LoanDeviceEnrollStatusRequest,
|
|
6
|
+
LoanDeviceEnrollStatusResponse,
|
|
7
|
+
LoanDeviceLastSeenRequest,
|
|
8
|
+
LoanDeviceLastSeenResponse,
|
|
9
|
+
LoanDeviceManualLockRequest,
|
|
10
|
+
LoanDeviceManualLockResponse,
|
|
11
|
+
LoanDeviceManualUnlockRequest,
|
|
12
|
+
LoanDeviceManualUnlockResponse,
|
|
13
|
+
LoanDeviceStatusRequest,
|
|
14
|
+
LoanDeviceStatusResponse,
|
|
15
|
+
} from "@fiado/type-kit/bin/loanCredit/index.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Contrato del publisher de dispositivo/MDM de `loan-credit-business` (componente 09 SureKeep F2).
|
|
19
|
+
* Endpoints PRIVADOS (VPC) que envuelven al motor MDM: enrolamiento del equipo, consulta de estado
|
|
20
|
+
* y bloqueo/desbloqueo manual. El contrato de crédito vive en `ILoanCreditBusinessApi`.
|
|
21
|
+
*
|
|
22
|
+
* Convenciones (idénticas a `ILoanCreditBusinessApi`):
|
|
23
|
+
* - `tenantId` OBLIGATORIO en todos los métodos — viaja por query `?tenantId=` (convención de los
|
|
24
|
+
* privados Fiado). Sin él el lambda responde `400 UNKNOWN_TENANT` (fail-closed, nunca default).
|
|
25
|
+
* - Retorna `StandardResponse<T>` → leer `result.data` (NO `result.body`).
|
|
26
|
+
* - Errores de transporte (falla el lambda entero, no un ítem): el publisher RECHAZA con el
|
|
27
|
+
* `DomainError` tipado del motor — `400 UNKNOWN_TENANT` / `400` de validación del body /
|
|
28
|
+
* `5xx` del motor. Nunca fallback: el caller jamás recibe un batch vacío disfrazado de éxito.
|
|
29
|
+
* - Idempotencia: las 3 mutaciones (`enroll`, `manualLock`, `manualUnlock`) son idempotentes por
|
|
30
|
+
* `input.operationReference` — es el idempotencyKey del caller. Reintentar el mismo lote con la
|
|
31
|
+
* misma referencia no vuelve a enrolar ni a bloquear; sin ella un retry tras timeout duplica.
|
|
32
|
+
*
|
|
33
|
+
* Granularidad POR ÍTEM — el batch NUNCA falla entero:
|
|
34
|
+
* - Cada `results[i]` trae su propio `status` (`SUCCESS` | `PENDING` | `ERROR`) y un `error`
|
|
35
|
+
* opcional. Un `StandardResponse` 200 puede traer ítems en `ERROR`: el caller TIENE que recorrer
|
|
36
|
+
* `results` y decidir por ítem — nunca asumir éxito global por el status HTTP.
|
|
37
|
+
* - El `error.code` del ítem es un `MdmErrorCodeEnum` (`PROVIDER_NOT_SUPPORTED`, `DEVICE_NOT_FOUND`,
|
|
38
|
+
* `PROVIDER_TIMEOUT`, …). El `status` del ítem NO lleva el motivo: el motivo vive solo en `error`.
|
|
39
|
+
* - `status: PENDING` = operación asíncrona en vuelo (típico de `enroll`). La resuelve el polling
|
|
40
|
+
* interno del motor; el caller la consulta después con `getEnrollStatus`.
|
|
41
|
+
*
|
|
42
|
+
* Env var requerida en el consumer:
|
|
43
|
+
*
|
|
44
|
+
* LOAN_CREDIT_BUSINESS_URL: '{{resolve:ssm:loan-credit-business}}'
|
|
45
|
+
*/
|
|
46
|
+
export interface ILoanCreditDeviceApi {
|
|
47
|
+
/**
|
|
48
|
+
* Enrola el equipo del crédito en el MDM (paso 09 del wizard). Típicamente devuelve el ítem en
|
|
49
|
+
* `PENDING`: el enrolamiento es asíncrono y se confirma después con `getEnrollStatus`.
|
|
50
|
+
*/
|
|
51
|
+
enroll(
|
|
52
|
+
input: LoanDeviceEnrollRequest,
|
|
53
|
+
tenantId: string,
|
|
54
|
+
): Promise<StandardResponse<LoanDeviceEnrollResponse>>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Consulta en qué punto va el enrolamiento de cada crédito.
|
|
58
|
+
* Es POST y no GET porque el lote de `creditIds` puede traer miles de ids y no caben en la URL.
|
|
59
|
+
*/
|
|
60
|
+
getEnrollStatus(
|
|
61
|
+
input: LoanDeviceEnrollStatusRequest,
|
|
62
|
+
tenantId: string,
|
|
63
|
+
): Promise<StandardResponse<LoanDeviceEnrollStatusResponse>>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Estado actual del dispositivo de cada crédito (bloqueado, libre, sin enrolar).
|
|
67
|
+
* Es POST y no GET porque el lote de `creditIds` puede traer miles de ids y no caben en la URL.
|
|
68
|
+
*/
|
|
69
|
+
getStatus(
|
|
70
|
+
input: LoanDeviceStatusRequest,
|
|
71
|
+
tenantId: string,
|
|
72
|
+
): Promise<StandardResponse<LoanDeviceStatusResponse>>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Último contacto reportado por el dispositivo de cada crédito (señal de vida para cobranza).
|
|
76
|
+
* Es POST y no GET porque el lote de `creditIds` puede traer miles de ids y no caben en la URL.
|
|
77
|
+
*/
|
|
78
|
+
getLastSeen(
|
|
79
|
+
input: LoanDeviceLastSeenRequest,
|
|
80
|
+
tenantId: string,
|
|
81
|
+
): Promise<StandardResponse<LoanDeviceLastSeenResponse>>;
|
|
82
|
+
|
|
83
|
+
/** Bloqueo manual del dispositivo disparado desde el backoffice (acción de un operador). */
|
|
84
|
+
manualLock(
|
|
85
|
+
input: LoanDeviceManualLockRequest,
|
|
86
|
+
tenantId: string,
|
|
87
|
+
): Promise<StandardResponse<LoanDeviceManualLockResponse>>;
|
|
88
|
+
|
|
89
|
+
/** Desbloqueo manual del dispositivo disparado desde el backoffice (acción de un operador). */
|
|
90
|
+
manualUnlock(
|
|
91
|
+
input: LoanDeviceManualUnlockRequest,
|
|
92
|
+
tenantId: string,
|
|
93
|
+
): Promise<StandardResponse<LoanDeviceManualUnlockResponse>>;
|
|
94
|
+
}
|
package/src/loanCredit/index.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export * from "./api/interfaces/ILoanCreditBusinessApi.js";
|
|
2
2
|
export { default as LoanCreditBusinessApi } from "./api/LoanCreditBusinessApi.js";
|
|
3
|
+
|
|
4
|
+
export * from "./api/interfaces/ILoanCreditDeviceApi.js";
|
|
5
|
+
export { default as LoanCreditDeviceApi } from "./api/LoanCreditDeviceApi.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
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 { ApiGatewayResponse } from "@fiado/gateway-adapter";
|
|
4
4
|
import { ConnectorCatalogResponse } from "@fiado/type-kit/bin/benefitCenter/index.js";
|
|
5
5
|
import {
|
|
@@ -8,6 +8,9 @@ import {
|
|
|
8
8
|
ListFundingReferencesResponse,
|
|
9
9
|
ApplyWalletFundingRequest,
|
|
10
10
|
ApplyWalletFundingResponse,
|
|
11
|
+
ListFundingStoresRequest,
|
|
12
|
+
ListFundingStoresResponse,
|
|
13
|
+
WalletFundingReferenceStatusEnum,
|
|
11
14
|
} from "@fiado/type-kit/bin/walletFunding/index.js";
|
|
12
15
|
import { ISynergyPayConnectorApi } from "./interfaces/ISynergyPayConnectorApi.js";
|
|
13
16
|
|
|
@@ -50,6 +53,36 @@ export default class SynergyPayConnectorApi implements ISynergyPayConnectorApi {
|
|
|
50
53
|
return await this.httpRequest.post(url, request);
|
|
51
54
|
}
|
|
52
55
|
|
|
56
|
+
async listStores(
|
|
57
|
+
query: ListFundingStoresRequest,
|
|
58
|
+
): Promise<ApiGatewayResponse<ListFundingStoresResponse>> {
|
|
59
|
+
const params = new URLSearchParams({
|
|
60
|
+
latitude: String(query.latitude),
|
|
61
|
+
longitude: String(query.longitude),
|
|
62
|
+
});
|
|
63
|
+
// `radius` y `product` ausentes se OMITEN: el connector aplica sus
|
|
64
|
+
// defaults (el radio del proveedor y `cashin`). Mandarlos vacios los
|
|
65
|
+
// convertiria en filtros invalidos.
|
|
66
|
+
if (query.radius !== undefined) params.set("radius", String(query.radius));
|
|
67
|
+
if (query.product !== undefined) params.set("product", query.product);
|
|
68
|
+
const url = `${this.baseUrl}/stores?${params.toString()}`;
|
|
69
|
+
return await this.httpRequest.get(url);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async cancelFundingReference(
|
|
73
|
+
reference: string,
|
|
74
|
+
reason?: "USER" | "WALLET_DEACTIVATED" | "OPS",
|
|
75
|
+
): Promise<ApiGatewayResponse<{
|
|
76
|
+
reference: string;
|
|
77
|
+
status: WalletFundingReferenceStatusEnum;
|
|
78
|
+
cancelled: boolean;
|
|
79
|
+
}>> {
|
|
80
|
+
const params = new URLSearchParams();
|
|
81
|
+
if (reason) params.set("reason", reason);
|
|
82
|
+
const qs = params.toString();
|
|
83
|
+
const url = `${this.baseUrl}/funding/references/${encodeURIComponent(reference)}${qs ? `?${qs}` : ""}`;
|
|
84
|
+
return await this.httpRequest.delete(url);
|
|
85
|
+
}
|
|
53
86
|
async getPendingFunding(directoryId: string): Promise<ApiGatewayResponse<any>> {
|
|
54
87
|
const url = `${this.baseUrl}/funding/pending?directoryId=${encodeURIComponent(directoryId)}`;
|
|
55
88
|
return await this.httpRequest.get(url);
|
|
@@ -6,6 +6,9 @@ import {
|
|
|
6
6
|
ListFundingReferencesResponse,
|
|
7
7
|
ApplyWalletFundingRequest,
|
|
8
8
|
ApplyWalletFundingResponse,
|
|
9
|
+
ListFundingStoresRequest,
|
|
10
|
+
ListFundingStoresResponse,
|
|
11
|
+
WalletFundingReferenceStatusEnum,
|
|
9
12
|
} from "@fiado/type-kit/bin/walletFunding/index.js";
|
|
10
13
|
|
|
11
14
|
/**
|
|
@@ -21,6 +24,8 @@ import {
|
|
|
21
24
|
* - GET /funding/references?directoryId=&status=
|
|
22
25
|
* - GET /catalog/standard?benefitId=&includeDisabled=
|
|
23
26
|
* - POST /funding/apply
|
|
27
|
+
* - GET /stores?latitude=&longitude=&radius=&product=
|
|
28
|
+
* - DELETE /funding/references/{reference}?reason=
|
|
24
29
|
*
|
|
25
30
|
* NOTA: los endpoints `/passport/*` del BackOffice (SPEC 1.3) NO están incluidos —
|
|
26
31
|
* el synergypay-connector aún no los expone (F6.1 construyó solo el money-path).
|
|
@@ -58,6 +63,39 @@ export interface ISynergyPayConnectorApi {
|
|
|
58
63
|
applyFunding(
|
|
59
64
|
request: ApplyWalletFundingRequest,
|
|
60
65
|
): Promise<ApiGatewayResponse<ApplyWalletFundingResponse>>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Directorio de tiendas cercanas donde el cliente puede presentar su
|
|
69
|
+
* referencia y entregar el efectivo.
|
|
70
|
+
*
|
|
71
|
+
* Va APARTE de la referencia a proposito: una referencia sirve en cualquier
|
|
72
|
+
* tienda afiliada, asi que el directorio cambia —altas, bajas, horarios,
|
|
73
|
+
* comisiones— sin tocar referencias vivas. El connector filtra por
|
|
74
|
+
* `product=cashin` cuando no se especifica: sin ese filtro, buena parte de
|
|
75
|
+
* las tiendas que devuelve el proveedor no aceptan deposito.
|
|
76
|
+
*/
|
|
77
|
+
listStores(query: ListFundingStoresRequest): Promise<ApiGatewayResponse<ListFundingStoresResponse>>;
|
|
78
|
+
/**
|
|
79
|
+
* Cancela una referencia en el proveedor Y en la tabla del connector, en ese
|
|
80
|
+
* orden.
|
|
81
|
+
*
|
|
82
|
+
* Es la unica palanca que frena el efectivo ANTES de que entre a la caja:
|
|
83
|
+
* rechazar el webhook no alcanza, porque cuando el proveedor llama el cobro
|
|
84
|
+
* ya ocurrio. NO cancelar por fuera (curl directo al proveedor) — las dos
|
|
85
|
+
* mitades quedan desincronizadas y creeriamos que el cliente puede
|
|
86
|
+
* depositar cuando la caja ya no se lo permite.
|
|
87
|
+
*
|
|
88
|
+
* Idempotente: cancelar algo ya cancelado devuelve `cancelled: false`, no
|
|
89
|
+
* un error.
|
|
90
|
+
*/
|
|
91
|
+
cancelFundingReference(
|
|
92
|
+
reference: string,
|
|
93
|
+
reason?: "USER" | "WALLET_DEACTIVATED" | "OPS",
|
|
94
|
+
): Promise<ApiGatewayResponse<{
|
|
95
|
+
reference: string;
|
|
96
|
+
status: WalletFundingReferenceStatusEnum;
|
|
97
|
+
cancelled: boolean;
|
|
98
|
+
}>>;
|
|
61
99
|
/**
|
|
62
100
|
* Cash-in AUTORIZADO pero aun no acreditado del cliente, en el mes en curso.
|
|
63
101
|
*
|