@fiado/api-invoker 5.76.0 → 5.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/bin/container.config.js +5 -0
  2. package/bin/index.d.ts +1 -0
  3. package/bin/index.js +1 -0
  4. package/bin/messages-business/api/MessagesBusinessApi.d.ts +1 -2
  5. package/bin/messages-business/api/MessagesBusinessApi.js +0 -3
  6. package/bin/messages-business/api/interfaces/IMessagesBusinessApi.d.ts +1 -13
  7. package/bin/messages-business/queue/MessagesBusinessPublisher.d.ts +4 -1
  8. package/bin/messages-business/queue/MessagesBusinessPublisher.js +10 -2
  9. package/bin/messages-business/queue/interfaces/IMessagesBusinessPublisher.d.ts +6 -1
  10. package/bin/whatsapp-connector/api/WhatsappConnectorApi.d.ts +11 -0
  11. package/bin/whatsapp-connector/api/WhatsappConnectorApi.js +31 -0
  12. package/bin/whatsapp-connector/api/interfaces/IWhatsappConnectorApi.d.ts +10 -0
  13. package/bin/whatsapp-connector/api/interfaces/IWhatsappConnectorApi.js +1 -0
  14. package/bin/whatsapp-connector/index.d.ts +2 -0
  15. package/bin/whatsapp-connector/index.js +2 -0
  16. package/package.json +2 -2
  17. package/src/container.config.ts +6 -0
  18. package/src/index.ts +1 -0
  19. package/src/messages-business/api/MessagesBusinessApi.ts +0 -5
  20. package/src/messages-business/api/interfaces/IMessagesBusinessApi.ts +0 -14
  21. package/src/messages-business/queue/MessagesBusinessPublisher.ts +18 -3
  22. package/src/messages-business/queue/interfaces/IMessagesBusinessPublisher.ts +10 -1
  23. package/src/whatsapp-connector/api/WhatsappConnectorApi.ts +19 -0
  24. package/src/whatsapp-connector/api/interfaces/IWhatsappConnectorApi.ts +11 -0
  25. package/src/whatsapp-connector/index.ts +2 -0
@@ -124,6 +124,8 @@ import { WalletFundingRulesApi } from "./wallet-funding-rules/index.js";
124
124
  import { SnsSesConnectorApi } from "./sns-ses-connector/index.js";
125
125
  // Twilio connector — envío WhatsApp/SMS por Twilio (lee TWILIO_CONNECTOR_LAMBDA_URL)
126
126
  import { TwilioConnectorApi } from "./twilio-connector/index.js";
127
+ // Whatsapp connector — envío WhatsApp por Meta (lee WHATSAPP_CONNECTOR_LAMBDA_URL)
128
+ import { WhatsappConnectorApi } from "./whatsapp-connector/index.js";
127
129
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
128
130
  import { RemittanceBusinessApi } from "./remittance-business/index.js";
129
131
  import { BeneficiaryApi } from "./beneficiary/index.js";
