From e2fa9b14344dcf2f0b8fe43852571ed2b74cc55b Mon Sep 17 00:00:00 2001 From: ase-101 Date: Wed, 11 Mar 2026 22:40:54 +0530 Subject: [PATCH 1/5] ES-2914 Signed-off-by: ase-101 --- .../IdrepoProfileRegistryPluginImpl.java | 388 +++++++----------- .../IdrepoProfileRegistryPluginImplTest.java | 147 +++---- 2 files changed, 221 insertions(+), 314 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 2fc2151..88f53a2 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -71,19 +71,13 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("#{'${mosip.signup.idrepo.default.selected-handles:phone}'.split(',')}") private List defaultSelectedHandles; - - @Value("${mosip.signup.idrepo.identifier-field:phone}") + + @Value("${mosip.signup.identifier.name}") private String identifierField; @Value("${mosip.signup.idrepo.schema-url}") private String schemaUrl; - @Value("#{'${mosip.kernel.idobjectvalidator.mandatory-attributes.id-repository.new-registration:}'.split(',')}") - private List requiredFields; - - @Value("#{'${mosip.kernel.idobjectvalidator.mandatory-attributes.id-repository.update-uin:}'.split(',')}") - private List requiredUpdateFields; - @Value("${mosip.signup.idrepo.add-identity.request.id}") private String addIdentityRequestID; @@ -126,6 +120,18 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.idrepo.uin.length:10}") private int uinLength; + @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") + private String uiSpecUrl; + + @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:/0/jsonSpec/0/spec}") + private String uiSpecJsonpath; + + @Value("${mosip.signup.mosipid.dynamic-fields.endpoint}") + private String dynamicFieldsBaseUrl; + + @Value("${mosip.signup.mosipid.doc-types-category.endpoint}") + private String docTypesAndCategoryBaseUrl; + @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; @@ -139,36 +145,6 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private BiometricUtil biometricUtil; - @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") - private String uiSpecUrl; - - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.schema}") - private String schemaJsonpath; - - @Value("${mosip.signup.mosipid.uispec.allowedvalues-jsonpath:$[0].jsonSpec[0].spec.allowedValues}") - private String allowedValuesJsonpath; - - @Value("${mosip.signup.mosipid.uispec.i18values-jsonpath:$[0].jsonSpec[0].spec.i18nValues}") - private String i18nValuesJsonpath; - - @Value("${mosip.signup.mosipid.uispec.i18values-errors-jsonpath:$[0].jsonSpec[0].spec.i18nValues.errors}") - private String i18nValuesErrorJsonpath; - - @Value("${mosip.signup.mosipid.uispec.maxuploadfilesize-jsonpath:$[0].jsonSpec[0].spec.maxUploadFileSize}") - private String maxUploadFileSizeJsonpath; - - @Value("${mosip.signup.mosipid.uispec.errors-jsonpath:$[0].jsonSpec[0].spec.errors}") - private String errorsJsonpath; - - @Value("#{${mosip.signup.mosipid.uispec.errors:null}}") - private Map errorsFromConfig = new HashMap<>(); - - @Value("${mosip.signup.mosipid.dynamic-fields.endpoint}") - private String dynamicFieldsBaseUrl; - - @Value("${mosip.signup.mosipid.doc-types-category.endpoint}") - private String docTypesAndCategoryBaseUrl; - @PostConstruct public void init() { @@ -177,191 +153,6 @@ public void init() { registry.registerServiceProvider(new J2KImageReaderSpi()); } - /** - * Read the i18nValues from the UI-spec schema - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @return i18nValues - */ - private ObjectNode readI18nValues(String responseJson) { - Object i18nValueResponse; - ObjectNode i18nValues; - try { - i18nValueResponse = JsonPath.read(responseJson, i18nValuesJsonpath); - i18nValues = objectMapper.convertValue(i18nValueResponse, ObjectNode.class); - i18nValues.set("errors", objectMapper.valueToTree(readErrors(responseJson, i18nValuesErrorJsonpath))); - } catch (PathNotFoundException e) { - log.error("i18nValues not found in schema"); - i18nValues = objectMapper.createObjectNode(); - } - return i18nValues; - } - - /** - * Read the allowed values from master UI-spec and if not found read it from master data. - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @return allowedValues - */ - private JsonNode readAllowedValues(String responseJson) { - JsonNode allowedValues; - ObjectNode allowedValuesFromSpec = objectMapper.convertValue(JsonPath.read(responseJson, allowedValuesJsonpath), ObjectNode.class); - if (allowedValuesFromSpec != null && !allowedValuesFromSpec.isEmpty()) { - allowedValues = allowedValuesFromSpec; //allowed values from UI-Spec - } else { - allowedValues = generateAllowedValues(); //allowed values from master-data - } - return allowedValues; - } - - /** - * Read the errors from UI-spec if not present, from config - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @param jsonpath errors path inside schema - * @return errors - */ - private Object readErrors(String responseJson, String jsonpath) { - Object errors; - try { - errors = JsonPath.read(responseJson, jsonpath); - } catch (PathNotFoundException e) { - errors = errorsFromConfig; - } - return errors; - } - - /** - * Reads max upload file size from the UI-spec - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @return maxUploadFileSize - */ - private Object readMaxUploadFileSize(String responseJson) { - Object maxUploadFileSize; - try { - maxUploadFileSize = JsonPath.read(responseJson, maxUploadFileSizeJsonpath); - } catch (PathNotFoundException e) { - log.error("maxUploadFileSize not found in schema, setting to default"); - maxUploadFileSize = 5242880; - } - return maxUploadFileSize; - } - - /** - * Generate combined JsonNode from List dynamicFields and List documentCategories - * @return JsonNode containing the allowed values. - */ - public JsonNode generateAllowedValues() { - ObjectNode result = objectMapper.createObjectNode(); - fetchAndProcessDynamicFields(result); - fetchAndProcessDocTypesAndCategories(result); - return result; - } - - private String buildDynamicFieldsUrl(int pageNumber, int pageSize) { - return String.format(dynamicFieldsBaseUrl, pageNumber, pageSize); - } - - /** - * Fetch and process document types and categories - */ - private void fetchAndProcessDocTypesAndCategories(ObjectNode result) { - ResponseEntity response = restTemplate.getForEntity(docTypesAndCategoryBaseUrl, JsonNode.class); - JsonNode responseBody = response.getBody(); - - if (responseBody != null && responseBody.has("response")) { - JsonNode data = responseBody.get("response").get("documentCategories"); - if (data != null && data.isArray()) { - for (JsonNode item : data) { - if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; - - String categoryCode = item.hasNonNull("code") ? item.get("code").asText() : null; - String langCode = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; - JsonNode documentTypes = item.get("documentTypes"); - - if (categoryCode == null || langCode == null || documentTypes == null || !documentTypes.isArray()) - continue; - - ObjectNode docTypeMap = (ObjectNode) result.get(categoryCode); - if (docTypeMap == null) { - docTypeMap = objectMapper.createObjectNode(); - result.set(categoryCode, docTypeMap); - } - - for (JsonNode docType : documentTypes) { - String docTypeCode = docType.hasNonNull("code") ? docType.get("code").asText() : null; - String docTypeName = docType.hasNonNull("name") ? docType.get("name").asText() : null; - if (docTypeCode == null || docTypeName == null) continue; - - ObjectNode langMap = (ObjectNode) docTypeMap.get(docTypeCode); - if (langMap == null) { - langMap = objectMapper.createObjectNode(); - docTypeMap.set(docTypeCode, langMap); - } - langMap.put(langCode, docTypeName); - } - } - } - } - } - - /** - * Fetch and processes the dynamic fields JSON list and adds their structured data into the provided ObjectNode. - * @param result The ObjectNode where data is accumulated - */ - private void fetchAndProcessDynamicFields(ObjectNode result) { - int pageNumber = 0; - int pageSize = 10; - int totalPages = 1; - int totalItems = 0; - - while (pageNumber < totalPages) { - String url = buildDynamicFieldsUrl(pageNumber, pageSize); - ResponseEntity response = restTemplate.getForEntity(url, JsonNode.class); - JsonNode responseBody = response.getBody(); - if (responseBody != null && responseBody.has("response")) { - JsonNode responseNode = responseBody.get("response"); - if (pageNumber == 0) { - totalPages = objectMapper.convertValue(responseNode.get("totalPages"), Integer.class); - totalItems = objectMapper.convertValue(responseNode.get("totalItems"), Integer.class); - } - JsonNode data = responseNode.get("data"); - if (data != null && data.isArray()) { - for (JsonNode item : data) { - if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; - - String name = item.hasNonNull("name") ? item.get("name").asText() : null; - String lang = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; - JsonNode fieldValues = item.get("fieldVal"); - - if (name == null || lang == null || fieldValues == null || !fieldValues.isArray()) continue; - - ObjectNode nameNode = (ObjectNode) result.get(name); - if (nameNode == null) { - nameNode = objectMapper.createObjectNode(); - result.set(name, nameNode); - } - - for (JsonNode fv : fieldValues) { - String code = fv.hasNonNull("code") ? fv.get("code").asText() : null; - String value = fv.hasNonNull("value") ? fv.get("value").asText() : null; - if (code == null || value == null) continue; - - ObjectNode langMap = (ObjectNode) nameNode.get(code); - if (langMap == null) { - langMap = objectMapper.createObjectNode(); - nameNode.set(code, langMap); - } - langMap.put(lang, value); - } - } - } - } - pageNumber++; - int remainingItems = totalItems - (pageNumber * pageSize); - if (remainingItems < pageSize) { - pageSize = remainingItems; - } - } - } - @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { @@ -534,26 +325,18 @@ public boolean isMatch(JsonNode identity, JsonNode inputChallenge) { @Override public JsonNode getUISpecification() { - String responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { - }) - .getResponse() - .toString(); - Object schema = JsonPath.read(responseJson, schemaJsonpath); - Object errors = readErrors(responseJson, errorsJsonpath); - ObjectNode i18nValues = readI18nValues(responseJson); - JsonNode allowedValues = readAllowedValues(responseJson); - Object maxUploadFileSize = readMaxUploadFileSize(responseJson); - - return objectMapper.valueToTree( - Map.ofEntries( - Map.entry("schema", schema), - Map.entry("errors", errors), - Map.entry("i18nValues", i18nValues), - Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)), - Map.entry("allowedValues", allowedValues), - Map.entry("maxUploadFileSize", maxUploadFileSize) - ) - ); + JsonNode responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { + }).getResponse(); + ObjectNode uiSpec = (ObjectNode) responseJson.at(uiSpecJsonpath); + uiSpec.putIfAbsent("language", objectMapper.valueToTree(Map.of("mandatory", mandatoryLanguages, + "optional", optionalLanguages))); + + if(!uiSpec.has("allowedValues")) + uiSpec.putIfAbsent("allowedValues", fetchAllowedValuesFromMasterDataService()); + + uiSpec.putIfAbsent("maxUploadFileSize", objectMapper.valueToTree(5242880)); //5MB default max upload file size + uiSpec.putIfAbsent("resetPasswordChallengeFields", objectMapper.valueToTree(List.of("fullName"))); + return uiSpec; } private SchemaResponse getSchemaJson(double version) throws ProfileException { @@ -837,4 +620,123 @@ private ArrayNode buildDocuments(JsonNode inputJson) { return documents; } + + /** + * Generate combined JsonNode from List dynamicFields and List documentCategories + * @return JsonNode containing the allowed values. + */ + public JsonNode fetchAllowedValuesFromMasterDataService() { + ObjectNode result = objectMapper.createObjectNode(); + fetchAndProcessDynamicFields(result); + fetchAndProcessDocTypesAndCategories(result); + return result; + } + + private String buildDynamicFieldsUrl(int pageNumber, int pageSize) { + return String.format(dynamicFieldsBaseUrl, pageNumber, pageSize); + } + + /** + * Fetch and process document types and categories + */ + private void fetchAndProcessDocTypesAndCategories(ObjectNode result) { + ResponseEntity response = restTemplate.getForEntity(docTypesAndCategoryBaseUrl, JsonNode.class); + JsonNode responseBody = response.getBody(); + + if (responseBody != null && responseBody.has("response")) { + JsonNode data = responseBody.get("response").get("documentCategories"); + if (data != null && data.isArray()) { + for (JsonNode item : data) { + if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; + + String categoryCode = item.hasNonNull("code") ? item.get("code").asText() : null; + String langCode = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; + JsonNode documentTypes = item.get("documentTypes"); + + if (categoryCode == null || langCode == null || documentTypes == null || !documentTypes.isArray()) + continue; + + ObjectNode docTypeMap = (ObjectNode) result.get(categoryCode); + if (docTypeMap == null) { + docTypeMap = objectMapper.createObjectNode(); + result.set(categoryCode, docTypeMap); + } + + for (JsonNode docType : documentTypes) { + String docTypeCode = docType.hasNonNull("code") ? docType.get("code").asText() : null; + String docTypeName = docType.hasNonNull("name") ? docType.get("name").asText() : null; + if (docTypeCode == null || docTypeName == null) continue; + + ObjectNode langMap = (ObjectNode) docTypeMap.get(docTypeCode); + if (langMap == null) { + langMap = objectMapper.createObjectNode(); + docTypeMap.set(docTypeCode, langMap); + } + langMap.put(langCode, docTypeName); + } + } + } + } + } + + /** + * Fetch and processes the dynamic fields JSON list and adds their structured data into the provided ObjectNode. + * @param result The ObjectNode where data is accumulated + */ + private void fetchAndProcessDynamicFields(ObjectNode result) { + int pageNumber = 0; + int pageSize = 10; + int totalPages = 1; + int totalItems = 0; + + while (pageNumber < totalPages) { + String url = buildDynamicFieldsUrl(pageNumber, pageSize); + ResponseEntity response = restTemplate.getForEntity(url, JsonNode.class); + JsonNode responseBody = response.getBody(); + if (responseBody != null && responseBody.has("response")) { + JsonNode responseNode = responseBody.get("response"); + if (pageNumber == 0) { + totalPages = objectMapper.convertValue(responseNode.get("totalPages"), Integer.class); + totalItems = objectMapper.convertValue(responseNode.get("totalItems"), Integer.class); + } + JsonNode data = responseNode.get("data"); + if (data != null && data.isArray()) { + for (JsonNode item : data) { + if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; + + String name = item.hasNonNull("name") ? item.get("name").asText() : null; + String lang = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; + JsonNode fieldValues = item.get("fieldVal"); + + if (name == null || lang == null || fieldValues == null || !fieldValues.isArray()) continue; + + ObjectNode nameNode = (ObjectNode) result.get(name); + if (nameNode == null) { + nameNode = objectMapper.createObjectNode(); + result.set(name, nameNode); + } + + for (JsonNode fv : fieldValues) { + String code = fv.hasNonNull("code") ? fv.get("code").asText() : null; + String value = fv.hasNonNull("value") ? fv.get("value").asText() : null; + if (code == null || value == null) continue; + + ObjectNode langMap = (ObjectNode) nameNode.get(code); + if (langMap == null) { + langMap = objectMapper.createObjectNode(); + nameNode.set(code, langMap); + } + langMap.put(lang, value); + } + } + } + } + pageNumber++; + int remainingItems = totalItems - (pageNumber * pageSize); + if (remainingItems < pageSize) { + pageSize = remainingItems; + } + } + } + } diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 0052b72..78e90e0 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -1,5 +1,6 @@ package io.mosip.signup.plugin.mosipid.service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -62,6 +63,7 @@ public void beforeEach(){ defaultSelectedHandles.add("email"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "defaultSelectedHandles",defaultSelectedHandles); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "objectMapper",objectMapper); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecJsonpath", "/0/jsonSpec/0/spec"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getUinEndpoint","http://localhost:8080/identity/v1/uin"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "schemaUrl","http://localhost:8080/identity/v1/schema/"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/identity/v1/identity/"); @@ -74,12 +76,6 @@ public void beforeEach(){ ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "mandatoryLanguages", List.of("en")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "optionalLanguages", List.of("fr","ar")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uinLength", 10); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "schemaJsonpath", "$[0].jsonSpec[0].schema"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "errorsJsonpath", "$[0].jsonSpec[0].errors"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "i18nValuesJsonpath", "$[0].jsonSpec[0].i18nValues"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "i18nValuesErrorJsonpath", "$[0].jsonSpec[0].i18nValues.errors"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "allowedValuesJsonpath", "$[0].jsonSpec[0].allowedValues"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "maxUploadFileSizeJsonpath", "$[0].jsonSpec[0].maxUploadFileSize"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecUrl", "http://mock/uispec"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "biometricDataFieldName", "individualBiometrics"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "defaultSelectedHandles", List.of("phone")); @@ -564,55 +560,14 @@ private JsonNode createIdentity() { } @Test - public void generateAllowedValues_withValidDetails_thenPass() { - ObjectNode dynamicItem = objectMapper.createObjectNode(); - dynamicItem.put("isActive", true); - dynamicItem.put("name", "fieldName"); - dynamicItem.put("langCode", "eng"); - - ArrayNode fieldValArray = objectMapper.createArrayNode(); - ObjectNode fieldVal = objectMapper.createObjectNode(); - fieldVal.put("code", "code1"); - fieldVal.put("value", "value1"); - fieldValArray.add(fieldVal); - dynamicItem.set("fieldVal", fieldValArray); - ArrayNode dynamicDataArray = objectMapper.createArrayNode(); - dynamicDataArray.add(dynamicItem); - - ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); - dynamicResponseNode.put("totalPages", 1); - dynamicResponseNode.put("totalItems", 1); - dynamicResponseNode.set("data", dynamicDataArray); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); - - ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + public void fetchAllowedValues_FromMasterDataService_withValidDetails_thenPass() { + ResponseEntity dynamicEntity = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); - ObjectNode categoryItem = objectMapper.createObjectNode(); - categoryItem.put("isActive", true); - categoryItem.put("code", "cat1"); - categoryItem.put("langCode", "eng"); - - ArrayNode docTypesArray = objectMapper.createArrayNode(); - ObjectNode docType = objectMapper.createObjectNode(); - docType.put("code", "doc1"); - docType.put("name", "Document Name"); - docTypesArray.add(docType); - - categoryItem.set("documentTypes", docTypesArray); - - ArrayNode docCategoriesArray = objectMapper.createArrayNode(); - docCategoriesArray.add(categoryItem); - ObjectNode docResponseNode = objectMapper.createObjectNode(); - docResponseNode.set("documentCategories", docCategoriesArray); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", docResponseNode); - - ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); + ResponseEntity docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); - JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); Assert.assertTrue(result.has("fieldName")); @@ -624,8 +579,9 @@ public void generateAllowedValues_withValidDetails_thenPass() { Assert.assertEquals("Document Name", result.get("cat1").get("doc1").get("eng").asText()); } + @Test - public void generateAllowedValues_withInactiveDynamicField_thenFail() { + public void fetchAllowedValues_FromMasterDataService_withInactiveDynamicField_thenFail() { ObjectNode dynamicItem = objectMapper.createObjectNode(); dynamicItem.put("isActive", false); @@ -645,13 +601,13 @@ public void generateAllowedValues_withInactiveDynamicField_thenFail() { ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); - JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); Assert.assertEquals(0, result.size()); } @Test - public void generateAllowedValues_withInactiveDocumentTypesAndCategories_thenFail() { + public void fetchAllowedValues_FromMasterDataService_withInactiveDocumentTypesAndCategories_thenFail() { ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); dynamicResponseNode.put("totalPages", 1); dynamicResponseNode.put("totalItems", 0); @@ -692,7 +648,7 @@ public void generateAllowedValues_withInactiveDocumentTypesAndCategories_thenFai ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); - JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); Assert.assertEquals(0, result.size()); @@ -724,21 +680,12 @@ public void validate_unableToFetchTheSchema_thenFail() throws ProfileException{ } @Test - public void init_shouldPopulateUiSpec_thenPass() { - ObjectNode specNode = objectMapper.createObjectNode(); - specNode.set("schema", objectMapper.createObjectNode().put("someKey", "someValue")); - specNode.set("errors", objectMapper.createObjectNode().put("errKey", "errVal")); - - ObjectNode i18n = objectMapper.createObjectNode(); - i18n.set("en", objectMapper.createObjectNode().put("label", "Name")); - ObjectNode i18nErrors = objectMapper.createObjectNode().put("required", "Required"); - i18n.set("errors", i18nErrors); - specNode.set("i18nValues", i18n); - - specNode.set("allowedValues", objectMapper.createObjectNode().put("gender", "M,F")); - specNode.put("maxUploadFileSize", 1048576); + public void getUISpecification_validResponse_thenPass() throws JsonProcessingException { + String jsonSpec = "{\"spec\":{\"schema\":{\"required\":[\"phone\"],\"properties\":{\"phone\":{\"type\":\"string\"}}}," + + "\"i18nValues\":{\"en\":{\"label\":\"Phone Number\"},\"errors\":{\"invalid_phone\":\"Phone number is invalid\"}}," + + "\"customField\":{\"gender\":\"M,F\"}}}}"; - ArrayNode specArray = objectMapper.createArrayNode().add(specNode); + ArrayNode specArray = objectMapper.createArrayNode().add(objectMapper.readTree(jsonSpec)); ObjectNode root = objectMapper.createObjectNode().set("jsonSpec", specArray); ArrayNode rootArray = objectMapper.createArrayNode().add(root); @@ -749,15 +696,22 @@ public void init_shouldPopulateUiSpec_thenPass() { Mockito.when(restTemplate.exchange(Mockito.eq("http://mock/uispec"), Mockito.eq(HttpMethod.GET), Mockito.isNull(), Mockito.>>any())).thenReturn(responseEntity); - idrepoProfileRegistryPlugin.init(); + + ResponseEntity dynamicEntity = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + + ResponseEntity docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); JsonNode uiSpec = idrepoProfileRegistryPlugin.getUISpecification(); Assert.assertNotNull(uiSpec); Assert.assertTrue(uiSpec.has("schema")); - Assert.assertTrue(uiSpec.has("errors")); + Assert.assertTrue(uiSpec.has("customField")); Assert.assertTrue(uiSpec.has("i18nValues")); Assert.assertTrue(uiSpec.has("allowedValues")); Assert.assertTrue(uiSpec.has("maxUploadFileSize")); + Assert.assertTrue(uiSpec.has("language")); + Assert.assertTrue(uiSpec.has("resetPasswordChallengeFields")); } @Test @@ -816,4 +770,55 @@ public void createProfile_withValidBuildDocuments_thenPass() throws Exception { Assert.assertNotNull(profileResult); Assert.assertEquals(profileResult.getStatus(),"SUCCESS"); } + + private JsonNode getDynamicFieldsEndpointResponse() { + ObjectNode dynamicItem = objectMapper.createObjectNode(); + dynamicItem.put("isActive", true); + dynamicItem.put("name", "fieldName"); + dynamicItem.put("langCode", "eng"); + + ArrayNode fieldValArray = objectMapper.createArrayNode(); + ObjectNode fieldVal = objectMapper.createObjectNode(); + fieldVal.put("code", "code1"); + fieldVal.put("value", "value1"); + fieldValArray.add(fieldVal); + dynamicItem.set("fieldVal", fieldValArray); + ArrayNode dynamicDataArray = objectMapper.createArrayNode(); + dynamicDataArray.add(dynamicItem); + + ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); + dynamicResponseNode.put("totalPages", 1); + dynamicResponseNode.put("totalItems", 1); + dynamicResponseNode.set("data", dynamicDataArray); + ObjectNode dynamicWrapper = objectMapper.createObjectNode(); + dynamicWrapper.set("response", dynamicResponseNode); + + return dynamicWrapper; + } + + private JsonNode getDocumentTypesAndCategoriesEndpointResponse() { + ObjectNode docType = objectMapper.createObjectNode(); + docType.put("code", "doc1"); + docType.put("isActive", true); + docType.put("name", "Document Name"); + docType.put("langCode", "eng"); + ArrayNode docTypesArray = objectMapper.createArrayNode(); + docTypesArray.add(docType); + + ObjectNode category = objectMapper.createObjectNode(); + category.put("isActive", true); + category.put("code", "cat1"); + category.put("langCode", "eng"); + category.set("documentTypes", docTypesArray); + ArrayNode docCategoriesArray = objectMapper.createArrayNode(); + docCategoriesArray.add(category); + + ObjectNode docResponseNode = objectMapper.createObjectNode(); + docResponseNode.set("documentCategories", docCategoriesArray); + + ObjectNode docWrapper = objectMapper.createObjectNode(); + docWrapper.set("response", docResponseNode); + + return docWrapper; + } } From 2236cb0e2b957d385b0483927ac9db6d1a56c055 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 00:08:03 +0530 Subject: [PATCH 2/5] Fixed review comments Signed-off-by: ase-101 --- .../IdrepoProfileRegistryPluginImpl.java | 22 +++-- .../src/main/resources/application.properties | 2 +- .../IdrepoProfileRegistryPluginImplTest.java | 87 ++++++++++++------- 3 files changed, 68 insertions(+), 43 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 88f53a2..eee4c32 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -327,7 +327,13 @@ public boolean isMatch(JsonNode identity, JsonNode inputChallenge) { public JsonNode getUISpecification() { JsonNode responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { }).getResponse(); + ObjectNode uiSpec = (ObjectNode) responseJson.at(uiSpecJsonpath); + if(uiSpec.isMissingNode() || uiSpec.isNull()) { + log.error("UI Spec is missing in the response from {} at json path {}", uiSpecUrl, uiSpecJsonpath); + return objectMapper.createObjectNode(); + } + uiSpec.putIfAbsent("language", objectMapper.valueToTree(Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages))); @@ -640,11 +646,10 @@ private String buildDynamicFieldsUrl(int pageNumber, int pageSize) { * Fetch and process document types and categories */ private void fetchAndProcessDocTypesAndCategories(ObjectNode result) { - ResponseEntity response = restTemplate.getForEntity(docTypesAndCategoryBaseUrl, JsonNode.class); - JsonNode responseBody = response.getBody(); - - if (responseBody != null && responseBody.has("response")) { - JsonNode data = responseBody.get("response").get("documentCategories"); + ResponseWrapper response = request(docTypesAndCategoryBaseUrl, HttpMethod.GET, null, + new ParameterizedTypeReference>() {}); + if (!response.getResponse().isNull()) { + JsonNode data = response.getResponse().get("documentCategories"); if (data != null && data.isArray()) { for (JsonNode item : data) { if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; @@ -691,10 +696,9 @@ private void fetchAndProcessDynamicFields(ObjectNode result) { while (pageNumber < totalPages) { String url = buildDynamicFieldsUrl(pageNumber, pageSize); - ResponseEntity response = restTemplate.getForEntity(url, JsonNode.class); - JsonNode responseBody = response.getBody(); - if (responseBody != null && responseBody.has("response")) { - JsonNode responseNode = responseBody.get("response"); + ResponseWrapper response = request(url, HttpMethod.GET, null, new ParameterizedTypeReference>() {}); + if (!response.getResponse().isNull()) { + JsonNode responseNode = response.getResponse(); if (pageNumber == 0) { totalPages = objectMapper.convertValue(responseNode.get("totalPages"), Integer.class); totalItems = objectMapper.convertValue(responseNode.get("totalItems"), Integer.class); diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 7449929..05dc763 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -51,7 +51,7 @@ mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/crede mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?type=schema mosip.signup.mosipid.uispec.errors={required:{en:"This field is required"},passwordMismatch:{en:"Passwords is not matching please check your password"}} -mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d" +mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d # for multiple languages scenario, the languages should be appended followed by ampersand as ?languages=eng&languages=fra&languages=khm mosip.signup.mosipid.doc-types-category.endpoint=http://masterdata.kernel/v1/masterdata/applicanttype/000/languages?languages=eng diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 78e90e0..264d7f0 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -561,11 +561,17 @@ private JsonNode createIdentity() { @Test public void fetchAllowedValues_FromMasterDataService_withValidDetails_thenPass() { - ResponseEntity dynamicEntity = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); - ResponseEntity docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseEntity> docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docEntity); JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); @@ -591,15 +597,21 @@ public void fetchAllowedValues_FromMasterDataService_withInactiveDynamicField_th dynamicResponseNode.put("totalPages", 1); dynamicResponseNode.put("totalItems", 1); dynamicResponseNode.set("data", dynamicDataArray); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); + ResponseWrapper dynamicWrapper = new ResponseWrapper(); + dynamicWrapper.setResponse(dynamicResponseNode); + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); - ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", objectMapper.createObjectNode().set("documentCategories", objectMapper.createArrayNode())); - ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseWrapper docWrapper = new ResponseWrapper(); + docWrapper.setResponse(objectMapper.createObjectNode().set("documentCategories", objectMapper.createArrayNode())); + ResponseEntity> docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docEntity); JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); @@ -613,11 +625,13 @@ public void fetchAllowedValues_FromMasterDataService_withInactiveDocumentTypesAn dynamicResponseNode.put("totalItems", 0); dynamicResponseNode.set("data", objectMapper.createArrayNode()); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); - - ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + ResponseWrapper dynamicWrapper = new ResponseWrapper(); + dynamicWrapper.setResponse(dynamicResponseNode); + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); ObjectNode inactiveCategory = objectMapper.createObjectNode(); inactiveCategory.put("isActive", false); // should be skipped @@ -642,11 +656,14 @@ public void fetchAllowedValues_FromMasterDataService_withInactiveDocumentTypesAn ObjectNode docResponseNode = objectMapper.createObjectNode(); docResponseNode.set("documentCategories", docCategoriesArray); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", docResponseNode); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(docResponseNode); - ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseEntity> docResponse = new ResponseEntity<>(responseWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docResponse); JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); @@ -697,11 +714,17 @@ public void getUISpecification_validResponse_thenPass() throws JsonProcessingExc Mockito.when(restTemplate.exchange(Mockito.eq("http://mock/uispec"), Mockito.eq(HttpMethod.GET), Mockito.isNull(), Mockito.>>any())).thenReturn(responseEntity); - ResponseEntity dynamicEntity = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); - ResponseEntity docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseEntity> docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docEntity); JsonNode uiSpec = idrepoProfileRegistryPlugin.getUISpecification(); Assert.assertNotNull(uiSpec); @@ -771,7 +794,7 @@ public void createProfile_withValidBuildDocuments_thenPass() throws Exception { Assert.assertEquals(profileResult.getStatus(),"SUCCESS"); } - private JsonNode getDynamicFieldsEndpointResponse() { + private ResponseWrapper getDynamicFieldsEndpointResponse() { ObjectNode dynamicItem = objectMapper.createObjectNode(); dynamicItem.put("isActive", true); dynamicItem.put("name", "fieldName"); @@ -790,16 +813,15 @@ private JsonNode getDynamicFieldsEndpointResponse() { dynamicResponseNode.put("totalPages", 1); dynamicResponseNode.put("totalItems", 1); dynamicResponseNode.set("data", dynamicDataArray); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); + ResponseWrapper dynamicWrapper = new ResponseWrapper(); + dynamicWrapper.setResponse(dynamicResponseNode); return dynamicWrapper; } - private JsonNode getDocumentTypesAndCategoriesEndpointResponse() { + private ResponseWrapper getDocumentTypesAndCategoriesEndpointResponse() { ObjectNode docType = objectMapper.createObjectNode(); docType.put("code", "doc1"); - docType.put("isActive", true); docType.put("name", "Document Name"); docType.put("langCode", "eng"); ArrayNode docTypesArray = objectMapper.createArrayNode(); @@ -816,9 +838,8 @@ private JsonNode getDocumentTypesAndCategoriesEndpointResponse() { ObjectNode docResponseNode = objectMapper.createObjectNode(); docResponseNode.set("documentCategories", docCategoriesArray); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", docResponseNode); - + ResponseWrapper docWrapper = new ResponseWrapper<>(); + docWrapper.setResponse(docResponseNode); return docWrapper; } } From a25dce6f88d8945964f000b71206771db8b49b0f Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 00:14:57 +0530 Subject: [PATCH 3/5] Fixed review comments Signed-off-by: ase-101 --- .../mosipid/service/IdrepoProfileRegistryPluginImpl.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index eee4c32..2d5a78a 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -328,11 +328,12 @@ public JsonNode getUISpecification() { JsonNode responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { }).getResponse(); - ObjectNode uiSpec = (ObjectNode) responseJson.at(uiSpecJsonpath); - if(uiSpec.isMissingNode() || uiSpec.isNull()) { + JsonNode extractedUiSpec = responseJson.at(uiSpecJsonpath); + if (extractedUiSpec.isMissingNode() || extractedUiSpec.isNull() || !extractedUiSpec.isObject()) { log.error("UI Spec is missing in the response from {} at json path {}", uiSpecUrl, uiSpecJsonpath); return objectMapper.createObjectNode(); } + ObjectNode uiSpec = (ObjectNode) extractedUiSpec; uiSpec.putIfAbsent("language", objectMapper.valueToTree(Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages))); @@ -736,10 +737,6 @@ private void fetchAndProcessDynamicFields(ObjectNode result) { } } pageNumber++; - int remainingItems = totalItems - (pageNumber * pageSize); - if (remainingItems < pageSize) { - pageSize = remainingItems; - } } } From 5490e86717e5fcd27f2785e0bac2f2671443918a Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 00:40:54 +0530 Subject: [PATCH 4/5] Fixed review comments Signed-off-by: ase-101 --- .../service/IdrepoProfileRegistryPluginImpl.java | 14 +++++--------- .../IdrepoProfileRegistryPluginImplTest.java | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 2d5a78a..a079254 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -12,8 +12,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import com.github.jaiimageio.jpeg2000.impl.J2KImageReaderSpi; -import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.PathNotFoundException; import io.micrometer.core.annotation.Timed; import io.mosip.esignet.core.util.IdentityProviderUtil; import io.mosip.kernel.core.util.HMACUtils2; @@ -35,7 +33,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -123,8 +120,8 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") private String uiSpecUrl; - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:/0/jsonSpec/0/spec}") - private String uiSpecJsonpath; + @Value("${mosip.signup.mosipid.uispec.json.pointer:/0/jsonSpec/0/spec}") + private String uiSpecJsonPointer; @Value("${mosip.signup.mosipid.dynamic-fields.endpoint}") private String dynamicFieldsBaseUrl; @@ -328,9 +325,9 @@ public JsonNode getUISpecification() { JsonNode responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { }).getResponse(); - JsonNode extractedUiSpec = responseJson.at(uiSpecJsonpath); + JsonNode extractedUiSpec = responseJson.at(uiSpecJsonPointer); if (extractedUiSpec.isMissingNode() || extractedUiSpec.isNull() || !extractedUiSpec.isObject()) { - log.error("UI Spec is missing in the response from {} at json path {}", uiSpecUrl, uiSpecJsonpath); + log.error("UI Spec is missing in the response from {} at json path {}", uiSpecUrl, uiSpecJsonPointer); return objectMapper.createObjectNode(); } ObjectNode uiSpec = (ObjectNode) extractedUiSpec; @@ -701,8 +698,7 @@ private void fetchAndProcessDynamicFields(ObjectNode result) { if (!response.getResponse().isNull()) { JsonNode responseNode = response.getResponse(); if (pageNumber == 0) { - totalPages = objectMapper.convertValue(responseNode.get("totalPages"), Integer.class); - totalItems = objectMapper.convertValue(responseNode.get("totalItems"), Integer.class); + totalPages = Math.max(1, responseNode.path("totalPages").asInt(1)); } JsonNode data = responseNode.get("data"); if (data != null && data.isArray()) { diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 264d7f0..9b78e9e 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -63,7 +63,7 @@ public void beforeEach(){ defaultSelectedHandles.add("email"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "defaultSelectedHandles",defaultSelectedHandles); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "objectMapper",objectMapper); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecJsonpath", "/0/jsonSpec/0/spec"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecJsonPointer", "/0/jsonSpec/0/spec"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getUinEndpoint","http://localhost:8080/identity/v1/uin"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "schemaUrl","http://localhost:8080/identity/v1/schema/"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/identity/v1/identity/"); From 29607abfb6d427ac0acf5673634a26a533f67811 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 00:48:04 +0530 Subject: [PATCH 5/5] Fixed review comments Signed-off-by: ase-101 --- .../plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index a079254..4a2de7b 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -327,7 +327,7 @@ public JsonNode getUISpecification() { JsonNode extractedUiSpec = responseJson.at(uiSpecJsonPointer); if (extractedUiSpec.isMissingNode() || extractedUiSpec.isNull() || !extractedUiSpec.isObject()) { - log.error("UI Spec is missing in the response from {} at json path {}", uiSpecUrl, uiSpecJsonPointer); + log.error("UI Spec is missing in the response from {} at json pointer {}", uiSpecUrl, uiSpecJsonPointer); return objectMapper.createObjectNode(); } ObjectNode uiSpec = (ObjectNode) extractedUiSpec;