From 1f8204dd07ad25a4b7b8c71071c73ef5192d7a11 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Fri, 20 Feb 2026 10:55:01 +0530 Subject: [PATCH 01/11] PII Issue Fixes Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../booking/service/util/BookingServiceUtil.java | 10 +++++++++- .../test/service/util/BookingServiceUtilTest.java | 11 +++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 476ec528d1..2ac1861337 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -87,6 +87,7 @@ import io.mosip.preregistration.core.exception.RestCallException; import io.mosip.preregistration.core.util.UUIDGeneratorUtil; import io.mosip.preregistration.core.util.ValidationUtil; +import io.mosip.preregistration.core.common.service.UserDetailsService; /** * This class provides the utility methods for Booking application. @@ -107,6 +108,9 @@ public class BookingServiceUtil { @Autowired private RestTemplate restTemplate; + @Autowired + private UserDetailsService userDetailsService; + /** * Reference for ${regCenter.url} from property file */ @@ -535,7 +539,10 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, entity.setRegistrationCenterId(bookingRequestDTO.getRegistrationCenterId()); entity.setId(UUIDGeneratorUtil.generateId()); entity.setLangCode("12L"); - entity.setCrBy(authUserDetails().getUserId()); + // Map to canonical UUID via UserDetailsService + String userId = authUserDetails().getUserId(); + var userDetail = userDetailsService.findOrCreateByIdentifier(userId); + entity.setCrBy(userDetail.getUserId().toString()); entity.setCrDate(DateUtils.parseDateToLocalDateTime(new Date())); entity.setRegDate(LocalDate.parse(bookingRequestDTO.getRegDate())); entity.setSlotFromTime(LocalTime.parse(bookingRequestDTO.getSlotFromTime())); @@ -734,3 +741,4 @@ public MainResponseDTO getApplicationStatus(String applicationId) { // } } + diff --git a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java index caa2dfe867..9f7b015789 100644 --- a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java +++ b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java @@ -68,6 +68,8 @@ import io.mosip.preregistration.core.common.dto.MainRequestDTO; import io.mosip.preregistration.core.common.dto.NotificationDTO; import io.mosip.preregistration.core.common.dto.ResponseWrapper; +import io.mosip.preregistration.core.common.entity.UserDetails; +import io.mosip.preregistration.core.common.service.UserDetailsService; import io.mosip.preregistration.core.exception.MasterDataNotAvailableException; import io.mosip.preregistration.core.exception.RestCallException; import io.mosip.preregistration.core.util.RequestValidator; @@ -97,6 +99,9 @@ public class BookingServiceUtilTest { @MockBean private BookingDAO bookingDAO; + @MockBean + private UserDetailsService userDetailsService; + @Mock private AuthUserDetails authUserDetails; @@ -139,6 +144,10 @@ public void setup() throws Exception { Mockito.when(securityContext.getAuthentication()).thenReturn(authentication); SecurityContextHolder.setContext(securityContext); Mockito.when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser); + Mockito.when(applicationUser.getUserId()).thenReturn("test-user"); + UserDetails mappedUser = new UserDetails(); + mappedUser.setUserId(java.util.UUID.fromString("00000000-0000-0000-0000-000000000001")); + Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())).thenReturn(mappedUser); centerDto.setId("10001"); centerDto.setLangCode("eng"); centerDto.setCenterStartTime(startTime); @@ -646,3 +655,5 @@ public void timeSpanCheckForRebook1() { } } + + From 4d44180c534c3aa4b57bd428a5c24ee07f490bd2 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:22:00 +0530 Subject: [PATCH 02/11] Updated user validation Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../booking/service/util/BookingServiceUtil.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 2ac1861337..2ce5e0c479 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -539,9 +539,12 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, entity.setRegistrationCenterId(bookingRequestDTO.getRegistrationCenterId()); entity.setId(UUIDGeneratorUtil.generateId()); entity.setLangCode("12L"); - // Map to canonical UUID via UserDetailsService - String userId = authUserDetails().getUserId(); - var userDetail = userDetailsService.findOrCreateByIdentifier(userId); + // Map to canonical UUID via UserDetailsService. Fallback to username when userId is blank. + String userIdentifier = authUserDetails().getUserId(); + if (userIdentifier == null || userIdentifier.isBlank()) { + userIdentifier = authUserDetails().getUsername(); + } + var userDetail = userDetailsService.findOrCreateByIdentifier(userIdentifier); entity.setCrBy(userDetail.getUserId().toString()); entity.setCrDate(DateUtils.parseDateToLocalDateTime(new Date())); entity.setRegDate(LocalDate.parse(bookingRequestDTO.getRegDate())); From 173d77e7450f6c9f21463f3cf35d2cf0da699a6c Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Tue, 24 Feb 2026 12:42:46 +0530 Subject: [PATCH 03/11] Revert "Updated user validation" Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../booking/service/util/BookingServiceUtil.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 2ce5e0c479..2ac1861337 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -539,12 +539,9 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, entity.setRegistrationCenterId(bookingRequestDTO.getRegistrationCenterId()); entity.setId(UUIDGeneratorUtil.generateId()); entity.setLangCode("12L"); - // Map to canonical UUID via UserDetailsService. Fallback to username when userId is blank. - String userIdentifier = authUserDetails().getUserId(); - if (userIdentifier == null || userIdentifier.isBlank()) { - userIdentifier = authUserDetails().getUsername(); - } - var userDetail = userDetailsService.findOrCreateByIdentifier(userIdentifier); + // Map to canonical UUID via UserDetailsService + String userId = authUserDetails().getUserId(); + var userDetail = userDetailsService.findOrCreateByIdentifier(userId); entity.setCrBy(userDetail.getUserId().toString()); entity.setCrDate(DateUtils.parseDateToLocalDateTime(new Date())); entity.setRegDate(LocalDate.parse(bookingRequestDTO.getRegDate())); From 6c53d24e4dc985534e79a7df639aca292d345811 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Wed, 25 Feb 2026 11:51:34 +0530 Subject: [PATCH 04/11] Backward Compatibility Changes Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../service/util/BookingServiceUtil.java | 24 +++++++++++++-- .../src/main/resources/bootstrap.properties | 1 + .../service/util/BookingServiceUtilTest.java | 29 +++++++++++++++++++ .../src/test/resources/application.properties | 1 + 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 2ac1861337..e2753fdf02 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -81,6 +81,7 @@ import io.mosip.preregistration.core.common.dto.RequestWrapper; import io.mosip.preregistration.core.common.dto.ResponseWrapper; import io.mosip.preregistration.core.common.entity.RegistrationBookingEntity; +import io.mosip.preregistration.core.common.entity.UserDetails; import io.mosip.preregistration.core.config.LoggerConfiguration; import io.mosip.preregistration.core.exception.MasterDataNotAvailableException; import io.mosip.preregistration.core.exception.NotificationException; @@ -144,6 +145,9 @@ public class BookingServiceUtil { @Value("${mosip.notification.timezone}") private String specificZoneId; + @Value("${mosip.prereg.use.canonical.user_id}") + private boolean useCanonicalUserId; + /** * ObjectMapper global object creation */ @@ -539,10 +543,8 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, entity.setRegistrationCenterId(bookingRequestDTO.getRegistrationCenterId()); entity.setId(UUIDGeneratorUtil.generateId()); entity.setLangCode("12L"); - // Map to canonical UUID via UserDetailsService String userId = authUserDetails().getUserId(); - var userDetail = userDetailsService.findOrCreateByIdentifier(userId); - entity.setCrBy(userDetail.getUserId().toString()); + entity.setCrBy(resolveEffectiveCrBy(userId)); entity.setCrDate(DateUtils.parseDateToLocalDateTime(new Date())); entity.setRegDate(LocalDate.parse(bookingRequestDTO.getRegDate())); entity.setSlotFromTime(LocalTime.parse(bookingRequestDTO.getSlotFromTime())); @@ -551,6 +553,22 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, return entity; } + private String resolveEffectiveCrBy(String userId) { + if (!useCanonicalUserId) { + return userId; + } + try { + UserDetails userDetail = userDetailsService.findOrCreateByIdentifier(userId); + if (userDetail != null && userDetail.getUserId() != null) { + return userDetail.getUserId().toString(); + } + } catch (Exception ex) { + log.warn("sessionId", "idType", "id", + "Failed to resolve canonical user id for booking, using raw identifier: " + userId); + } + return userId; + } + /** * * @param notificationDTO diff --git a/pre-registration-booking-service/src/main/resources/bootstrap.properties b/pre-registration-booking-service/src/main/resources/bootstrap.properties index 46f53f8cda..69ce760c25 100644 --- a/pre-registration-booking-service/src/main/resources/bootstrap.properties +++ b/pre-registration-booking-service/src/main/resources/bootstrap.properties @@ -15,6 +15,7 @@ server.port=9095 health.config.enabled=false mosip.preregistration.booking.id.book=mosip.pre-registration.booking.book mosip.id.preregistration.booking.book=mosip.pre-registration.booking.book +mosip.prereg.use.canonical.user_id=true #disabling health check so that client doesnt try to load properties from sprint config server every # 5 minutes (should not be done in production) diff --git a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java index 9f7b015789..7f5769980d 100644 --- a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java +++ b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java @@ -32,6 +32,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -68,6 +69,7 @@ import io.mosip.preregistration.core.common.dto.MainRequestDTO; import io.mosip.preregistration.core.common.dto.NotificationDTO; import io.mosip.preregistration.core.common.dto.ResponseWrapper; +import io.mosip.preregistration.core.common.entity.RegistrationBookingEntity; import io.mosip.preregistration.core.common.entity.UserDetails; import io.mosip.preregistration.core.common.service.UserDetailsService; import io.mosip.preregistration.core.exception.MasterDataNotAvailableException; @@ -577,6 +579,7 @@ public void emailNotificationTest() throws JsonProcessingException { @Test public void bookingEntitySetterTest() { + ReflectionTestUtils.setField(serviceUtil, "useCanonicalUserId", true); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00"); @@ -585,6 +588,32 @@ public void bookingEntitySetterTest() { serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); } + @Test + public void bookingEntitySetterLegacyCrByTest() { + ReflectionTestUtils.setField(serviceUtil, "useCanonicalUserId", false); + BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); + bookingRequestDTO.setRegistrationCenterId("1"); + bookingRequestDTO.setSlotFromTime("09:00"); + bookingRequestDTO.setSlotToTime("09:13"); + bookingRequestDTO.setRegDate("2018-12-06"); + RegistrationBookingEntity entity = serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); + assertEquals("test-user", entity.getCrBy()); + } + + @Test + public void bookingEntitySetterCanonicalFallbackToRawTest() { + ReflectionTestUtils.setField(serviceUtil, "useCanonicalUserId", true); + Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())) + .thenThrow(new RuntimeException("mapping failed")); + BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); + bookingRequestDTO.setRegistrationCenterId("1"); + bookingRequestDTO.setSlotFromTime("09:00"); + bookingRequestDTO.setSlotToTime("09:13"); + bookingRequestDTO.setRegDate("2018-12-06"); + RegistrationBookingEntity entity = serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); + assertEquals("test-user", entity.getCrBy()); + } + @Test public void prepareRequestMapTest() { MainRequestDTO requestDto = new MainRequestDTO<>(); diff --git a/pre-registration-booking-service/src/test/resources/application.properties b/pre-registration-booking-service/src/test/resources/application.properties index 4c5991c792..652986f549 100644 --- a/pre-registration-booking-service/src/test/resources/application.properties +++ b/pre-registration-booking-service/src/test/resources/application.properties @@ -26,6 +26,7 @@ preregistration.rebook.timespan = 24 preregistration.cancel.timespan = 24 preregistration.timespan.cancel=24 preregistration.timespan.rebook=24 +mosip.prereg.use.canonical.user_id=true service.version=v1.0 master.service.env=masterdata From c14374f66d209b4cc0a7ead2655315ff2776c5c4 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Thu, 26 Feb 2026 18:42:30 +0530 Subject: [PATCH 05/11] Changing kernel versions Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- pre-registration-booking-service/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pre-registration-booking-service/pom.xml b/pre-registration-booking-service/pom.xml index b7a282d817..6c5305ae7a 100644 --- a/pre-registration-booking-service/pom.xml +++ b/pre-registration-booking-service/pom.xml @@ -14,8 +14,8 @@ UTF-8 1.4.2 1.2.1-SNAPSHOT - 1.2.1-SNAPSHOT - 1.2.1-SNAPSHOT + 1.3.0 + 1.3.0 21 3.2.3 From 5bbaa39ce2ed75aaf0ad4abe2c626284b71cc59c Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:02:37 +0530 Subject: [PATCH 06/11] Dual backward compatibility fixes Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../service/util/BookingServiceUtil.java | 16 ++++++++------ .../src/main/resources/bootstrap.properties | 2 +- .../service/util/BookingServiceUtilTest.java | 22 +++++++++++++++---- .../src/test/resources/application.properties | 2 +- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index e2753fdf02..21e5236f62 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -145,8 +145,8 @@ public class BookingServiceUtil { @Value("${mosip.notification.timezone}") private String specificZoneId; - @Value("${mosip.prereg.use.canonical.user_id}") - private boolean useCanonicalUserId; + @Value("${mosip.prereg.pii.backward.compatibility:false}") + private boolean piiBackwardCompatibility; /** * ObjectMapper global object creation @@ -554,9 +554,6 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, } private String resolveEffectiveCrBy(String userId) { - if (!useCanonicalUserId) { - return userId; - } try { UserDetails userDetail = userDetailsService.findOrCreateByIdentifier(userId); if (userDetail != null && userDetail.getUserId() != null) { @@ -564,9 +561,14 @@ private String resolveEffectiveCrBy(String userId) { } } catch (Exception ex) { log.warn("sessionId", "idType", "id", - "Failed to resolve canonical user id for booking, using raw identifier: " + userId); + "Failed to resolve canonical user id for booking: " + userId); + } + if (piiBackwardCompatibility) { + log.warn("sessionId", "idType", "id", + "Falling back to raw identifier for booking due to backward-compatibility mode"); + return userId; } - return userId; + return ""; } /** diff --git a/pre-registration-booking-service/src/main/resources/bootstrap.properties b/pre-registration-booking-service/src/main/resources/bootstrap.properties index 69ce760c25..54351b9d9a 100644 --- a/pre-registration-booking-service/src/main/resources/bootstrap.properties +++ b/pre-registration-booking-service/src/main/resources/bootstrap.properties @@ -15,7 +15,7 @@ server.port=9095 health.config.enabled=false mosip.preregistration.booking.id.book=mosip.pre-registration.booking.book mosip.id.preregistration.booking.book=mosip.pre-registration.booking.book -mosip.prereg.use.canonical.user_id=true +mosip.prereg.pii.backward.compatibility=false #disabling health check so that client doesnt try to load properties from sprint config server every # 5 minutes (should not be done in production) diff --git a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java index 7f5769980d..8d0a7af676 100644 --- a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java +++ b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java @@ -579,7 +579,7 @@ public void emailNotificationTest() throws JsonProcessingException { @Test public void bookingEntitySetterTest() { - ReflectionTestUtils.setField(serviceUtil, "useCanonicalUserId", true); + ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", false); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00"); @@ -590,19 +590,19 @@ public void bookingEntitySetterTest() { @Test public void bookingEntitySetterLegacyCrByTest() { - ReflectionTestUtils.setField(serviceUtil, "useCanonicalUserId", false); + ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", false); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00"); bookingRequestDTO.setSlotToTime("09:13"); bookingRequestDTO.setRegDate("2018-12-06"); RegistrationBookingEntity entity = serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); - assertEquals("test-user", entity.getCrBy()); + assertEquals("00000000-0000-0000-0000-000000000001", entity.getCrBy()); } @Test public void bookingEntitySetterCanonicalFallbackToRawTest() { - ReflectionTestUtils.setField(serviceUtil, "useCanonicalUserId", true); + ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", true); Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())) .thenThrow(new RuntimeException("mapping failed")); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); @@ -614,6 +614,20 @@ public void bookingEntitySetterCanonicalFallbackToRawTest() { assertEquals("test-user", entity.getCrBy()); } + @Test + public void bookingEntitySetterStrictModeNoRawFallbackTest() { + ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", false); + Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())) + .thenThrow(new RuntimeException("mapping failed")); + BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); + bookingRequestDTO.setRegistrationCenterId("1"); + bookingRequestDTO.setSlotFromTime("09:00"); + bookingRequestDTO.setSlotToTime("09:13"); + bookingRequestDTO.setRegDate("2018-12-06"); + RegistrationBookingEntity entity = serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); + assertEquals("", entity.getCrBy()); + } + @Test public void prepareRequestMapTest() { MainRequestDTO requestDto = new MainRequestDTO<>(); diff --git a/pre-registration-booking-service/src/test/resources/application.properties b/pre-registration-booking-service/src/test/resources/application.properties index 652986f549..ad94dc4710 100644 --- a/pre-registration-booking-service/src/test/resources/application.properties +++ b/pre-registration-booking-service/src/test/resources/application.properties @@ -26,7 +26,7 @@ preregistration.rebook.timespan = 24 preregistration.cancel.timespan = 24 preregistration.timespan.cancel=24 preregistration.timespan.rebook=24 -mosip.prereg.use.canonical.user_id=true +mosip.prereg.pii.backward.compatibility=false service.version=v1.0 master.service.env=masterdata From a22d9b73ed06f7a9c49c92dcaae1136214d16a14 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 2 Mar 2026 18:14:44 +0530 Subject: [PATCH 07/11] Logger value masking Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../booking/controller/BookingController.java | 43 +++++++++++++++++-- .../service/util/BookingServiceUtil.java | 33 +++++++++++++- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java index 3d19601104..7f79fc0520 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.UUID; import io.mosip.kernel.core.exception.ParseException; import io.mosip.kernel.core.logger.spi.Logger; @@ -133,7 +134,8 @@ public ResponseEntity> bookAppoinment( @PathVariable("preRegistrationId") String preRegistrationId, @Validated @RequestBody(required = true) MainRequestDTO bookingDTO, @Parameter(hidden = true) Errors errors ) { log.info("sessionId", "idType", "id", - "In bookAppoinment method of Booking controller to book an appointment for object: " + bookingDTO); + "In bookAppoinment method of Booking controller for preRegistrationId: " + + maskIdentifier(preRegistrationId)); requestValidator.validateId(BOOKING, bookingDTO.getId(), errors); DataValidationUtil.validate(errors,BOOKING); return ResponseEntity.status(HttpStatus.OK).body(bookingService.bookAppointment(bookingDTO, preRegistrationId)); @@ -211,7 +213,8 @@ public ResponseEntity> getAppointments( public ResponseEntity> cancelBook( @PathVariable("preRegistrationId") String preRegistrationId) { log.info("sessionId", "idType", "id", - "In cancelBook method of Booking controller to cancel the appointment for object: " + preRegistrationId); + "In cancelBook method of Booking controller to cancel the appointment for preRegistrationId: " + + maskIdentifier(preRegistrationId)); return ResponseEntity.status(HttpStatus.OK) .body(bookingService.cancelAppointment(preRegistrationId)); } @@ -236,7 +239,8 @@ public ResponseEntity> cancelBook( public ResponseEntity> cancelAppointmentBatch( @PathVariable("preRegistrationId") String preRegistrationId) { log.info("sessionId", "idType", "id", - "In cancelAppointmentBatch method of Booking controller to cancel the appointment for object: " + preRegistrationId+" triggered by batch job"); + "In cancelAppointmentBatch method of Booking controller to cancel the appointment for preRegistrationId: " + + maskIdentifier(preRegistrationId) + " triggered by batch job"); return ResponseEntity.status(HttpStatus.OK) .body(bookingService.cancelAppointmentBatch(preRegistrationId)); } @@ -260,11 +264,42 @@ public ResponseEntity> cancelAppointme }) public ResponseEntity> discardIndividual( @RequestParam(value = "preRegistrationId") String preId) { - log.info("sessionId", "idType", "id", "In Booking controller for deletion of booking with preId " + preId); + log.info("sessionId", "idType", "id", + "In Booking controller for deletion of booking with preRegistrationId " + maskIdentifier(preId)); return ResponseEntity.status(HttpStatus.OK).body(bookingService.deleteBooking(preId)); } + private String maskIdentifier(String value) { + if (value == null || value.isBlank()) { + return ""; + } + String trimmed = value.trim(); + int atIndex = trimmed.indexOf('@'); + if (atIndex > 0 && atIndex < trimmed.length() - 1) { + String local = trimmed.substring(0, atIndex); + String domain = trimmed.substring(atIndex); + String visibleLocal = local.substring(0, 1); + return visibleLocal + "***" + domain; + } + if (trimmed.matches("\\+?\\d{10,12}")) { + boolean hasPlus = trimmed.startsWith("+"); + String digits = hasPlus ? trimmed.substring(1) : trimmed; + if (digits.length() <= 4) { + return (hasPlus ? "+" : "") + "****"; + } + String masked = "*".repeat(digits.length() - 4) + digits.substring(digits.length() - 4); + return (hasPlus ? "+" : "") + masked; + } + try { + UUID.fromString(trimmed); + return "***" + trimmed.substring(trimmed.length() - 6); + } catch (Exception ignored) { + } + int visible = Math.min(4, trimmed.length()); + return "***" + trimmed.substring(trimmed.length() - visible); + } + /** * Get API to fetch all the booked pre-ids within from-date and to-date range. * diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 21e5236f62..5435c34bfd 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.TimeZone; +import java.util.UUID; import jakarta.annotation.PostConstruct; @@ -561,7 +562,7 @@ private String resolveEffectiveCrBy(String userId) { } } catch (Exception ex) { log.warn("sessionId", "idType", "id", - "Failed to resolve canonical user id for booking: " + userId); + "Failed to resolve canonical user id for booking: " + maskIdentifier(userId)); } if (piiBackwardCompatibility) { log.warn("sessionId", "idType", "id", @@ -571,6 +572,36 @@ private String resolveEffectiveCrBy(String userId) { return ""; } + private String maskIdentifier(String value) { + if (value == null || value.isBlank()) { + return ""; + } + String trimmed = value.trim(); + int atIndex = trimmed.indexOf('@'); + if (atIndex > 0 && atIndex < trimmed.length() - 1) { + String local = trimmed.substring(0, atIndex); + String domain = trimmed.substring(atIndex); + String visibleLocal = local.substring(0, 1); + return visibleLocal + "***" + domain; + } + if (trimmed.matches("\\+?\\d{10,12}")) { + boolean hasPlus = trimmed.startsWith("+"); + String digits = hasPlus ? trimmed.substring(1) : trimmed; + if (digits.length() <= 4) { + return (hasPlus ? "+" : "") + "****"; + } + String masked = "*".repeat(digits.length() - 4) + digits.substring(digits.length() - 4); + return (hasPlus ? "+" : "") + masked; + } + try { + UUID.fromString(trimmed); + return "***" + trimmed.substring(trimmed.length() - 6); + } catch (Exception ignored) { + } + int visible = Math.min(4, trimmed.length()); + return "***" + trimmed.substring(trimmed.length() - visible); + } + /** * * @param notificationDTO From 52bf984be41dcb4a4e58eb6fdc422f0573aedcbc Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:03:35 +0530 Subject: [PATCH 08/11] Update BookingController.java Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../booking/controller/BookingController.java | 43 ++----------------- 1 file changed, 4 insertions(+), 39 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java index 7f79fc0520..3d19601104 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/controller/BookingController.java @@ -23,7 +23,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.UUID; import io.mosip.kernel.core.exception.ParseException; import io.mosip.kernel.core.logger.spi.Logger; @@ -134,8 +133,7 @@ public ResponseEntity> bookAppoinment( @PathVariable("preRegistrationId") String preRegistrationId, @Validated @RequestBody(required = true) MainRequestDTO bookingDTO, @Parameter(hidden = true) Errors errors ) { log.info("sessionId", "idType", "id", - "In bookAppoinment method of Booking controller for preRegistrationId: " - + maskIdentifier(preRegistrationId)); + "In bookAppoinment method of Booking controller to book an appointment for object: " + bookingDTO); requestValidator.validateId(BOOKING, bookingDTO.getId(), errors); DataValidationUtil.validate(errors,BOOKING); return ResponseEntity.status(HttpStatus.OK).body(bookingService.bookAppointment(bookingDTO, preRegistrationId)); @@ -213,8 +211,7 @@ public ResponseEntity> getAppointments( public ResponseEntity> cancelBook( @PathVariable("preRegistrationId") String preRegistrationId) { log.info("sessionId", "idType", "id", - "In cancelBook method of Booking controller to cancel the appointment for preRegistrationId: " - + maskIdentifier(preRegistrationId)); + "In cancelBook method of Booking controller to cancel the appointment for object: " + preRegistrationId); return ResponseEntity.status(HttpStatus.OK) .body(bookingService.cancelAppointment(preRegistrationId)); } @@ -239,8 +236,7 @@ public ResponseEntity> cancelBook( public ResponseEntity> cancelAppointmentBatch( @PathVariable("preRegistrationId") String preRegistrationId) { log.info("sessionId", "idType", "id", - "In cancelAppointmentBatch method of Booking controller to cancel the appointment for preRegistrationId: " - + maskIdentifier(preRegistrationId) + " triggered by batch job"); + "In cancelAppointmentBatch method of Booking controller to cancel the appointment for object: " + preRegistrationId+" triggered by batch job"); return ResponseEntity.status(HttpStatus.OK) .body(bookingService.cancelAppointmentBatch(preRegistrationId)); } @@ -264,42 +260,11 @@ public ResponseEntity> cancelAppointme }) public ResponseEntity> discardIndividual( @RequestParam(value = "preRegistrationId") String preId) { - log.info("sessionId", "idType", "id", - "In Booking controller for deletion of booking with preRegistrationId " + maskIdentifier(preId)); + log.info("sessionId", "idType", "id", "In Booking controller for deletion of booking with preId " + preId); return ResponseEntity.status(HttpStatus.OK).body(bookingService.deleteBooking(preId)); } - private String maskIdentifier(String value) { - if (value == null || value.isBlank()) { - return ""; - } - String trimmed = value.trim(); - int atIndex = trimmed.indexOf('@'); - if (atIndex > 0 && atIndex < trimmed.length() - 1) { - String local = trimmed.substring(0, atIndex); - String domain = trimmed.substring(atIndex); - String visibleLocal = local.substring(0, 1); - return visibleLocal + "***" + domain; - } - if (trimmed.matches("\\+?\\d{10,12}")) { - boolean hasPlus = trimmed.startsWith("+"); - String digits = hasPlus ? trimmed.substring(1) : trimmed; - if (digits.length() <= 4) { - return (hasPlus ? "+" : "") + "****"; - } - String masked = "*".repeat(digits.length() - 4) + digits.substring(digits.length() - 4); - return (hasPlus ? "+" : "") + masked; - } - try { - UUID.fromString(trimmed); - return "***" + trimmed.substring(trimmed.length() - 6); - } catch (Exception ignored) { - } - int visible = Math.min(4, trimmed.length()); - return "***" + trimmed.substring(trimmed.length() - visible); - } - /** * Get API to fetch all the booked pre-ids within from-date and to-date range. * From 5d118e51e080f8347647e4737222f46561c1811a Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:21:31 +0530 Subject: [PATCH 09/11] Fixed empty return value issues Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../booking/service/util/BookingServiceUtil.java | 4 +++- .../test/service/util/BookingServiceUtilTest.java | 15 +++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 5435c34bfd..a1ad68332d 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -70,6 +70,7 @@ import io.mosip.preregistration.booking.exception.BookingPreIdNotFoundException; import io.mosip.preregistration.booking.exception.BookingRegistrationCenterIdNotFoundException; import io.mosip.preregistration.booking.exception.BookingTimeSlotNotSeletectedException; +import io.mosip.preregistration.booking.exception.AppointmentBookingFailedException; import io.mosip.preregistration.booking.exception.DemographicGetStatusException; import io.mosip.preregistration.booking.exception.InvalidDateTimeFormatException; import io.mosip.preregistration.booking.exception.RecordNotFoundException; @@ -569,7 +570,8 @@ private String resolveEffectiveCrBy(String userId) { "Falling back to raw identifier for booking due to backward-compatibility mode"); return userId; } - return ""; + throw new AppointmentBookingFailedException(ErrorCodes.PRG_BOOK_RCI_005.getCode(), + ErrorMessages.APPOINTMENT_BOOKING_FAILED.getMessage()); } private String maskIdentifier(String value) { diff --git a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java index 8d0a7af676..66c00443c0 100644 --- a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java +++ b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Map; +import io.mosip.preregistration.booking.exception.*; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -52,15 +53,6 @@ import io.mosip.preregistration.booking.dto.RegistrationCenterResponseDto; import io.mosip.preregistration.booking.dto.SlotDto; import io.mosip.preregistration.booking.entity.AvailibityEntity; -import io.mosip.preregistration.booking.exception.AppointmentReBookingFailedException; -import io.mosip.preregistration.booking.exception.AvailablityNotFoundException; -import io.mosip.preregistration.booking.exception.BookingDateNotSeletectedException; -import io.mosip.preregistration.booking.exception.BookingPreIdNotFoundException; -import io.mosip.preregistration.booking.exception.BookingRegistrationCenterIdNotFoundException; -import io.mosip.preregistration.booking.exception.BookingTimeSlotNotSeletectedException; -import io.mosip.preregistration.booking.exception.InvalidDateTimeFormatException; -import io.mosip.preregistration.booking.exception.RecordNotFoundException; -import io.mosip.preregistration.booking.exception.TimeSpanException; import io.mosip.preregistration.booking.repository.BookingAvailabilityRepository; import io.mosip.preregistration.booking.repository.RegistrationBookingRepository; import io.mosip.preregistration.booking.repository.impl.BookingDAO; @@ -614,7 +606,7 @@ public void bookingEntitySetterCanonicalFallbackToRawTest() { assertEquals("test-user", entity.getCrBy()); } - @Test + @Test(expected = AppointmentBookingFailedException.class) public void bookingEntitySetterStrictModeNoRawFallbackTest() { ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", false); Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())) @@ -624,8 +616,7 @@ public void bookingEntitySetterStrictModeNoRawFallbackTest() { bookingRequestDTO.setSlotFromTime("09:00"); bookingRequestDTO.setSlotToTime("09:13"); bookingRequestDTO.setRegDate("2018-12-06"); - RegistrationBookingEntity entity = serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); - assertEquals("", entity.getCrBy()); + serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); } @Test From 14a3e5b4627a8e2cf1d93f2635d3da30ef7866ff Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 23 Mar 2026 13:01:22 +0530 Subject: [PATCH 10/11] Core changes Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../service/util/BookingServiceUtil.java | 68 +++++++------------ .../service/util/BookingServiceUtilTest.java | 19 +++--- 2 files changed, 37 insertions(+), 50 deletions(-) diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index a1ad68332d..95f3e173a7 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -147,7 +147,7 @@ public class BookingServiceUtil { @Value("${mosip.notification.timezone}") private String specificZoneId; - @Value("${mosip.prereg.pii.backward.compatibility:false}") + @Value("${mosip.prereg.pii.backward.compatibility}") private boolean piiBackwardCompatibility; /** @@ -556,52 +556,36 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, } private String resolveEffectiveCrBy(String userId) { + String maskedUserId = userDetailsService.maskIdentifier(userId); try { - UserDetails userDetail = userDetailsService.findOrCreateByIdentifier(userId); - if (userDetail != null && userDetail.getUserId() != null) { - return userDetail.getUserId().toString(); - } - } catch (Exception ex) { + String effectiveCrBy = piiBackwardCompatibility + ? userDetailsService.resolveCanonicalUserIdOrIdentifier(userId) + : userDetailsService.resolveCanonicalUserId(userId).orElseThrow(() -> + new AppointmentBookingFailedException(ErrorCodes.PRG_BOOK_RCI_005.getCode(), + ErrorMessages.APPOINTMENT_BOOKING_FAILED.getMessage())); + + boolean canonicalApplied = effectiveCrBy != null && !effectiveCrBy.isBlank() + && !effectiveCrBy.trim().equals(userId == null ? "" : userId.trim()); + + log.info("sessionId", "idType", "id", + "Resolved effective user id for booking write. maskedUserId=" + maskedUserId + + ", canonicalApplied=" + canonicalApplied); + return effectiveCrBy; + } catch (AppointmentBookingFailedException ex) { log.warn("sessionId", "idType", "id", - "Failed to resolve canonical user id for booking: " + maskIdentifier(userId)); - } - if (piiBackwardCompatibility) { + "Strict canonical resolution failed for booking user " + maskedUserId); + throw ex; + } catch (Exception ex) { log.warn("sessionId", "idType", "id", - "Falling back to raw identifier for booking due to backward-compatibility mode"); - return userId; - } - throw new AppointmentBookingFailedException(ErrorCodes.PRG_BOOK_RCI_005.getCode(), - ErrorMessages.APPOINTMENT_BOOKING_FAILED.getMessage()); - } - - private String maskIdentifier(String value) { - if (value == null || value.isBlank()) { - return ""; - } - String trimmed = value.trim(); - int atIndex = trimmed.indexOf('@'); - if (atIndex > 0 && atIndex < trimmed.length() - 1) { - String local = trimmed.substring(0, atIndex); - String domain = trimmed.substring(atIndex); - String visibleLocal = local.substring(0, 1); - return visibleLocal + "***" + domain; - } - if (trimmed.matches("\\+?\\d{10,12}")) { - boolean hasPlus = trimmed.startsWith("+"); - String digits = hasPlus ? trimmed.substring(1) : trimmed; - if (digits.length() <= 4) { - return (hasPlus ? "+" : "") + "****"; + "Failed to resolve effective booking user id for " + maskedUserId); + if (piiBackwardCompatibility) { + log.warn("sessionId", "idType", "id", + "Falling back to raw identifier for booking due to backward-compatibility mode"); + return userId; } - String masked = "*".repeat(digits.length() - 4) + digits.substring(digits.length() - 4); - return (hasPlus ? "+" : "") + masked; - } - try { - UUID.fromString(trimmed); - return "***" + trimmed.substring(trimmed.length() - 6); - } catch (Exception ignored) { + throw new AppointmentBookingFailedException(ErrorCodes.PRG_BOOK_RCI_005.getCode(), + ErrorMessages.APPOINTMENT_BOOKING_FAILED.getMessage()); } - int visible = Math.min(4, trimmed.length()); - return "***" + trimmed.substring(trimmed.length() - visible); } /** diff --git a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java index 66c00443c0..567c1cfb9b 100644 --- a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java +++ b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import io.mosip.preregistration.booking.exception.*; import org.junit.Before; @@ -62,7 +63,6 @@ import io.mosip.preregistration.core.common.dto.NotificationDTO; import io.mosip.preregistration.core.common.dto.ResponseWrapper; import io.mosip.preregistration.core.common.entity.RegistrationBookingEntity; -import io.mosip.preregistration.core.common.entity.UserDetails; import io.mosip.preregistration.core.common.service.UserDetailsService; import io.mosip.preregistration.core.exception.MasterDataNotAvailableException; import io.mosip.preregistration.core.exception.RestCallException; @@ -139,9 +139,12 @@ public void setup() throws Exception { SecurityContextHolder.setContext(securityContext); Mockito.when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser); Mockito.when(applicationUser.getUserId()).thenReturn("test-user"); - UserDetails mappedUser = new UserDetails(); - mappedUser.setUserId(java.util.UUID.fromString("00000000-0000-0000-0000-000000000001")); - Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())).thenReturn(mappedUser); + Mockito.when(userDetailsService.resolveCanonicalUserId("test-user")) + .thenReturn(Optional.of("00000000-0000-0000-0000-000000000001")); + Mockito.when(userDetailsService.resolveCanonicalUserIdOrIdentifier("test-user")) + .thenReturn("00000000-0000-0000-0000-000000000001"); + Mockito.when(userDetailsService.maskIdentifier(Mockito.anyString())) + .thenAnswer(invocation -> invocation.getArgument(0)); centerDto.setId("10001"); centerDto.setLangCode("eng"); centerDto.setCenterStartTime(startTime); @@ -595,8 +598,8 @@ public void bookingEntitySetterLegacyCrByTest() { @Test public void bookingEntitySetterCanonicalFallbackToRawTest() { ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", true); - Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())) - .thenThrow(new RuntimeException("mapping failed")); + Mockito.when(userDetailsService.resolveCanonicalUserIdOrIdentifier("test-user")) + .thenReturn("test-user"); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00"); @@ -609,8 +612,8 @@ public void bookingEntitySetterCanonicalFallbackToRawTest() { @Test(expected = AppointmentBookingFailedException.class) public void bookingEntitySetterStrictModeNoRawFallbackTest() { ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", false); - Mockito.when(userDetailsService.findOrCreateByIdentifier(Mockito.anyString())) - .thenThrow(new RuntimeException("mapping failed")); + Mockito.when(userDetailsService.resolveCanonicalUserId("test-user")) + .thenReturn(Optional.empty()); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00"); From e8a5a491eaf57fe6fa2078a97fd5529db606fe97 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:53:28 +0530 Subject: [PATCH 11/11] fix: update resolveEffectiveCrBy to use getOrCreateInternalUserId and remove raw PII fallback Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- pre-registration-booking-service/pom.xml | 6 +++++ .../booking/service/BookingService.java | 16 +++++++++++-- .../service/util/BookingServiceUtil.java | 23 ++++--------------- .../service/util/BookingServiceUtilTest.java | 21 ++++++----------- 4 files changed, 32 insertions(+), 34 deletions(-) diff --git a/pre-registration-booking-service/pom.xml b/pre-registration-booking-service/pom.xml index 6c5305ae7a..b89a4d5307 100644 --- a/pre-registration-booking-service/pom.xml +++ b/pre-registration-booking-service/pom.xml @@ -14,6 +14,7 @@ UTF-8 1.4.2 1.2.1-SNAPSHOT + 1.2.1-SNAPSHOT 1.3.0 1.3.0 21 @@ -144,6 +145,11 @@ pre-registration-core ${pre.registration.core.version} + + io.mosip.preregistration + pre-registration-application-service + ${pre.registration.application.service.version} + io.mosip.kernel kernel-core diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/BookingService.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/BookingService.java index c4ac2fe0a9..3b8c2072ca 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/BookingService.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/BookingService.java @@ -45,6 +45,7 @@ import io.mosip.preregistration.booking.exception.RecordNotFoundException; import io.mosip.preregistration.booking.exception.util.BookingExceptionCatcher; import io.mosip.preregistration.booking.repository.impl.BookingDAO; +import io.mosip.preregistration.application.service.ApplicationIdentityMigrationService; import io.mosip.preregistration.booking.service.util.BookingLock; import io.mosip.preregistration.booking.service.util.BookingServiceUtil; import io.mosip.preregistration.core.code.AuditLogVariables; @@ -83,6 +84,9 @@ public class BookingService implements BookingServiceIntf { @Autowired BookingServiceUtil serviceUtil; + @Autowired + private ApplicationIdentityMigrationService applicationIdentityMigrationService; + /** * Reference for ${preregistration.availability.sync} from property file */ @@ -641,8 +645,9 @@ public BookingStatusDTO book(String preRegistrationId, BookingRequestDTO booking " and Date and Time " + availableEntity.getRegDate() + " " + availableEntity.getFromTime()); if (serviceUtil.isKiosksAvailable(availableEntity)) { /* Updating booking */ - bookingDAO.saveRegistrationEntityForBooking( + RegistrationBookingEntity bookingEntity = bookingDAO.saveRegistrationEntityForBooking( serviceUtil.bookingEntitySetter(preRegistrationId, bookingRequestDTO)); + applicationIdentityMigrationService.migrateRawUserToEffectiveUser(preRegistrationId, bookingEntity.getCrBy()); /* Reduce Availability */ availableEntity.setAvailableKiosks(availableEntity.getAvailableKiosks() - 1); AvailibityEntity availableUpdate = bookingDAO.updateAvailibityEntity(availableEntity); @@ -704,6 +709,10 @@ public CancelBookingResponseDTO cancelBooking(String preRegistrationId, boolean serviceUtil.timeSpanCheckForCancle(bookedDateTime); } + String effectiveUserId = applicationIdentityMigrationService + .resolveEffectiveUserId(bookingEntity.getCrBy()); + applicationIdentityMigrationService.migrateRawUserToEffectiveUser(preRegistrationId, + effectiveUserId); /* Deleting the canceled booking */ // bookingDAO.deleteRegistrationEntity(bookingEntity); bookingDAO.deleteByPreRegistrationId(preRegistrationId); @@ -765,6 +774,9 @@ public MainResponseDTO deleteBooking(String preregId) { if (validationUtil.requstParamValidator(requestParamMap) && serviceUtil.checkApplicationStatus(preregId)) { RegistrationBookingEntity registrationEntityList = bookingDAO.findByPreRegistrationId(preregId); + String effectiveUserId = applicationIdentityMigrationService + .resolveEffectiveUserId(registrationEntityList.getCrBy()); + applicationIdentityMigrationService.migrateRawUserToEffectiveUser(preregId, effectiveUserId); String str = registrationEntityList.getRegDate() + " " + registrationEntityList.getSlotFromTime(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime bookedDateTime = LocalDateTime.parse(str, formatter); @@ -782,7 +794,7 @@ public MainResponseDTO deleteBooking(String preregId) { bookingDAO.updateAvailibityEntity(availableEntity); deleteDto.setPreRegistrationId(registrationEntityList.getPreregistrationId()); - deleteDto.setDeletedBy(registrationEntityList.getCrBy()); + deleteDto.setDeletedBy(effectiveUserId); deleteDto.setDeletedDateTime(new Date(System.currentTimeMillis())); } diff --git a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java index 95f3e173a7..ebe1142cf6 100644 --- a/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java +++ b/pre-registration-booking-service/src/main/java/io/mosip/preregistration/booking/service/util/BookingServiceUtil.java @@ -91,6 +91,8 @@ import io.mosip.preregistration.core.util.UUIDGeneratorUtil; import io.mosip.preregistration.core.util.ValidationUtil; import io.mosip.preregistration.core.common.service.UserDetailsService; +import io.mosip.preregistration.core.exception.UserLookupException; +import io.mosip.preregistration.core.util.GenericUtil; /** * This class provides the utility methods for Booking application. @@ -556,33 +558,18 @@ public RegistrationBookingEntity bookingEntitySetter(String preRegistrationId, } private String resolveEffectiveCrBy(String userId) { - String maskedUserId = userDetailsService.maskIdentifier(userId); + String maskedUserId = GenericUtil.maskIdentifier(userId); try { - String effectiveCrBy = piiBackwardCompatibility - ? userDetailsService.resolveCanonicalUserIdOrIdentifier(userId) - : userDetailsService.resolveCanonicalUserId(userId).orElseThrow(() -> - new AppointmentBookingFailedException(ErrorCodes.PRG_BOOK_RCI_005.getCode(), - ErrorMessages.APPOINTMENT_BOOKING_FAILED.getMessage())); - + String effectiveCrBy = userDetailsService.getOrCreateInternalUserId(userId); boolean canonicalApplied = effectiveCrBy != null && !effectiveCrBy.isBlank() && !effectiveCrBy.trim().equals(userId == null ? "" : userId.trim()); - log.info("sessionId", "idType", "id", "Resolved effective user id for booking write. maskedUserId=" + maskedUserId + ", canonicalApplied=" + canonicalApplied); return effectiveCrBy; - } catch (AppointmentBookingFailedException ex) { - log.warn("sessionId", "idType", "id", - "Strict canonical resolution failed for booking user " + maskedUserId); - throw ex; - } catch (Exception ex) { + } catch (UserLookupException ex) { log.warn("sessionId", "idType", "id", "Failed to resolve effective booking user id for " + maskedUserId); - if (piiBackwardCompatibility) { - log.warn("sessionId", "idType", "id", - "Falling back to raw identifier for booking due to backward-compatibility mode"); - return userId; - } throw new AppointmentBookingFailedException(ErrorCodes.PRG_BOOK_RCI_005.getCode(), ErrorMessages.APPOINTMENT_BOOKING_FAILED.getMessage()); } diff --git a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java index 567c1cfb9b..2c613ec261 100644 --- a/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java +++ b/pre-registration-booking-service/src/test/java/io/mosip/preregistration/booking/test/service/util/BookingServiceUtilTest.java @@ -13,9 +13,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; - import io.mosip.preregistration.booking.exception.*; +import io.mosip.preregistration.core.exception.UserLookupException; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -139,12 +138,8 @@ public void setup() throws Exception { SecurityContextHolder.setContext(securityContext); Mockito.when(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).thenReturn(applicationUser); Mockito.when(applicationUser.getUserId()).thenReturn("test-user"); - Mockito.when(userDetailsService.resolveCanonicalUserId("test-user")) - .thenReturn(Optional.of("00000000-0000-0000-0000-000000000001")); - Mockito.when(userDetailsService.resolveCanonicalUserIdOrIdentifier("test-user")) + Mockito.when(userDetailsService.getOrCreateInternalUserId("test-user")) .thenReturn("00000000-0000-0000-0000-000000000001"); - Mockito.when(userDetailsService.maskIdentifier(Mockito.anyString())) - .thenAnswer(invocation -> invocation.getArgument(0)); centerDto.setId("10001"); centerDto.setLangCode("eng"); centerDto.setCenterStartTime(startTime); @@ -596,24 +591,22 @@ public void bookingEntitySetterLegacyCrByTest() { } @Test - public void bookingEntitySetterCanonicalFallbackToRawTest() { + public void bookingEntitySetterWithCompatibilityModeWritesUuidTest() { ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", true); - Mockito.when(userDetailsService.resolveCanonicalUserIdOrIdentifier("test-user")) - .thenReturn("test-user"); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00"); bookingRequestDTO.setSlotToTime("09:13"); bookingRequestDTO.setRegDate("2018-12-06"); RegistrationBookingEntity entity = serviceUtil.bookingEntitySetter("1234568687844744", bookingRequestDTO); - assertEquals("test-user", entity.getCrBy()); + assertEquals("00000000-0000-0000-0000-000000000001", entity.getCrBy()); } @Test(expected = AppointmentBookingFailedException.class) - public void bookingEntitySetterStrictModeNoRawFallbackTest() { + public void bookingEntitySetterThrowsOnUuidResolutionFailureTest() { ReflectionTestUtils.setField(serviceUtil, "piiBackwardCompatibility", false); - Mockito.when(userDetailsService.resolveCanonicalUserId("test-user")) - .thenReturn(Optional.empty()); + Mockito.when(userDetailsService.getOrCreateInternalUserId("test-user")) + .thenThrow(new UserLookupException("PRG_CORE_REQ_024", "Failed to resolve internal user ID")); BookingRequestDTO bookingRequestDTO = new BookingRequestDTO(); bookingRequestDTO.setRegistrationCenterId("1"); bookingRequestDTO.setSlotFromTime("09:00");