From 23e414a62d4d216475cfa325d9c76a93d39f569f Mon Sep 17 00:00:00 2001 From: vanitha1822 Date: Tue, 29 Sep 2026 11:05:26 +0530 Subject: [PATCH 1/5] fix: emergency contacts issue --- .../common/service/notification/NotificationService.java | 2 +- .../service/notification/NotificationServiceImpl.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/iemr/common/service/notification/NotificationService.java b/src/main/java/com/iemr/common/service/notification/NotificationService.java index a3c85387..15e5d4d8 100644 --- a/src/main/java/com/iemr/common/service/notification/NotificationService.java +++ b/src/main/java/com/iemr/common/service/notification/NotificationService.java @@ -46,7 +46,7 @@ String updateNotification(String request) String updateNotificationType(String request) throws JSONException, IEMRException; - String getEmergencyContacts(String request) throws IEMRException; + String getEmergencyContacts(String request) throws IEMRException, JsonMappingException, JsonProcessingException; String getSupervisorEmergencyContacts(String request) throws IEMRException, JsonMappingException, JsonProcessingException; diff --git a/src/main/java/com/iemr/common/service/notification/NotificationServiceImpl.java b/src/main/java/com/iemr/common/service/notification/NotificationServiceImpl.java index a4fda6f5..744e4d76 100644 --- a/src/main/java/com/iemr/common/service/notification/NotificationServiceImpl.java +++ b/src/main/java/com/iemr/common/service/notification/NotificationServiceImpl.java @@ -437,10 +437,12 @@ private String getFilePath(KMFileManager kmFileManager) } @Override - public String getEmergencyContacts(String request) throws IEMRException + public String getEmergencyContacts(String request) throws IEMRException, JsonMappingException, JsonProcessingException { List emergencyContacts = new ArrayList(); - EmergencyContacts emergencyContactRequest = inputMapper.gson().fromJson(request, EmergencyContacts.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + EmergencyContacts emergencyContactRequest = objectMapper.readValue(request, EmergencyContacts.class); Integer providerServiceMapID = emergencyContactRequest.getProviderServiceMapID(); Integer notificationTypeID = emergencyContactRequest.getNotificationTypeID(); // emergencyContacts = emergencyContactsRepository.getEmergencyContacts(providerServiceMapID, From 7134dba79c9e97d62eeffa4dc49d9aef0c2893e7 Mon Sep 17 00:00:00 2001 From: vanitha1822 Date: Tue, 29 Sep 2026 19:39:18 +0530 Subject: [PATCH 2/5] fix: welcome sms issue --- .../RegisterBenificiaryServiceImpl.java | 3 +-- .../welcomeSms/WelcomeBenificarySmsService.java | 2 +- .../WelcomeBenificarySmsServiceImpl.java | 16 +++++++--------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java b/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java index e8227fd2..1fb97e15 100644 --- a/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java +++ b/src/main/java/com/iemr/common/service/beneficiary/RegisterBenificiaryServiceImpl.java @@ -240,12 +240,11 @@ public String save(BeneficiaryModel beneficiaryModel, HttpServletRequest servlet try { logger.info("[SMS] Attempting to send welcome SMS to: " + phoneNo); - String smsResult = welcomeBenificarySmsService.sendWelcomeSMStoBenificiary( + welcomeBenificarySmsService.sendWelcomeSMStoBenificiary( phoneNo, beneficiaryName.trim(), beneficiary.getBeneficiaryID() ); - logger.info("[SMS] Result: " + smsResult); } catch (Exception smsError) { // SMS failed but beneficiary is already created - don't fail the request logger.warn("[SMS] Failed to send SMS: " + smsError.getMessage() + diff --git a/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsService.java b/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsService.java index 9a0eeed6..f751014b 100644 --- a/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsService.java +++ b/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsService.java @@ -4,6 +4,6 @@ @Service public interface WelcomeBenificarySmsService { - public String sendWelcomeSMStoBenificiary(String contactNo,String beneficiaryName,String beneficiaryId); + public void sendWelcomeSMStoBenificiary(String contactNo,String beneficiaryName,String beneficiaryId); } diff --git a/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java b/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java index 397d989f..cee43e8e 100644 --- a/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java +++ b/src/main/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImpl.java @@ -50,7 +50,7 @@ public class WelcomeBenificarySmsServiceImpl implements WelcomeBenificarySmsServ private String smsTemplate =null; @Async - public String sendWelcomeSMStoBenificiary(String contactNo, String beneficiaryName, String beneficiaryId) { + public void sendWelcomeSMStoBenificiary(String contactNo, String beneficiaryName, String beneficiaryId) { try { String sendSMSAPI = SMS_GATEWAY_URL; @@ -87,18 +87,16 @@ public String sendWelcomeSMStoBenificiary(String contactNo, String beneficiaryNa ResponseEntity response = restTemplate.postForEntity(sendSMSAPI, request, String.class); logger.info("sms-response:" + response.getBody()); if (response.getStatusCode().value() == 200) { - return "OTP sent successfully on register mobile number"; + logger.info("[SMS] Welcome SMS sent to " + contactNo); } else { - return "Fail"; - + logger.warn("[SMS] Welcome SMS failed for " + contactNo + " with status " + response.getStatusCode()); } + } else { + logger.warn("[SMS] Welcome SMS not sent: SMS template '" + smsTemplateName + "' not found"); } - - } - catch (Exception e) { - return "Error sending SMS: " + e.getMessage().toString(); + } catch (Exception e) { + logger.error("[SMS] Error sending welcome SMS to " + contactNo + ": " + e.getMessage(), e); } - return null; } } From 70a9e1c0434e20e57d7c2c0d6b812777e1748261 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Thu, 10 Sep 2026 00:46:24 +0530 Subject: [PATCH 3/5] fix: remove the wrong column (#454) --- .../com/iemr/common/data/callhandling/BeneficiaryCall.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java b/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java index fd55de84..af08dadc 100644 --- a/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java +++ b/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java @@ -234,9 +234,6 @@ public class BeneficiaryCall { @Expose @Column(name = "InsName") private String instName; - - @Value("${cti-logger_base_url}") - private String loggerBaseURL; @Transient @Expose From 0432b5f031415eb49190b2943f79565cf5897064 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Thu, 10 Sep 2026 00:56:28 +0530 Subject: [PATCH 4/5] fix: build issue (#455) --- .../common/data/callhandling/BeneficiaryCall.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java b/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java index af08dadc..59c9518a 100644 --- a/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java +++ b/src/main/java/com/iemr/common/data/callhandling/BeneficiaryCall.java @@ -23,8 +23,6 @@ import java.sql.Timestamp; -import org.springframework.beans.factory.annotation.Value; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.google.gson.annotations.Expose; import com.iemr.common.data.beneficiary.Beneficiary; @@ -279,17 +277,6 @@ public BeneficiaryCall(Long beneficiaryRegID, Boolean is1097, String createdBy) this.createdBy = createdBy; } - public BeneficiaryCall(Long benCallID, Timestamp createdDate, String agentID, String callID, String recordingPath, - String archivePath) { - // String loggerBaseURL = ConfigProperties.getPropertyByName("cti-logger_base_url"); - this.benCallID = benCallID; - this.createdDate = createdDate; - this.agentID = agentID; - this.callID = callID; - this.recordingPath = (recordingPath != null) ? (loggerBaseURL + "/" + recordingPath) : recordingPath; - this.archivePath = (archivePath != null) ? (loggerBaseURL + "/" + archivePath) : archivePath; - } - @Transient private OutputMapper outputMapper = new OutputMapper(); From a60d08ca4b3024d6dd98a59869cc6e2031a93824 Mon Sep 17 00:00:00 2001 From: vanitha1822 Date: Tue, 27 Oct 2026 11:22:17 +0530 Subject: [PATCH 5/5] fix: align firebase and welcome sms tests with current code - Use UserFcmTokenData/UserFcmTokenRepo and findByUserId in FirebaseNotificationServiceTest; update expected return messages - Compare ResponseEntity bodies in FirebaseNotificationControllerTest - Verify interactions instead of return values now that sendWelcomeSMStoBenificiary is void Co-Authored-By: Claude Opus 5.5 --- .../FirebaseNotificationControllerTest.java | 4 +-- .../FirebaseNotificationServiceTest.java | 27 ++++++++++--------- .../WelcomeBenificarySmsServiceImplTest.java | 22 ++++++++------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/test/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationControllerTest.java b/src/test/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationControllerTest.java index 15402354..1c50a044 100644 --- a/src/test/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationControllerTest.java +++ b/src/test/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationControllerTest.java @@ -32,7 +32,7 @@ void sendNotificationReturnsMessageId() { NotificationMessage message = new NotificationMessage(); when(firebaseNotificationService.sendNotification(message)).thenReturn("projects/amrit/messages/1"); - assertThat(controller.sendNotificationByToken(message)).isEqualTo("projects/amrit/messages/1"); + assertThat(controller.sendNotificationByToken(message).getBody()).isEqualTo("projects/amrit/messages/1"); } @Test @@ -41,7 +41,7 @@ void updateTokenReturnsConfirmation() { UserToken userToken = new UserToken(); when(firebaseNotificationService.updateToken(userToken)).thenReturn("Save Successfully"); - assertThat(controller.updateToken(userToken)).isEqualTo("Save Successfully"); + assertThat(controller.updateToken(userToken).getBody()).isEqualTo("Save Successfully"); } @Test diff --git a/src/test/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationServiceTest.java b/src/test/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationServiceTest.java index bf8781ea..5633375f 100644 --- a/src/test/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationServiceTest.java +++ b/src/test/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationServiceTest.java @@ -32,10 +32,10 @@ import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.FirebaseMessagingException; import com.google.firebase.messaging.Message; -import com.iemr.common.data.userToken.UserTokenData; +import com.iemr.common.data.userToken.UserFcmTokenData; import com.iemr.common.model.notification.NotificationMessage; import com.iemr.common.model.notification.UserToken; -import com.iemr.common.repo.userToken.UserTokenRepo; +import com.iemr.common.repo.userToken.UserFcmTokenRepo; import com.iemr.common.utils.CookieUtil; import com.iemr.common.utils.JwtUtil; @@ -45,7 +45,7 @@ class FirebaseNotificationServiceTest { @Mock - private UserTokenRepo userTokenRepo; + private UserFcmTokenRepo userTokenRepo; @Mock private CookieUtil cookieUtil; @Mock @@ -78,7 +78,7 @@ private NotificationMessage notification() { @Test @DisplayName("no configured Firebase messaging means the notification is skipped, not attempted") void notificationIsSkippedWhenFirebaseIsNotConfigured() { - assertThat(service.sendNotification(notification())).isNull(); + assertThat(service.sendNotification(notification())).isEqualTo("FirebaseMessaging bean is not initialized."); } @Test @@ -101,22 +101,24 @@ void notificationIsPublishedToTopic() throws Exception { void deliveryFailureIsReported() throws Exception { FirebaseMessaging messaging = mock(FirebaseMessaging.class); ReflectionTestUtils.setField(service, "firebaseMessaging", messaging); - when(messaging.send(any(Message.class))).thenThrow(mock(FirebaseMessagingException.class)); + FirebaseMessagingException failure = mock(FirebaseMessagingException.class); + when(failure.getMessage()).thenReturn("token not registered"); + when(messaging.send(any(Message.class))).thenThrow(failure); try (MockedStatic statics = mockStatic(FirebaseMessaging.class)) { statics.when(FirebaseMessaging::getInstance).thenReturn(messaging); - assertThat(service.sendNotification(notification())).isEqualTo("Error sending notification"); + assertThat(service.sendNotification(notification())).isEqualTo("FCM Error : token not registered"); } } @Test @DisplayName("an existing device token is updated in place") void existingTokenIsUpdated() { - UserTokenData existing = new UserTokenData(); + UserFcmTokenData existing = new UserFcmTokenData(); existing.setUserId(7); existing.setToken("old-token"); - when(userTokenRepo.findById(7)).thenReturn(Optional.of(existing)); + when(userTokenRepo.findByUserId(7)).thenReturn(Optional.of(existing)); UserToken userToken = new UserToken(); userToken.setUserId(7); @@ -124,17 +126,16 @@ void existingTokenIsUpdated() { assertThat(service.updateToken(userToken)).isEqualTo("Save Successfully"); - ArgumentCaptor captor = ArgumentCaptor.forClass(UserTokenData.class); + ArgumentCaptor captor = ArgumentCaptor.forClass(UserFcmTokenData.class); verify(userTokenRepo).save(captor.capture()); assertThat(captor.getValue()).isSameAs(existing); assertThat(captor.getValue().getToken()).isEqualTo("new-token"); - assertThat(captor.getValue().getUpdatedAt()).isNotNull(); } @Test @DisplayName("a user with no stored token gets a new row") void newTokenIsCreated() { - when(userTokenRepo.findById(8)).thenReturn(Optional.empty()); + when(userTokenRepo.findByUserId(8)).thenReturn(Optional.empty()); UserToken userToken = new UserToken(); userToken.setUserId(8); @@ -142,7 +143,7 @@ void newTokenIsCreated() { assertThat(service.updateToken(userToken)).isEqualTo("Save Successfully"); - ArgumentCaptor captor = ArgumentCaptor.forClass(UserTokenData.class); + ArgumentCaptor captor = ArgumentCaptor.forClass(UserFcmTokenData.class); verify(userTokenRepo).save(captor.capture()); assertThat(captor.getValue().getUserId()).isEqualTo(8); assertThat(captor.getValue().getToken()).isEqualTo("fresh-token"); @@ -154,7 +155,7 @@ void storedTokenIsResolvedFromTheJwtCookie() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); when(jwtUtil.getUserIdFromToken("jwt-value")).thenReturn("11"); - UserTokenData stored = new UserTokenData(); + UserFcmTokenData stored = new UserFcmTokenData(); stored.setToken("device-token"); when(userTokenRepo.findById(11)).thenReturn(Optional.of(stored)); diff --git a/src/test/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImplTest.java b/src/test/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImplTest.java index cf384991..fe9ad732 100644 --- a/src/test/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImplTest.java +++ b/src/test/java/com/iemr/common/service/welcomeSms/WelcomeBenificarySmsServiceImplTest.java @@ -1,6 +1,7 @@ package com.iemr.common.service.welcomeSms; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -73,9 +74,7 @@ void placeholdersAreFilledAndGatewayCalled() { (mock, context) -> when(mock.postForEntity(anyString(), any(), eq(String.class))) .thenReturn(new ResponseEntity<>("queued", HttpStatus.OK)))) { - String result = service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42"); - - assertThat(result).isEqualTo("OTP sent successfully on register mobile number"); + service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42"); RestTemplate restTemplate = construction.constructed().get(0); @SuppressWarnings("unchecked") @@ -94,20 +93,23 @@ void placeholdersAreFilledAndGatewayCalled() { } @Test - @DisplayName("a non-200 gateway reply is reported as a failure") - void nonOkGatewayReplyIsAFailure() { + @DisplayName("a non-200 gateway reply is logged rather than thrown") + void nonOkGatewayReplyIsNotThrown() { stubTemplate("Welcome $$BENE_NAME$$"); try (MockedConstruction construction = mockConstruction(RestTemplate.class, (mock, context) -> when(mock.postForEntity(anyString(), any(), eq(String.class))) .thenReturn(new ResponseEntity<>("rejected", HttpStatus.ACCEPTED)))) { - assertThat(service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42")).isEqualTo("Fail"); + assertThatCode(() -> service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42")) + .doesNotThrowAnyException(); + org.mockito.Mockito.verify(construction.constructed().get(0)).postForEntity(anyString(), any(), + eq(String.class)); } } @Test - @DisplayName("a gateway error is reported with its message rather than thrown") + @DisplayName("a gateway error is logged rather than thrown") void gatewayErrorIsReported() { stubTemplate("Welcome $$BENE_NAME$$"); @@ -115,8 +117,8 @@ void gatewayErrorIsReported() { (mock, context) -> when(mock.postForEntity(anyString(), any(), eq(String.class))) .thenThrow(new RestClientException("gateway unreachable")))) { - assertThat(service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42")) - .isEqualTo("Error sending SMS: gateway unreachable"); + assertThatCode(() -> service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42")) + .doesNotThrowAnyException(); } } @@ -126,7 +128,7 @@ void missingTemplateSendsNothing() { when(smsTemplateRepository.findBySmsTemplateName("welcome_sms")).thenReturn(Optional.empty()); try (MockedConstruction construction = mockConstruction(RestTemplate.class)) { - assertThat(service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42")).isNull(); + service.sendWelcomeSMStoBenificiary("9999999999", "Latha", "BEN-42"); org.mockito.Mockito.verifyNoInteractions(construction.constructed().get(0)); } }