@@ -274,6 +276,9 @@ export const apiInvokerBindings = new ContainerModule(({ bind }) => {
274
276
  // Twilio connector — envío WhatsApp/SMS por Twilio, elegido por el `provider` del senderConfig.
275
277
  // El consumidor necesita TWILIO_CONNECTOR_LAMBDA_URL desde el SSM `fiado-twilio-connector`.
276
278
  bind("ITwilioConnectorApi").to(TwilioConnectorApi);
279
+ // Whatsapp connector — envío WhatsApp por Meta, elegido por el `provider` del senderConfig.
280
+ // El consumidor necesita WHATSAPP_CONNECTOR_LAMBDA_URL desde el SSM `whatsapp-connector`.
281
+ bind("IWhatsappConnectorApi").to(WhatsappConnectorApi);
277
282
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
278
283
  bind("IRemittanceBusinessApi").to(RemittanceBusinessApi);
279
284
  // Borrado en cascada del directorio — deleteByDirectoryId por dominio
package/bin/index.d.ts CHANGED
@@ -104,6 +104,7 @@ export * from "./walletFundingSettlement/index.js";
104
104
  export * from "./wallet-funding-rules/index.js";
105
105
  export * from "./sns-ses-connector/index.js";
106
106
  export * from "./twilio-connector/index.js";
107
+ export * from "./whatsapp-connector/index.js";
107
108
  export * from "./remittance-business/index.js";
108
109
  export * from "./modelias-connector/index.js";
109
110
  export * from "./beneficiary/index.js";
package/bin/index.js CHANGED
@@ -104,6 +104,7 @@ export * from "./walletFundingSettlement/index.js";
104
104
  export * from "./wallet-funding-rules/index.js";
105
105
  export * from "./sns-ses-connector/index.js";
106
106
  export * from "./twilio-connector/index.js";
107
+ export * from "./whatsapp-connector/index.js";
107
108
  export * from "./remittance-business/index.js";
108
109
  export * from "./modelias-connector/index.js";
109
110
  export * from "./beneficiary/index.js";
@@ -1,6 +1,6 @@
1
1
  import type { IHttpRequest } from '@fiado/http-client';
2
2
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
3
- import { SendMessageRequest, SendMessageResponse, VerifyOtpRequest, VerifyOtpResponse, OtpValidatedResponse, TemplateMessageCreateRequest, TemplateMessageUpdateRequest, TemplateMessageResponse, TemplateMessageListResponse, TemplateMessageListFiltersRequest, MdmNotifyRequest, MdmNotifyBatchResponse } from '@fiado/type-kit/bin/messagesConnector/index.js';
3
+ import { SendMessageRequest, SendMessageResponse, VerifyOtpRequest, VerifyOtpResponse, OtpValidatedResponse, TemplateMessageCreateRequest, TemplateMessageUpdateRequest, TemplateMessageResponse, TemplateMessageListResponse, TemplateMessageListFiltersRequest } from '@fiado/type-kit/bin/messagesConnector/index.js';
4
4
  import { IMessagesBusinessApi } from './interfaces/IMessagesBusinessApi.js';
5
5
  export declare class MessagesBusinessApi implements IMessagesBusinessApi {
6
6
  private readonly httpRequest;
@@ -9,7 +9,6 @@ export declare class MessagesBusinessApi implements IMessagesBusinessApi {
9
9
  sendMessage(request: SendMessageRequest): Promise<FiadoApiResponse<SendMessageResponse>>;
10
10
  verifyOtp(request: VerifyOtpRequest): Promise<FiadoApiResponse<VerifyOtpResponse>>;
11
11
  getValidatedOtp(directoryId: string, otpCode: string): Promise<FiadoApiResponse<OtpValidatedResponse>>;
12
- notifyMdmDevices(request: MdmNotifyRequest): Promise<FiadoApiResponse<MdmNotifyBatchResponse>>;
13
12
  createTemplate(tenantId: string, request: TemplateMessageCreateRequest): Promise<FiadoApiResponse<TemplateMessageResponse>>;
14
13
  listTemplates(tenantId: string, filters: TemplateMessageListFiltersRequest): Promise<FiadoApiResponse<TemplateMessageListResponse>>;
15
14
  getTemplate(tenantId: string, id: string): Promise<FiadoApiResponse<TemplateMessageResponse>>;
@@ -29,9 +29,6 @@ let MessagesBusinessApi = class MessagesBusinessApi {
29
29
  async getValidatedOtp(directoryId, otpCode) {
30
30
  return await this.httpRequest.get(`${this.baseUrl}messages/otp/validated`, { directoryId, otpCode }, { 'operationName': 'privateGetValidatedOtp' });
31
31
  }
32
- async notifyMdmDevices(request) {
33
- return await this.httpRequest.post(joinUrl(this.baseUrl, 'messages/mdm-notify'), request, { 'operationName': 'privateNotifyMdmDevices' });
34
- }
35
32
  async createTemplate(tenantId, request) {
36
33
  const url = this.withTenantId(joinUrl(this.baseUrl, 'templates'), tenantId);
37
34
  return await this.httpRequest.post(url, request, { 'operationName': 'backofficeCreateTemplate' });
@@ -1,21 +1,9 @@
1
1
  type FiadoApiResponse<T> = import('@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js').default<T>;
2
- import { SendMessageRequest, SendMessageResponse, VerifyOtpRequest, VerifyOtpResponse, OtpValidatedResponse, TemplateMessageCreateRequest, TemplateMessageUpdateRequest, TemplateMessageResponse, TemplateMessageListResponse, TemplateMessageListFiltersRequest, MdmNotifyRequest, MdmNotifyBatchResponse } from '@fiado/type-kit/bin/messagesConnector/index.js';
2
+ import { SendMessageRequest, SendMessageResponse, VerifyOtpRequest, VerifyOtpResponse, OtpValidatedResponse, TemplateMessageCreateRequest, TemplateMessageUpdateRequest, TemplateMessageResponse, TemplateMessageListResponse, TemplateMessageListFiltersRequest } from '@fiado/type-kit/bin/messagesConnector/index.js';
3
3
  export interface IMessagesBusinessApi {
4
4
  sendMessage(request: SendMessageRequest): Promise<FiadoApiResponse<SendMessageResponse>>;
5
5
  verifyOtp(request: VerifyOtpRequest): Promise<FiadoApiResponse<VerifyOtpResponse>>;
6
6
  getValidatedOtp(directoryId: string, otpCode: string): Promise<FiadoApiResponse<OtpValidatedResponse>>;
7
- /**
8
- * Avisa en la pantalla del equipo financiado. Puerta aparte del lote a proposito: el item
9
- * lleva IMEI y proveedor en vez de destinatario y variables.
10
- *
11
- * Mensajeria resuelve el texto del `noticeType` contra el catalogo, agrupa por proveedor y
12
- * hace UN `notifyDevices()` por grupo. Responde 202 con un resultado por IMEI; el proveedor
13
- * caido llega como ERROR de ese item, nunca como dato invalido.
14
- *
15
- * Los mensajes normales NO entran por aqui ni por HTTP: se encolan con
16
- * `IMessagesBusinessPublisher`, y `referenceMessageId` es su llave de idempotencia.
17
- */
18
- notifyMdmDevices(request: MdmNotifyRequest): Promise<FiadoApiResponse<MdmNotifyBatchResponse>>;
19
7
  /**
20
8
  * CRUD de plantillas. Los cinco viven en la API privada sin authorizer, asi que el `tenantId`
21
9
  * es obligatorio y explicito: el lambda responde 400 TENANT_ID_REQUIRED si no llega.
@@ -1,7 +1,10 @@
1
- import { NotificationQueueMessageRequestV2 } from '@fiado/type-kit/bin/messagesConnector/index.js';
1
+ import { MdmNotifyQueueMessageRequest, NotificationQueueMessageRequestV2 } from '@fiado/type-kit/bin/messagesConnector/index.js';
2
2
  import { IMessagesBusinessPublisher } from './interfaces/IMessagesBusinessPublisher.js';
3
3
  export default class MessagesBusinessPublisher implements IMessagesBusinessPublisher {
4
4
  private readonly queueUrl;
5
5
  private readonly sqsClient;
6
6
  publish(message: NotificationQueueMessageRequestV2): Promise<void>;
7
+ publishMdmNotifyBatch(message: MdmNotifyQueueMessageRequest): Promise<void>;
8
+ /** Encola el mensaje serializado y deja el rastro de la operacion que lo publico. */
9
+ private send;
7
10
  }
@@ -11,13 +11,21 @@ let MessagesBusinessPublisher = class MessagesBusinessPublisher {
11
11
  queueUrl = process.env.MESSAGES_BUSINESS_QUEUE_URL;
12
12
  sqsClient = new SQSClient({ region: process.env.AWS_REGION });
13
13
  async publish(message) {
14
+ await this.send('publish', message);
15
+ }
16
+ // El lote MDM viaja por la misma cola que el mensaje suelto; lo distingue su forma, no el destino.
17
+ async publishMdmNotifyBatch(message) {
18
+ await this.send('publishMdmNotifyBatch', message);
19
+ }
20
+ /** Encola el mensaje serializado y deja el rastro de la operacion que lo publico. */
21
+ async send(operation, message) {
14
22
  const t0 = Date.now();
15
23
  try {
16
24
  const result = await this.sqsClient.send(new SendMessageCommand({
17
25
  QueueUrl: this.queueUrl,
18
26
  MessageBody: JSON.stringify(message),
19
27
  }));
20
- log.info('MessagesBusinessPublisher.publish ok', {
28
+ log.info(`MessagesBusinessPublisher.${operation} ok`, {
21
29
  messageId: result.MessageId,
22
30
  latencyMs: Date.now() - t0,
23
31
  });
@@ -25,7 +33,7 @@ let MessagesBusinessPublisher = class MessagesBusinessPublisher {
25
33
  catch (error) {
26
34
  // Propaga el error crudo del SQSClient (NO envolver en new Error(string) = antipatron).
27
35
  // Log de contexto + re-throw para que el caller decida.
28
- log.error('MessagesBusinessPublisher.publish failed', {
36
+ log.error(`MessagesBusinessPublisher.${operation} failed`, {
29
37
  latencyMs: Date.now() - t0,
30
38
  errorName: error?.name,
31
39
  });
@@ -1,4 +1,9 @@
1
- import { NotificationQueueMessageRequestV2 } from '@fiado/type-kit/bin/messagesConnector/index.js';
1
+ import { MdmNotifyQueueMessageRequest, NotificationQueueMessageRequestV2 } from '@fiado/type-kit/bin/messagesConnector/index.js';
2
2
  export interface IMessagesBusinessPublisher {
3
3
  publish(message: NotificationQueueMessageRequestV2): Promise<void>;
4
+ /**
5
+ * Encola el lote de avisos MDM que se muestran en la pantalla del equipo financiado.
6
+ * Reemplaza al `POST /private/messages/mdm-notify`, que se retira.
7
+ */
8
+ publishMdmNotifyBatch(message: MdmNotifyQueueMessageRequest): Promise<void>;
4
9
  }
@@ -0,0 +1,11 @@
1
+ import type { IHttpRequest } from "@fiado/http-client";
2
+ import { ConnectorSendMessageRequest, ConnectorSendMessageResponse } from "@fiado/type-kit/bin/whatsappConnector/index.js";
3
+ import { IWhatsappConnectorApi } from "./interfaces/IWhatsappConnectorApi.js";
4
+ type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
5
+ export default class WhatsappConnectorApi implements IWhatsappConnectorApi {
6
+ private httpRequest;
7
+ private readonly baseUrl;
8
+ constructor(httpRequest: IHttpRequest);
9
+ send(request: ConnectorSendMessageRequest): Promise<FiadoApiResponse<ConnectorSendMessageResponse>>;
10
+ }
11
+ export {};
@@ -0,0 +1,31 @@
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 { joinUrl } from "../../utils/joinUrl.js";
15
+ let WhatsappConnectorApi = class WhatsappConnectorApi {
16
+ httpRequest;
17
+ baseUrl = process.env.WHATSAPP_CONNECTOR_LAMBDA_URL || "";
18
+ constructor(httpRequest) {
19
+ this.httpRequest = httpRequest;
20
+ }
21
+ async send(request) {
22
+ const url = joinUrl(this.baseUrl, "messages/send");
23
+ return await this.httpRequest.post(url, request, { operationName: "privateSendMessage" });
24
+ }
25
+ };
26
+ WhatsappConnectorApi = __decorate([
27
+ injectable(),
28
+ __param(0, inject("IHttpRequest")),
29
+ __metadata("design:paramtypes", [Object])
30
+ ], WhatsappConnectorApi);
31
+ export default WhatsappConnectorApi;
@@ -0,0 +1,10 @@
1
+ import { ConnectorSendMessageRequest, ConnectorSendMessageResponse } from "@fiado/type-kit/bin/whatsappConnector/index.js";
2
+ type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
3
+ export interface IWhatsappConnectorApi {
4
+ /**
5
+ * Envía un mensaje ya resuelto al whatsapp-connector (POST /messages/send).
6
+ * messages-business resuelve plantilla y proveedor; el connector solo transmite a Meta.
7
+ */
8
+ send(request: ConnectorSendMessageRequest): Promise<FiadoApiResponse<ConnectorSendMessageResponse>>;
9
+ }
10
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from "./api/interfaces/IWhatsappConnectorApi.js";
2
+ export { default as WhatsappConnectorApi } from "./api/WhatsappConnectorApi.js";
@@ -0,0 +1,2 @@
1
+ export * from "./api/interfaces/IWhatsappConnectorApi.js";
2
+ export { default as WhatsappConnectorApi } from "./api/WhatsappConnectorApi.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/api-invoker",
3
- "version": "5.76.0",
3
+ "version": "5.78.0",
4
4
  "description": "Sirve como un puente entre diferentes funciones lambda, facilitando la comunicación entre ellas a través de invocaciones http",
5
5
  "type": "module",
6
6
  "main": "bin/index.js",
@@ -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.418.0",
37
+ "@fiado/type-kit": "^3.422.0",
38
38
  "dotenv": "^16.4.7"
39
39
  },
40
40
  "peerDependencies": {
@@ -189,6 +189,8 @@ import { IWalletFundingRulesApi, WalletFundingRulesApi } from "./wallet-funding-
189
189
  import { ISnsSesConnectorApi, SnsSesConnectorApi } from "./sns-ses-connector/index.js";
190
190
  // Twilio connector — envío WhatsApp/SMS por Twilio (lee TWILIO_CONNECTOR_LAMBDA_URL)
191
191
  import { ITwilioConnectorApi, TwilioConnectorApi } from "./twilio-connector/index.js";
192
+ // Whatsapp connector — envío WhatsApp por Meta (lee WHATSAPP_CONNECTOR_LAMBDA_URL)
193
+ import { IWhatsappConnectorApi, WhatsappConnectorApi } from "./whatsapp-connector/index.js";
192
194
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
193
195
  import { IRemittanceBusinessApi, RemittanceBusinessApi } from "./remittance-business/index.js";
194
196
  import { IBeneficiaryApi, BeneficiaryApi } from "./beneficiary/index.js";
@@ -366,6 +368,10 @@ export const apiInvokerBindings = new ContainerModule(({ bind }) => {
366
368
  // El consumidor necesita TWILIO_CONNECTOR_LAMBDA_URL desde el SSM `fiado-twilio-connector`.
367
369
  bind<ITwilioConnectorApi>("ITwilioConnectorApi").to(TwilioConnectorApi);
368
370
 
371
+ // Whatsapp connector — envío WhatsApp por Meta, elegido por el `provider` del senderConfig.
372
+ // El consumidor necesita WHATSAPP_CONNECTOR_LAMBDA_URL desde el SSM `whatsapp-connector`.
373
+ bind<IWhatsappConnectorApi>("IWhatsappConnectorApi").to(WhatsappConnectorApi);
374
+
369
375
  // Remittance business — pricingResolve (Dashboard Ops Fase B, puente de resolución de precio en send-time)
370
376
  bind<IRemittanceBusinessApi>("IRemittanceBusinessApi").to(RemittanceBusinessApi);
371
377
 
package/src/index.ts CHANGED
@@ -104,6 +104,7 @@ export * from "./walletFundingSettlement/index.js";
104
104
  export * from "./wallet-funding-rules/index.js";
105
105
  export * from "./sns-ses-connector/index.js";
106
106
  export * from "./twilio-connector/index.js";
107
+ export * from "./whatsapp-connector/index.js";
107
108
  export * from "./remittance-business/index.js";
108
109
  export * from "./modelias-connector/index.js";
109
110
  export * from "./beneficiary/index.js";
@@ -7,7 +7,6 @@ import {
7
7
  OtpValidatedResponse,
8
8
  TemplateMessageCreateRequest, TemplateMessageUpdateRequest,
9
9
  TemplateMessageResponse, TemplateMessageListResponse, TemplateMessageListFiltersRequest,
10
- MdmNotifyRequest, MdmNotifyBatchResponse,
11
10
  } from '@fiado/type-kit/bin/messagesConnector/index.js';
12
11
  import { IMessagesBusinessApi } from './interfaces/IMessagesBusinessApi.js';
13
12
  import { joinUrl } from '../../utils/joinUrl.js';
@@ -32,10 +31,6 @@ export class MessagesBusinessApi implements IMessagesBusinessApi {
32
31
  return await this.httpRequest.get(`${this.baseUrl}messages/otp/validated`, { directoryId, otpCode }, { 'operationName': 'privateGetValidatedOtp' });
33
32
  }
34
33
 
35
- async notifyMdmDevices(request: MdmNotifyRequest): Promise<FiadoApiResponse<MdmNotifyBatchResponse>> {
36
- return await this.httpRequest.post(joinUrl(this.baseUrl, 'messages/mdm-notify'), request, { 'operationName': 'privateNotifyMdmDevices' });
37
- }
38
-
39
34
  async createTemplate(tenantId: string, request: TemplateMessageCreateRequest): Promise<FiadoApiResponse<TemplateMessageResponse>> {
40
35
  const url = this.withTenantId(joinUrl(this.baseUrl, 'templates'), tenantId);
41
36
  return await this.httpRequest.post(url, request, { 'operationName': 'backofficeCreateTemplate' });
@@ -5,7 +5,6 @@ import {
5
5
  OtpValidatedResponse,
6
6
  TemplateMessageCreateRequest, TemplateMessageUpdateRequest,
7
7
  TemplateMessageResponse, TemplateMessageListResponse, TemplateMessageListFiltersRequest,
8
- MdmNotifyRequest, MdmNotifyBatchResponse,
9
8
  } from '@fiado/type-kit/bin/messagesConnector/index.js';
10
9
 
11
10
  export interface IMessagesBusinessApi {
@@ -13,19 +12,6 @@ export interface IMessagesBusinessApi {
13
12
  verifyOtp(request: VerifyOtpRequest): Promise<FiadoApiResponse<VerifyOtpResponse>>;
14
13
  getValidatedOtp(directoryId: string, otpCode: string): Promise<FiadoApiResponse<OtpValidatedResponse>>;
15
14
 
16
- /**
17
- * Avisa en la pantalla del equipo financiado. Puerta aparte del lote a proposito: el item
18
- * lleva IMEI y proveedor en vez de destinatario y variables.
19
- *
20
- * Mensajeria resuelve el texto del `noticeType` contra el catalogo, agrupa por proveedor y
21
- * hace UN `notifyDevices()` por grupo. Responde 202 con un resultado por IMEI; el proveedor
22
- * caido llega como ERROR de ese item, nunca como dato invalido.
23
- *
24
- * Los mensajes normales NO entran por aqui ni por HTTP: se encolan con
25
- * `IMessagesBusinessPublisher`, y `referenceMessageId` es su llave de idempotencia.
26
- */
27
- notifyMdmDevices(request: MdmNotifyRequest): Promise<FiadoApiResponse<MdmNotifyBatchResponse>>;
28
-
29
15
  /**
30
16
  * CRUD de plantillas. Los cinco viven en la API privada sin authorizer, asi que el `tenantId`
31
17
  * es obligatorio y explicito: el lambda responde 400 TENANT_ID_REQUIRED si no llega.
@@ -1,29 +1,44 @@
1
1
  import { injectable } from 'inversify';
2
2
  import { SendMessageCommand, SQSClient } from '@aws-sdk/client-sqs';
3
3
  import { log } from '@fiado/logger';
4
- import { NotificationQueueMessageRequestV2 } from '@fiado/type-kit/bin/messagesConnector/index.js';
4
+ import {
5
+ MdmNotifyQueueMessageRequest,
6
+ NotificationQueueMessageRequestV2,
7
+ } from '@fiado/type-kit/bin/messagesConnector/index.js';
5
8
  import { IMessagesBusinessPublisher } from './interfaces/IMessagesBusinessPublisher.js';
6
9
 
10
+ type MessagesBusinessQueueMessage = NotificationQueueMessageRequestV2 | MdmNotifyQueueMessageRequest;
11
+
7
12
  @injectable()
8
13
  export default class MessagesBusinessPublisher implements IMessagesBusinessPublisher {
9
14
  private readonly queueUrl = process.env.MESSAGES_BUSINESS_QUEUE_URL!;
10
15
  private readonly sqsClient = new SQSClient({ region: process.env.AWS_REGION });
11
16
 
12
17
  async publish(message: NotificationQueueMessageRequestV2): Promise<void> {
18
+ await this.send('publish', message);
19
+ }
20
+
21
+ // El lote MDM viaja por la misma cola que el mensaje suelto; lo distingue su forma, no el destino.
22
+ async publishMdmNotifyBatch(message: MdmNotifyQueueMessageRequest): Promise<void> {
23
+ await this.send('publishMdmNotifyBatch', message);
24
+ }
25
+
26
+ /** Encola el mensaje serializado y deja el rastro de la operacion que lo publico. */
27
+ private async send(operation: string, message: MessagesBusinessQueueMessage): Promise<void> {
13
28
  const t0 = Date.now();
14
29
  try {
15
30
  const result = await this.sqsClient.send(new SendMessageCommand({
16
31
  QueueUrl: this.queueUrl,
17
32
  MessageBody: JSON.stringify(message),
18
33
  }));
19
- log.info('MessagesBusinessPublisher.publish ok', {
34
+ log.info(`MessagesBusinessPublisher.${operation} ok`, {
20
35
  messageId: result.MessageId,
21
36
  latencyMs: Date.now() - t0,
22
37
  });
23
38
  } catch (error) {
24
39
  // Propaga el error crudo del SQSClient (NO envolver en new Error(string) = antipatron).
25
40
  // Log de contexto + re-throw para que el caller decida.
26
- log.error('MessagesBusinessPublisher.publish failed', {
41
+ log.error(`MessagesBusinessPublisher.${operation} failed`, {
27
42
  latencyMs: Date.now() - t0,
28
43
  errorName: (error as Error)?.name,
29
44
  });
@@ -1,5 +1,14 @@
1
- import { NotificationQueueMessageRequestV2 } from '@fiado/type-kit/bin/messagesConnector/index.js';
1
+ import {
2
+ MdmNotifyQueueMessageRequest,
3
+ NotificationQueueMessageRequestV2,
4
+ } from '@fiado/type-kit/bin/messagesConnector/index.js';
2
5
 
3
6
  export interface IMessagesBusinessPublisher {
4
7
  publish(message: NotificationQueueMessageRequestV2): Promise<void>;
8
+
9
+ /**
10
+ * Encola el lote de avisos MDM que se muestran en la pantalla del equipo financiado.
11
+ * Reemplaza al `POST /private/messages/mdm-notify`, que se retira.
12
+ */
13
+ publishMdmNotifyBatch(message: MdmNotifyQueueMessageRequest): Promise<void>;
5
14
  }
@@ -0,0 +1,19 @@
1
+ import { inject, injectable } from "inversify";
2
+ import type { IHttpRequest } from "@fiado/http-client";
3
+ import { ConnectorSendMessageRequest, ConnectorSendMessageResponse } from "@fiado/type-kit/bin/whatsappConnector/index.js";
4
+ import { IWhatsappConnectorApi } from "./interfaces/IWhatsappConnectorApi.js";
5
+ import { joinUrl } from "../../utils/joinUrl.js";
6
+
7
+ type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
8
+
9
+ @injectable()
10
+ export default class WhatsappConnectorApi implements IWhatsappConnectorApi {
11
+ private readonly baseUrl = process.env.WHATSAPP_CONNECTOR_LAMBDA_URL || "";
12
+
13
+ constructor(@inject("IHttpRequest") private httpRequest: IHttpRequest) {}
14
+
15
+ async send(request: ConnectorSendMessageRequest): Promise<FiadoApiResponse<ConnectorSendMessageResponse>> {
16
+ const url = joinUrl(this.baseUrl, "messages/send");
17
+ return await this.httpRequest.post(url, request, { operationName: "privateSendMessage" });
18
+ }
19
+ }
@@ -0,0 +1,11 @@
1
+ import { ConnectorSendMessageRequest, ConnectorSendMessageResponse } from "@fiado/type-kit/bin/whatsappConnector/index.js";
2
+
3
+ type FiadoApiResponse<T> = import("@fiado/type-kit/bin/apiResponse/dtos/FiadoApiResponse.js").default<T>;
4
+
5
+ export interface IWhatsappConnectorApi {
6
+ /**
7
+ * Envía un mensaje ya resuelto al whatsapp-connector (POST /messages/send).
8
+ * messages-business resuelve plantilla y proveedor; el connector solo transmite a Meta.
9
+ */
10
+ send(request: ConnectorSendMessageRequest): Promise<FiadoApiResponse<ConnectorSendMessageResponse>>;
11
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./api/interfaces/IWhatsappConnectorApi.js";
2
+ export { default as WhatsappConnectorApi } from "./api/WhatsappConnectorApi.js";