@fiado/api-invoker 5.94.0 → 5.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
- import { IHttpRequest } from "@fiado/http-client";
1
+ import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { IDirectoriesApi } from "./interfaces/IDirectoriesApi.js";
3
3
  import { DirectoryBackofficeResponse, DirectoryBackofficeCreateRequest, DirectoryBackofficeUpdateRequest, TypeOfDirectoryId } from '@fiado/type-kit/bin/directory/index.js';
4
+ import type { DirectoryAgentsBySponsorResponse } from '@fiado/type-kit/bin/directory/index.js';
4
5
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
5
6
  export declare class DirectoriesApi implements IDirectoriesApi {
6
7
  private httpRequest;
@@ -24,5 +25,6 @@ export declare class DirectoriesApi implements IDirectoriesApi {
24
25
  updateBackofficeDirectory(directoryId: string, params: DirectoryBackofficeUpdateRequest & {
25
26
  typeOfDirectoryId?: TypeOfDirectoryId;
26
27
  }): Promise<FiadoApiResponse<DirectoryBackofficeResponse>>;
28
+ getAgentDirectoriesBySponsorDirectoryIds(sponsorDirectoryIds: string[]): Promise<DirectoryAgentsBySponsorResponse>;
27
29
  }
28
30
  export {};
@@ -12,6 +12,9 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import dotenv from 'dotenv';
14
14
  import { inject, injectable } from "inversify";
15
+ import { DIRECTORY_AGENTS_BY_SPONSOR_MAX_BATCH } from '@fiado/type-kit/bin/directory/index.js';
16
+ import { joinUrl } from "../utils/joinUrl.js";
17
+ import { postIdsInBatches } from "../utils/postIdsInBatches.js";
15
18
  dotenv.config();
16
19
  let DirectoriesApi = class DirectoriesApi {
17
20
  httpRequest;
@@ -60,6 +63,10 @@ let DirectoriesApi = class DirectoriesApi {
60
63
  const url = `${this.baseUrl}directories/backoffice/${directoryId}`;
61
64
  return await this.httpRequest.put(url, params);
62
65
  }
66
+ async getAgentDirectoriesBySponsorDirectoryIds(sponsorDirectoryIds) {
67
+ const url = joinUrl(this.baseUrl, "directories/search/by-sponsor-directory-ids");
68
+ return await postIdsInBatches(this.httpRequest, url, "sponsorDirectoryIds", sponsorDirectoryIds, DIRECTORY_AGENTS_BY_SPONSOR_MAX_BATCH);
69
+ }
63
70
  };
64
71
  DirectoriesApi = __decorate([
65
72
  injectable(),
@@ -1,5 +1,6 @@
1
1
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
2
2
  import { DirectoryBackofficeCreateRequest, DirectoryBackofficeResponse, DirectoryBackofficeUpdateRequest, TypeOfDirectoryId } from "@fiado/type-kit/bin/directory/index.js";
3
+ import type { DirectoryAgentsBySponsorResponse } from "@fiado/type-kit/bin/directory/index.js";
3
4
  /**
4
5
  * Interfaz para el servicio Directory que permite operaciones sobre directorios.
5
6
  */
@@ -28,5 +29,10 @@ export interface IDirectoriesApi {
28
29
  * Borra físicamente el directorio de agente (DirectoryAgents_GT) por su sponsorDirectoryId.
29
30
  */
30
31
  deleteAgentBySponsorDirectoryId(sponsorDirectoryId: string): Promise<FiadoApiResponse<any>>;
32
+ /**
33
+ * POST directories/search/by-sponsor-directory-ids: directorio AGENT ganador por sponsor, en lotes de 100.
34
+ * Devuelve el mapa ya desempaquetado de `.data`; lanza el error del http sin fallback.
35
+ */
36
+ getAgentDirectoriesBySponsorDirectoryIds(sponsorDirectoryIds: string[]): Promise<DirectoryAgentsBySponsorResponse>;
31
37
  }
32
38
  export {};
@@ -1,6 +1,7 @@
1
1
  import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { APIGatewayProxyResultBody, ApiGatewayResponse, ResolvedPermissions, ResolveInput } from "@fiado/gateway-adapter";
3
3
  import { DefineNextChallengeRequest, DefineNextChallengeResponse, PrepareChallengeRequest, PrepareChallengeResponse, VerifyChallengeRequest, VerifyChallengeResponse, AuthorizeRequest, AuthorizeResponse, EffectivePermissionsResponse, InjectableUserAttributesResponse, PermissionScope, CreateLevelEntityRequest, CreateLevelEntityResponse, CreateTenantUserRequest, CreateTenantUserResponse, UserProfileResponse, ListLevelEntitiesResponse, LevelEntityResponse, UpdateLevelEntityRequest, DeleteLevelEntityRequest, DeleteLevelEntityResponse, ListTenantUsersResponse, GetTenantUserResponse, TenantUserResponse, TenantUserAckResponse, UpdateTenantUserRequest, DeleteTenantUserRequest, DisableTenantUserRequest, EnableTenantUserRequest, ResetTenantUserPasswordRequest, ResetTenantUserPasswordResponse, ResetTenantUserMfaRequest, ListTenantRolesResponse, AssignTenantRoleRequest, AssignTenantRoleResponse, RevokeTenantRoleRequest, RevokeTenantRoleResponse } from "@fiado/type-kit/bin/platformRbac/index.js";
4
+ import type { TenantUsersBySubsResponse } from "@fiado/type-kit/bin/platformRbac/index.js";
4
5
  import { IPlatformRbacBusinessApi } from "./interfaces/IPlatformRbacBusinessApi.js";
5
6
  /**
6
7
  * Publisher HTTP del lambda `platform-rbac-business` (componente 06 SureKeep Fase 0)
@@ -76,4 +77,6 @@ export default class PlatformRbacBusinessApi implements IPlatformRbacBusinessApi
76
77
  * El `cognitoSub` va en el cuerpo porque es parte de la llave de la tabla de asignaciones.
77
78
  */
78
79
  revokeTenantRole(tenantId: string, assignmentId: string, input: RevokeTenantRoleRequest): Promise<APIGatewayProxyResultBody<RevokeTenantRoleResponse>>;
80
+ /** POST /internal/tenants/{tenantId}/users/by-subs — usuarios del tenant por cognitoSub, en lotes de 100; devuelve el mapa de `.data`. */
81
+ getTenantUsersBySubs(tenantId: string, cognitoSubs: string[]): Promise<TenantUsersBySubsResponse>;
79
82
  }
@@ -11,6 +11,10 @@ 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
+ // TD-AI-003: el tipo de retorno de los métodos viejos no refleja el runtime. Ver docs/TECH_DEBT.md.
15
+ import { TENANT_USERS_BY_SUBS_MAX_BATCH, } from "@fiado/type-kit/bin/platformRbac/index.js";
16
+ import { joinUrl } from "../../utils/joinUrl.js";
17
+ import { postIdsInBatches } from "../../utils/postIdsInBatches.js";
14
18
  /**
15
19
  * Publisher HTTP del lambda `platform-rbac-business` (componente 06 SureKeep Fase 0)
16
20
  * para los 3 endpoints internos del Custom Auth Challenge flow.
@@ -185,6 +189,11 @@ let PlatformRbacBusinessApi = class PlatformRbacBusinessApi {
185
189
  const url = `${this.baseUrl}/internal/tenants/${encodeURIComponent(tenantId)}/role-assignments/${encodeURIComponent(assignmentId)}/revoke`;
186
190
  return await this.httpRequest.post(url, input);
187
191
  }
192
+ /** POST /internal/tenants/{tenantId}/users/by-subs — usuarios del tenant por cognitoSub, en lotes de 100; devuelve el mapa de `.data`. */
193
+ async getTenantUsersBySubs(tenantId, cognitoSubs) {
194
+ const url = joinUrl(this.baseUrl, `internal/tenants/${encodeURIComponent(tenantId)}/users/by-subs`);
195
+ return await postIdsInBatches(this.httpRequest, url, "cognitoSubs", cognitoSubs, TENANT_USERS_BY_SUBS_MAX_BATCH);
196
+ }
188
197
  };
189
198
  PlatformRbacBusinessApi = __decorate([
190
199
  injectable(),
@@ -1,5 +1,6 @@
1
1
  import { APIGatewayProxyResultBody, ApiGatewayResponse, ResolvedPermissions, ResolveInput } from "@fiado/gateway-adapter";
2
2
  import { DefineNextChallengeRequest, DefineNextChallengeResponse, PrepareChallengeRequest, PrepareChallengeResponse, VerifyChallengeRequest, VerifyChallengeResponse, AuthorizeRequest, AuthorizeResponse, EffectivePermissionsResponse, InjectableUserAttributesResponse, PermissionScope, CreateLevelEntityRequest, CreateLevelEntityResponse, CreateTenantUserRequest, CreateTenantUserResponse, UserProfileResponse, ListLevelEntitiesResponse, LevelEntityResponse, UpdateLevelEntityRequest, DeleteLevelEntityRequest, DeleteLevelEntityResponse, ListTenantUsersResponse, GetTenantUserResponse, TenantUserResponse, TenantUserAckResponse, UpdateTenantUserRequest, DeleteTenantUserRequest, DisableTenantUserRequest, EnableTenantUserRequest, ResetTenantUserPasswordRequest, ResetTenantUserPasswordResponse, ResetTenantUserMfaRequest, ListTenantRolesResponse, AssignTenantRoleRequest, AssignTenantRoleResponse, RevokeTenantRoleRequest, RevokeTenantRoleResponse } from "@fiado/type-kit/bin/platformRbac/index.js";
3
+ import type { TenantUsersBySubsResponse } from "@fiado/type-kit/bin/platformRbac/index.js";
3
4
  /**
4
5
  * Contrato del publisher HTTP del lambda `platform-rbac-business` (componente 06 SureKeep Fase 0)
5
6
  * para los 3 endpoints internos del Custom Auth Challenge flow (MFA).
@@ -120,4 +121,9 @@ export interface IPlatformRbacBusinessApi {
120
121
  * El `cognitoSub` va en el cuerpo porque es parte de la llave de la tabla de asignaciones.
121
122
  */
122
123
  revokeTenantRole(tenantId: string, assignmentId: string, input: RevokeTenantRoleRequest): Promise<APIGatewayProxyResultBody<RevokeTenantRoleResponse>>;
124
+ /**
125
+ * POST /internal/tenants/{tenantId}/users/by-subs — usuarios del tenant por cognitoSub, en lotes de 100.
126
+ * Devuelve el mapa ya desempaquetado de `.data`; lanza el error del http sin fallback.
127
+ */
128
+ getTenantUsersBySubs(tenantId: string, cognitoSubs: string[]): Promise<TenantUsersBySubsResponse>;
123
129
  }
@@ -1,7 +1,8 @@
1
- import { IHttpRequest } from "@fiado/http-client";
1
+ import type { IHttpRequest } from "@fiado/http-client";
2
2
  import { IReferralBusinessApi } from "./interfaces/IReferralBusinessApi.js";
3
3
  type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
4
4
  import { Scope } from "@fiado/type-kit/bin/directory/enums/Scope.js";
5
+ import type { AgentsByDirectoryIdsResponse } from "@fiado/type-kit/bin/referral-business/index.js";
5
6
  export declare class ReferralBusinessApi implements IReferralBusinessApi {
6
7
  private httpRequest;
7
8
  private readonly baseUrl;
@@ -22,5 +23,6 @@ export declare class ReferralBusinessApi implements IReferralBusinessApi {
22
23
  getByDirectoryId(directoryId: string): Promise<FiadoApiResponse<any>>;
23
24
  accountOpeningsBySponsor(newDirectoryId: string, scope: Scope): Promise<FiadoApiResponse<any>>;
24
25
  deleteAgent(directoryId: string): Promise<FiadoApiResponse<any>>;
26
+ getAgentsByDirectoryIds(directoryIds: string[]): Promise<AgentsByDirectoryIdsResponse>;
25
27
  }
26
28
  export {};
@@ -12,6 +12,9 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from "inversify";
14
14
  import dotenv from 'dotenv';
15
+ import { AGENTS_BY_DIRECTORY_IDS_MAX_BATCH } from "@fiado/type-kit/bin/referral-business/index.js";
16
+ import { joinUrl } from "../utils/joinUrl.js";
17
+ import { postIdsInBatches } from "../utils/postIdsInBatches.js";
15
18
  dotenv.config();
16
19
  let ReferralBusinessApi = class ReferralBusinessApi {
17
20
  httpRequest;
@@ -39,6 +42,10 @@ let ReferralBusinessApi = class ReferralBusinessApi {
39
42
  const url = `${this.baseUrl}backoffice/agents/directory/${directoryId}`;
40
43
  return await this.httpRequest.delete(url);
41
44
  }
45
+ async getAgentsByDirectoryIds(directoryIds) {
46
+ const url = joinUrl(this.baseUrl, "private/agents/by-directory-ids");
47
+ return await postIdsInBatches(this.httpRequest, url, "directoryIds", directoryIds, AGENTS_BY_DIRECTORY_IDS_MAX_BATCH);
48
+ }
42
49
  };
43
50
  ReferralBusinessApi = __decorate([
44
51
  injectable(),
@@ -1,5 +1,6 @@
1
1
  type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
2
2
  import { Scope } from "@fiado/type-kit/bin/directory/enums/Scope.js";
3
+ import type { AgentsByDirectoryIdsResponse } from "@fiado/type-kit/bin/referral-business/index.js";
3
4
  /**
4
5
  * Interfaz para el servicio Payroll que permite operaciones sobre payroll.
5
6
  */
@@ -46,5 +47,10 @@ export interface IReferralBusinessApi {
46
47
  * @throws {Error} Lanza un error si los parámetros de entrada son inválidos.
47
48
  */
48
49
  deleteAgent(directoryId: string): Promise<FiadoApiResponse<any>>;
50
+ /**
51
+ * POST private/agents/by-directory-ids: fila ganadora de Agents_GT por directorio, en lotes de 100.
52
+ * Devuelve el mapa ya desempaquetado de `.data`; lanza el error del http sin fallback.
53
+ */
54
+ getAgentsByDirectoryIds(directoryIds: string[]): Promise<AgentsByDirectoryIdsResponse>;
49
55
  }
50
56
  export {};
@@ -0,0 +1,2 @@
1
+ import type { IHttpRequest } from "@fiado/http-client";
2
+ export declare function postIdsInBatches<TItem>(httpRequest: IHttpRequest, url: string, bodyKey: string, ids: string[], maxBatch: number): Promise<Record<string, TItem>>;
@@ -0,0 +1,22 @@
1
+ // Deduplica y descarta ids vacíos, hace un POST por lote de `maxBatch` y fusiona los mapas de `.data`.
2
+ // Lista vacía devuelve {} sin llamar; un error del http se propaga sin fallback.
3
+ export async function postIdsInBatches(httpRequest, url, bodyKey, ids, maxBatch) {
4
+ const uniqueIds = Array.from(new Set(ids.filter((id) => typeof id === "string" && id.length > 0)));
5
+ const merged = {};
6
+ for (let i = 0; i < uniqueIds.length; i += maxBatch) {
7
+ const batch = uniqueIds.slice(i, i + maxBatch);
8
+ const response = await httpRequest.post(url, { [bodyKey]: batch });
9
+ Object.assign(merged, unwrapBatchMap(response, url));
10
+ }
11
+ return merged;
12
+ }
13
+ // Sin `.data` es un lote sin resultados; un `.data` que no es mapa es un error del contrato.
14
+ function unwrapBatchMap(response, url) {
15
+ const data = response?.data;
16
+ if (data === undefined || data === null)
17
+ return {};
18
+ if (typeof data !== "object" || Array.isArray(data)) {
19
+ throw new Error(`La respuesta batch de ${url} no trae un mapa en .data`);
20
+ }
21
+ return data;
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "5.94.0",
3
+ "version": "5.96.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.465.0",
37
+ "@fiado/type-kit": "^3.468.0",
38
38
  "dotenv": "^16.4.7"
39
39
  },
40
40
  "peerDependencies": {
@@ -1,8 +1,11 @@
1
1
  import dotenv from 'dotenv';
2
2
  import { inject, injectable } from "inversify";
3
- import { IHttpRequest } from "@fiado/http-client";
3
+ import type { IHttpRequest } from "@fiado/http-client";
4
4
  import { IDirectoriesApi } from "./interfaces/IDirectoriesApi.js";
5
- import { DirectoryBackofficeResponse, DirectoryBackofficeCreateRequest, DirectoryBackofficeUpdateRequest, TypeOfDirectoryId } from '@fiado/type-kit/bin/directory/index.js';
5
+ import { DirectoryBackofficeResponse, DirectoryBackofficeCreateRequest, DirectoryBackofficeUpdateRequest, TypeOfDirectoryId, DIRECTORY_AGENTS_BY_SPONSOR_MAX_BATCH } from '@fiado/type-kit/bin/directory/index.js';
6
+ import type { DirectoryAgentBySponsorItem, DirectoryAgentsBySponsorResponse } from '@fiado/type-kit/bin/directory/index.js';
7
+ import { joinUrl } from "../utils/joinUrl.js";
8
+ import { postIdsInBatches } from "../utils/postIdsInBatches.js";
6
9
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
7
10
  dotenv.config();
8
11
 
@@ -65,4 +68,11 @@ export class DirectoriesApi implements IDirectoriesApi {
65
68
  const url: string = `${this.baseUrl}directories/backoffice/${directoryId}`;
66
69
  return await this.httpRequest.put(url, params);
67
70
  }
71
+
72
+ async getAgentDirectoriesBySponsorDirectoryIds(sponsorDirectoryIds: string[]): Promise<DirectoryAgentsBySponsorResponse> {
73
+ const url = joinUrl(this.baseUrl, "directories/search/by-sponsor-directory-ids");
74
+ return await postIdsInBatches<DirectoryAgentBySponsorItem>(
75
+ this.httpRequest, url, "sponsorDirectoryIds", sponsorDirectoryIds, DIRECTORY_AGENTS_BY_SPONSOR_MAX_BATCH,
76
+ );
77
+ }
68
78
  }
@@ -1,5 +1,6 @@
1
1
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
2
2
  import { DirectoryBackofficeCreateRequest, DirectoryBackofficeResponse, DirectoryBackofficeUpdateRequest, TypeOfDirectoryId } from "@fiado/type-kit/bin/directory/index.js";
3
+ import type { DirectoryAgentsBySponsorResponse } from "@fiado/type-kit/bin/directory/index.js";
3
4
 
4
5
  /**
5
6
  * Interfaz para el servicio Directory que permite operaciones sobre directorios.
@@ -18,4 +19,9 @@ export interface IDirectoriesApi {
18
19
  * Borra físicamente el directorio de agente (DirectoryAgents_GT) por su sponsorDirectoryId.
19
20
  */
20
21
  deleteAgentBySponsorDirectoryId(sponsorDirectoryId: string): Promise<FiadoApiResponse<any>>;
22
+ /**
23
+ * POST directories/search/by-sponsor-directory-ids: directorio AGENT ganador por sponsor, en lotes de 100.
24
+ * Devuelve el mapa ya desempaquetado de `.data`; lanza el error del http sin fallback.
25
+ */
26
+ getAgentDirectoriesBySponsorDirectoryIds(sponsorDirectoryIds: string[]): Promise<DirectoryAgentsBySponsorResponse>;
21
27
  }
@@ -45,8 +45,12 @@ import {
45
45
  AssignTenantRoleResponse,
46
46
  RevokeTenantRoleRequest,
47
47
  RevokeTenantRoleResponse,
48
+ TENANT_USERS_BY_SUBS_MAX_BATCH,
48
49
  } from "@fiado/type-kit/bin/platformRbac/index.js";
50
+ import type { TenantUserBySubItem, TenantUsersBySubsResponse } from "@fiado/type-kit/bin/platformRbac/index.js";
49
51
  import { IPlatformRbacBusinessApi } from "./interfaces/IPlatformRbacBusinessApi.js";
52
+ import { joinUrl } from "../../utils/joinUrl.js";
53
+ import { postIdsInBatches } from "../../utils/postIdsInBatches.js";
50
54
 
51
55
  /**
52
56
  * Publisher HTTP del lambda `platform-rbac-business` (componente 06 SureKeep Fase 0)
@@ -333,4 +337,12 @@ export default class PlatformRbacBusinessApi implements IPlatformRbacBusinessApi
333
337
  const url = `${this.baseUrl}/internal/tenants/${encodeURIComponent(tenantId)}/role-assignments/${encodeURIComponent(assignmentId)}/revoke`;
334
338
  return await this.httpRequest.post(url, input);
335
339
  }
340
+
341
+ /** POST /internal/tenants/{tenantId}/users/by-subs — usuarios del tenant por cognitoSub, en lotes de 100; devuelve el mapa de `.data`. */
342
+ async getTenantUsersBySubs(tenantId: string, cognitoSubs: string[]): Promise<TenantUsersBySubsResponse> {
343
+ const url = joinUrl(this.baseUrl, `internal/tenants/${encodeURIComponent(tenantId)}/users/by-subs`);
344
+ return await postIdsInBatches<TenantUserBySubItem>(
345
+ this.httpRequest, url, "cognitoSubs", cognitoSubs, TENANT_USERS_BY_SUBS_MAX_BATCH,
346
+ );
347
+ }
336
348
  }
@@ -43,6 +43,7 @@ import {
43
43
  RevokeTenantRoleRequest,
44
44
  RevokeTenantRoleResponse,
45
45
  } from "@fiado/type-kit/bin/platformRbac/index.js";
46
+ import type { TenantUsersBySubsResponse } from "@fiado/type-kit/bin/platformRbac/index.js";
46
47
 
47
48
  /**
48
49
  * Contrato del publisher HTTP del lambda `platform-rbac-business` (componente 06 SureKeep Fase 0)
@@ -273,4 +274,10 @@ export interface IPlatformRbacBusinessApi {
273
274
  assignmentId: string,
274
275
  input: RevokeTenantRoleRequest,
275
276
  ): Promise<APIGatewayProxyResultBody<RevokeTenantRoleResponse>>;
277
+
278
+ /**
279
+ * POST /internal/tenants/{tenantId}/users/by-subs — usuarios del tenant por cognitoSub, en lotes de 100.
280
+ * Devuelve el mapa ya desempaquetado de `.data`; lanza el error del http sin fallback.
281
+ */
282
+ getTenantUsersBySubs(tenantId: string, cognitoSubs: string[]): Promise<TenantUsersBySubsResponse>;
276
283
  }
@@ -1,9 +1,13 @@
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 dotenv from 'dotenv';
4
4
  import { IReferralBusinessApi } from "./interfaces/IReferralBusinessApi.js";
5
5
  type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
6
6
  import { Scope } from "@fiado/type-kit/bin/directory/enums/Scope.js";
7
+ import { AGENTS_BY_DIRECTORY_IDS_MAX_BATCH } from "@fiado/type-kit/bin/referral-business/index.js";
8
+ import type { AgentByDirectoryIdItem, AgentsByDirectoryIdsResponse } from "@fiado/type-kit/bin/referral-business/index.js";
9
+ import { joinUrl } from "../utils/joinUrl.js";
10
+ import { postIdsInBatches } from "../utils/postIdsInBatches.js";
7
11
 
8
12
  dotenv.config();
9
13
 
@@ -40,4 +44,11 @@ export class ReferralBusinessApi implements IReferralBusinessApi {
40
44
  const url = `${this.baseUrl}backoffice/agents/directory/${directoryId}`;
41
45
  return await this.httpRequest.delete(url);
42
46
  }
47
+
48
+ async getAgentsByDirectoryIds(directoryIds: string[]): Promise<AgentsByDirectoryIdsResponse> {
49
+ const url = joinUrl(this.baseUrl, "private/agents/by-directory-ids");
50
+ return await postIdsInBatches<AgentByDirectoryIdItem>(
51
+ this.httpRequest, url, "directoryIds", directoryIds, AGENTS_BY_DIRECTORY_IDS_MAX_BATCH,
52
+ );
53
+ }
43
54
  }
@@ -1,5 +1,6 @@
1
1
  type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
2
2
  import { Scope } from "@fiado/type-kit/bin/directory/enums/Scope.js";
3
+ import type { AgentsByDirectoryIdsResponse } from "@fiado/type-kit/bin/referral-business/index.js";
3
4
 
4
5
  /**
5
6
  * Interfaz para el servicio Payroll que permite operaciones sobre payroll.
@@ -42,4 +43,10 @@ export interface IReferralBusinessApi {
42
43
  * @throws {Error} Lanza un error si los parámetros de entrada son inválidos.
43
44
  */
44
45
  deleteAgent(directoryId: string): Promise<FiadoApiResponse<any>>;
46
+
47
+ /**
48
+ * POST private/agents/by-directory-ids: fila ganadora de Agents_GT por directorio, en lotes de 100.
49
+ * Devuelve el mapa ya desempaquetado de `.data`; lanza el error del http sin fallback.
50
+ */
51
+ getAgentsByDirectoryIds(directoryIds: string[]): Promise<AgentsByDirectoryIdsResponse>;
45
52
  }
