diff --git a/src/main/java/it/pagopa/pn/workflowmanager/exceptions/WorkflowManagerExceptionCodes.java b/src/main/java/it/pagopa/pn/workflowmanager/exceptions/WorkflowManagerExceptionCodes.java index 980658e..a0eb6cd 100644 --- a/src/main/java/it/pagopa/pn/workflowmanager/exceptions/WorkflowManagerExceptionCodes.java +++ b/src/main/java/it/pagopa/pn/workflowmanager/exceptions/WorkflowManagerExceptionCodes.java @@ -24,5 +24,6 @@ public class WorkflowManagerExceptionCodes extends PnExceptionsCodes { public static final String ERROR_CODE_WORKFLOWMANAGER_UNKNOWN_EVENT_CODE = "PN_WORKFLOWMANAGER_UNKNOWNEVENTCODE"; public static final String ERROR_CODE_WORKFLOWMANAGER_CHANNEL_TRIGGER_EVENT_NOT_FOUND = "PN_WORKFLOWMANAGER_CHANNELTRIGGEREVENTNOTFOUND"; public static final String ERROR_CODE_WORKFLOWMANAGER_PAYMENT_NOT_FOUND = "PN_WORKFLOWMANAGER_PAYMENTNOTFOUND"; + public static final String ERROR_CODE_WORKFLOWMANAGER_SENDSMSNOTIFICATIONFAILED = "PN_WORKFLOWMANAGER_SENDSMSNOTIFICATIONFAILED"; public static final String ERROR_CODE_WORKFLOWMANAGER_SENDEMAILNOTIFICATIONFAILED = "PN_WORKFLOWMANAGER_SENDEMAILNOTIFICATIONFAILED"; } diff --git a/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClient.java b/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClient.java index d2adca0..6d22baa 100644 --- a/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClient.java +++ b/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClient.java @@ -31,4 +31,10 @@ void sendNotificationEMAIL( DigitalAddressInt digitalAddress, List attachmentUrls ); + + void sendNotificationSMS( + String requestIdx, + String textMessage, + String senderDigitalAddress + ); } diff --git a/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImpl.java b/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImpl.java index 437e7e0..7d35ab4 100644 --- a/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImpl.java +++ b/src/main/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImpl.java @@ -11,6 +11,7 @@ import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.api.DigitalCourtesyMessagesApi; import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.api.DigitalLegalMessagesApi; import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.model.DigitalCourtesyMailRequest; +import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.model.DigitalCourtesySmsRequest; import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.model.DigitalNotificationRequest; import lombok.CustomLog; import lombok.RequiredArgsConstructor; @@ -22,6 +23,7 @@ import static it.pagopa.pn.workflowmanager.exceptions.WorkflowManagerExceptionCodes.ERROR_CODE_WORKFLOWMANAGER_SENDEMAILNOTIFICATIONFAILED; import static it.pagopa.pn.workflowmanager.exceptions.WorkflowManagerExceptionCodes.ERROR_CODE_WORKFLOWMANAGER_SENDPECNOTIFICATIONFAILED; +import static it.pagopa.pn.workflowmanager.exceptions.WorkflowManagerExceptionCodes.ERROR_CODE_WORKFLOWMANAGER_SENDSMSNOTIFICATIONFAILED; @Component @CustomLog @@ -105,4 +107,32 @@ public void sendNotificationEMAIL(String requestId, digitalNotificationRequest.setAttachmentUrls(attachmentUrls.stream().map(FileUtils::getKeyWithStoragePrefix).toList()); return digitalNotificationRequest; } + + @Override + public void sendNotificationSMS( + String requestIdx, + String textMessage, + String senderDigitalAddress + ) { + try { + log.logInvokingAsyncExternalService(CLIENT_NAME, COURTESY_NOTIFICATION_REQUEST + "[SMS]", requestIdx); + log.debug("[enter] sendNotificationSMS requestId={} senderDigitalAddress={}", requestIdx, LogUtils.maskNumber(senderDigitalAddress)); + + DigitalCourtesySmsRequest digitalNotificationRequest = new DigitalCourtesySmsRequest(); + digitalNotificationRequest.setChannel(DigitalCourtesySmsRequest.ChannelEnum.SMS); + digitalNotificationRequest.setRequestId(requestIdx); + digitalNotificationRequest.setCorrelationId(requestIdx); + digitalNotificationRequest.setEventType(EVENT_TYPE_INFORMAL); + digitalNotificationRequest.setQos(DigitalCourtesySmsRequest.QosEnum.BATCH); + digitalNotificationRequest.setReceiverDigitalAddress(senderDigitalAddress); + digitalNotificationRequest.setClientRequestTimeStamp(Instant.now()); + digitalNotificationRequest.setMessageText(textMessage); + + digitalCourtesyMessagesApi.sendCourtesyShortMessage(requestIdx, cfg.getCxId(), digitalNotificationRequest); + log.debug("[exit] sendNotificationSMS requestId={} senderDigitalAddress={}", requestIdx, LogUtils.maskNumber(senderDigitalAddress)); + } catch (Exception e) { + log.error("error sending SMS notification for requestIdx={}", requestIdx); + throw new PnInternalException("error sending SMS notification", ERROR_CODE_WORKFLOWMANAGER_SENDSMSNOTIFICATIONFAILED, e); + } + } } diff --git a/src/test/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImplTest.java b/src/test/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImplTest.java index ea9f145..b75e304 100644 --- a/src/test/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImplTest.java +++ b/src/test/java/it/pagopa/pn/workflowmanager/middleware/externalclient/pnclient/externalchannel/PnExternalChannelsClientImplTest.java @@ -11,6 +11,7 @@ import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.api.DigitalCourtesyMessagesApi; import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.api.DigitalLegalMessagesApi; import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.model.DigitalCourtesyMailRequest; +import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.model.DigitalCourtesySmsRequest; import it.pagopa.pn.workflowmanager.generated.openapi.msclient.externalchannels.model.DigitalNotificationRequest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -256,4 +257,46 @@ void wrapsWhenSendNotificationEmailFailAndRethrowsWhenExternalApiFails() { assertSame(apiException, thrown.getCause()); } + + @Test + void sendsSmsNotificationWithExpectedPayload() { + String requestIdx = "request-idx"; + String cxId = "cx-id"; + String textMessage = "Hello SMS"; + String senderDigitalAddress = "+39123456789"; + + when(cfg.getCxId()).thenReturn(cxId); + + client.sendNotificationSMS(requestIdx, textMessage, senderDigitalAddress); + + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(DigitalCourtesySmsRequest.class); + verify(digitalCourtesyMessagesApi).sendCourtesyShortMessage(eq(requestIdx), eq(cxId), requestCaptor.capture()); + + DigitalCourtesySmsRequest sent = requestCaptor.getValue(); + assertEquals(DigitalCourtesySmsRequest.ChannelEnum.SMS, sent.getChannel()); + assertEquals(requestIdx, sent.getRequestId()); + assertEquals(requestIdx, sent.getCorrelationId()); + assertEquals("INFORMAL", sent.getEventType()); + assertEquals(DigitalCourtesySmsRequest.QosEnum.BATCH, sent.getQos()); + assertEquals(senderDigitalAddress, sent.getReceiverDigitalAddress()); + assertEquals(textMessage, sent.getMessageText()); + assertNotNull(sent.getClientRequestTimeStamp()); + } + + @Test + void wrapsAndRethrowsWhenSmsApiFails() { + String requestIdx = "request-idx"; + RuntimeException apiException = new RuntimeException("boom"); + + when(cfg.getCxId()).thenReturn("cx-id"); + doThrow(apiException).when(digitalCourtesyMessagesApi) + .sendCourtesyShortMessage(anyString(), anyString(), any(DigitalCourtesySmsRequest.class)); + + PnInternalException thrown = assertThrows( + PnInternalException.class, + () -> client.sendNotificationSMS(requestIdx, "text", "+39123456789") + ); + + assertSame(apiException, thrown.getCause()); + } } \ No newline at end of file