diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/helper/RegistryHelper.java b/java/registry/src/main/java/dev/sunbirdrc/registry/helper/RegistryHelper.java index cd4e06040..9a29096da 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/helper/RegistryHelper.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/helper/RegistryHelper.java @@ -77,8 +77,7 @@ import static dev.sunbirdrc.registry.Constants.*; import static dev.sunbirdrc.registry.exception.ErrorMessages.*; import static dev.sunbirdrc.registry.middleware.util.Constants.*; -import static dev.sunbirdrc.registry.middleware.util.OSSystemFields._osState; -import static dev.sunbirdrc.registry.middleware.util.OSSystemFields.osOwner; +import static dev.sunbirdrc.registry.middleware.util.OSSystemFields.*; /** * This is helper class, user-service calls this class in-order to access registry functionality @@ -841,6 +840,14 @@ private JsonNode getUserInfoFromRegistry(HttpServletRequest request, String enti throw new Exception("Forbidden"); } + private JsonNode getEntityByUserId(String entityName, String userId) throws Exception { + ObjectNode payload = getSearchByOwnerQuery(entityName, userId); + watch.start("RegistryController.searchEntity"); + JsonNode result = searchEntity(payload, userId); + watch.stop("RegistryController.searchEntity"); + return result; + } + @NotNull private ObjectNode getSearchByOwnerQuery(String entityName, String userId) { ObjectNode payload = JsonNodeFactory.instance.objectNode(); @@ -1015,7 +1022,7 @@ public void invalidateAttestation(String entityName, String entityId, String use } if (entity.has(policyName) && entity.get(policyName).isArray()) { ArrayNode attestations = (ArrayNode) entity.get(policyName); - updateAttestation(attestations, propertyToUpdate, attestationPolicy); + updateAttestation(attestationPolicy.getAttestorEntity(), userId, entity,attestations, propertyToUpdate, attestationPolicy); } } if (entity != null) { @@ -1029,7 +1036,8 @@ public String getPropertyToUpdate(HttpServletRequest request, String entityId){ String propertyURI = getPropertyURI(entityId, request); return propertyURI.split("/")[0]; } - private void updateAttestation(ArrayNode attestations,String propertyToUpdate, AttestationPolicy attestationPolicy) { + + private void updateAttestation(String attestorEntity, String userId, JsonNode entity, ArrayNode attestations,String propertyToUpdate, AttestationPolicy attestationPolicy) throws Exception { for (JsonNode attestation : attestations) { if (attestation.get(_osState.name()).asText().equals(States.PUBLISHED.name()) && !attestation.get("name").asText().equals(propertyToUpdate) @@ -1046,10 +1054,48 @@ private void updateAttestation(ArrayNode attestations,String propertyToUpdate, A ); } ((ObjectNode) attestation).set(_osState.name(), JsonNodeFactory.instance.textNode(States.INVALID.name())); + } else if (attestation.get(_osState.name()).asText().equals(States.ATTESTATION_REQUESTED.name())) { + JsonNode propertyData = JSONUtil.extractPropertyDataFromEntity(entity, attestationPolicy.getAttestationProperties(), null); + if (attestation.has("propertiesOSID")) { + ObjectNode propertiesOSID = attestations.get("propertiesOSID").deepCopy(); + Map> propertiesOSIDMapper = new HashMap<>(); + ObjectReader reader = objectMapper.readerFor(new TypeReference>() { + }); + for (Iterator> it = propertiesOSID.fields(); it.hasNext(); ) { + Map.Entry itr = it.next(); + if(itr.getValue().isArray() && !itr.getValue().isEmpty() && itr.getValue().get(0).isTextual()) { + List list = reader.readValue(itr.getValue()); + propertiesOSIDMapper.put(itr.getKey(), list); + } + } + propertyData = JSONUtil.extractPropertyDataFromEntity(entity, attestationPolicy.getAttestationProperties(), propertiesOSIDMapper); + } + + if(!propertyData.equals(JSONUtil.convertStringJsonNode(attestation.get("propertyData").asText()))) { + ((ObjectNode) attestation).set(_osState.name(), JsonNodeFactory.instance.textNode(States.DRAFT.name())); + invalidateClaim(attestorEntity, userId, attestation.get(_osClaimId.name()).asText()); + } } } } + public void invalidateClaim(String attestorEntityName, String userId, String claimId) throws Exception { + final String attestorPlugin = "did:internal:ClaimPluginActor"; + Action action = Action.SET_TO_DRAFT; + ObjectNode additionalInputs = JsonNodeFactory.instance.objectNode(); + JsonNode attestorInfo = getEntityByUserId(attestorEntityName, userId).get(attestorEntityName).get(0); + additionalInputs.put("claimId", claimId); + additionalInputs.put("action", action.name()); + additionalInputs.put("notes", "Closed due to entity update"); + additionalInputs.set("attestorInfo", attestorInfo); + PluginRequestMessage pluginRequestMessage = PluginRequestMessage.builder().build(); + pluginRequestMessage.setAttestorPlugin(attestorPlugin); + pluginRequestMessage.setAdditionalInputs(additionalInputs); + pluginRequestMessage.setStatus(action.name()); + pluginRequestMessage.setUserId(userId); + PluginRouter.route(pluginRequestMessage); + } + public Object getSignedDoc(String title, JsonNode result, Object credentialTemplate) throws SignatureException.CreationException, SignatureException.UnreachableException { Map requestBodyMap = new HashMap<>(); diff --git a/java/sunbirdrc-actors/src/main/java/dev/sunbirdrc/actors/ClaimPluginActor.java b/java/sunbirdrc-actors/src/main/java/dev/sunbirdrc/actors/ClaimPluginActor.java index 92fd01746..bdb6106c1 100644 --- a/java/sunbirdrc-actors/src/main/java/dev/sunbirdrc/actors/ClaimPluginActor.java +++ b/java/sunbirdrc-actors/src/main/java/dev/sunbirdrc/actors/ClaimPluginActor.java @@ -44,6 +44,7 @@ protected void onReceive(MessageProtos.Message request) throws Throwable { case RAISE_CLAIM: riseClaim(pluginRequestMessage); break; + case SET_TO_DRAFT: case GRANT_CLAIM: case REJECT_CLAIM: attestClaim(pluginRequestMessage);