@@ -0,0 +1,40 @@
1
+ import type { IHttpRequest } from "@fiado/http-client";
2
+
3
+ // Envelope Fiado de las respuestas batch: el mapa viaja en `.data`.
4
+ interface BatchMapEnvelope<TItem> {
5
+ data?: Record<string, TItem> | null;
6
+ }
7
+
8
+ // Deduplica y descarta ids vacíos, hace un POST por lote de `maxBatch` y fusiona los mapas de `.data`.
9
+ // Lista vacía devuelve {} sin llamar; un error del http se propaga sin fallback.
10
+ export async function postIdsInBatches<TItem>(
11
+ httpRequest: IHttpRequest,
12
+ url: string,
13
+ bodyKey: string,
14
+ ids: string[],
15
+ maxBatch: number,
16
+ ): Promise<Record<string, TItem>> {
17
+ const uniqueIds = Array.from(new Set(ids.filter((id) => typeof id === "string" && id.length > 0)));
18
+ const merged: Record<string, TItem> = {};
19
+
20
+ for (let i = 0; i < uniqueIds.length; i += maxBatch) {
21
+ const batch = uniqueIds.slice(i, i + maxBatch);
22
+ const response = await httpRequest.post<BatchMapEnvelope<TItem>>(url, { [bodyKey]: batch });
23
+ Object.assign(merged, unwrapBatchMap(response, url));
24
+ }
25
+
26
+ return merged;
27
+ }
28
+
29
+ // Sin `.data` es un lote sin resultados; un `.data` que no es mapa es un error del contrato.
30
+ function unwrapBatchMap<TItem>(
31
+ response: BatchMapEnvelope<TItem> | null | undefined,
32
+ url: string,
33
+ ): Record<string, TItem> {
34
+ const data = response?.data;
35
+ if (data === undefined || data === null) return {};
36
+ if (typeof data !== "object" || Array.isArray(data)) {
37
+ throw new Error(`La respuesta batch de ${url} no trae un mapa en .data`);
38
+ }
39
+ return data;
40
+ }