diff --git a/java/claim/src/main/java/dev/sunbirdrc/claim/controller/ClaimsController.java b/java/claim/src/main/java/dev/sunbirdrc/claim/controller/ClaimsController.java index cf2453488..675e3bebe 100644 --- a/java/claim/src/main/java/dev/sunbirdrc/claim/controller/ClaimsController.java +++ b/java/claim/src/main/java/dev/sunbirdrc/claim/controller/ClaimsController.java @@ -17,11 +17,12 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; import java.util.Optional; -import static dev.sunbirdrc.claim.contants.AttributeNames.ATTESTOR_INFO; -import static dev.sunbirdrc.claim.contants.AttributeNames.LOWERCASE_ENTITY; +import static dev.sunbirdrc.claim.contants.AttributeNames.*; +import static dev.sunbirdrc.registry.middleware.util.Constants.USER_ID; @Controller public class ClaimsController { @@ -77,6 +78,38 @@ public ResponseEntity attestClaims(@PathVariable String claimId, @Request return new ResponseEntity<>(updatedClaim, HttpStatus.OK); } + @RequestMapping(value = "/api/v1/claims/{claimId}", method = RequestMethod.PUT) + public ResponseEntity closeClaims(@PathVariable String claimId, @RequestBody JsonNode requestBody) { + if (!requestBody.has(USER_ID)) + return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + + String userId = requestBody.get(USER_ID).asText(); + Optional claimOptional = claimService.findById(claimId); + if (!claimOptional.isPresent()) { + return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + } + Claim existingClaim = claimOptional.get(); + if (!claimsAuthorizer.isAuthorizedToCloseClaim(existingClaim, userId)) { + return new ResponseEntity<>(null, HttpStatus.FORBIDDEN); + } + + logger.info("Closing claim : {}", claimId); + JsonNode notesNode = requestBody.get(NOTES); + String notes = notesNode == null ? null : notesNode.asText(); + Claim updatedClaim = claimService.closeClaim(existingClaim, notes, userId); + return new ResponseEntity<>(updatedClaim, HttpStatus.OK); + } + + @RequestMapping(value = "/api/v1/getClaims", method = RequestMethod.GET) + public ResponseEntity getClaims(@RequestParam String attestationId) { + logger.info("Getting claim using attestation id : {}", attestationId); + List claim = claimService.findByAttestationId(attestationId); + if (claim == null || claim.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(claim.get(0), HttpStatus.OK); + } + @GetMapping(value = "/health") public ResponseEntity health() { return ResponseEntity.ok().build(); diff --git a/java/claim/src/main/java/dev/sunbirdrc/claim/repository/ClaimRepository.java b/java/claim/src/main/java/dev/sunbirdrc/claim/repository/ClaimRepository.java index 93bdfb8de..6574954c3 100644 --- a/java/claim/src/main/java/dev/sunbirdrc/claim/repository/ClaimRepository.java +++ b/java/claim/src/main/java/dev/sunbirdrc/claim/repository/ClaimRepository.java @@ -5,10 +5,12 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface ClaimRepository extends JpaRepository { List findByConditionsIn(List conditions); List findByAttestorEntityIn(List entities); List findByAttestorEntity(String entity); + List findByAttestationIdEquals(String attestationId); } diff --git a/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimService.java b/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimService.java index 02cd33b13..f38b8a287 100644 --- a/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimService.java +++ b/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimService.java @@ -53,6 +53,10 @@ public List findAll() { return claimRepository.findAll(); } + public List findByAttestationId(String attestationId) { + return claimRepository.findByAttestationIdEquals(attestationId); + } + public Map findClaimsForAttestor(String entity, JsonNode attestorNode, Pageable pageable) { List claims = claimRepository.findByAttestorEntity(entity); logger.info("Found {} claims to process", claims.size()); @@ -99,6 +103,16 @@ private Claim updateClaim(JsonNode requestBody, Claim claim) { return claimRepository.save(claim); } + public Claim closeClaim(Claim claim, String notes, String userId) { + claim.setUpdatedAt(new Date()); + claim.setStatus(ClaimStatus.CLOSED.name()); + Claim updatedClaim = claimRepository.save(claim); + if (notes != null) { + addNotes(notes, updatedClaim, userId); + } + return updatedClaim; + } + public void addNotes(String notes, Claim claim, String addedBy) { ClaimNote claimNote = new ClaimNote(); claimNote.setNotes(notes); diff --git a/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimsAuthorizer.java b/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimsAuthorizer.java index 04cf69970..8fb8c02b9 100644 --- a/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimsAuthorizer.java +++ b/java/claim/src/main/java/dev/sunbirdrc/claim/service/ClaimsAuthorizer.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import java.util.Collections; +import java.util.Objects; @Service public class ClaimsAuthorizer { @@ -48,4 +49,8 @@ public boolean isAuthorizedRequestor(Claim claim, JsonNode attestorNode) { } return false; } + + public boolean isAuthorizedToCloseClaim(Claim claim, String userId) { + return Objects.equals(claim.getEntityId(), userId); + } } 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 2e0ec3ef1..fe793a72a 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 @@ -104,6 +104,9 @@ public class RegistryHelper { @Autowired private ShardManager shardManager; + @Autowired + private ClaimRequestClient claimRequestClient; + @Autowired RegistryService registryService; @@ -1012,7 +1015,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); + updateAttestation(attestations, propertyToUpdate, userId); } } if (entity != null) { @@ -1026,7 +1029,7 @@ public String getPropertyToUpdate(HttpServletRequest request, String entityId){ String propertyURI = getPropertyURI(entityId, request); return propertyURI.split("/")[0]; } - private void updateAttestation(ArrayNode attestations,String propertyToUpdate) { + private void updateAttestation(ArrayNode attestations,String propertyToUpdate, String userId) { for (JsonNode attestation : attestations) { if (attestation.get(_osState.name()).asText().equals(States.PUBLISHED.name()) && !attestation.get("name").asText().equals(propertyToUpdate) @@ -1035,6 +1038,15 @@ private void updateAttestation(ArrayNode attestations,String propertyToUpdate) { JSONUtil.removeNode(propertiesOSID, uuidPropertyName); ((ObjectNode) attestation).set(_osState.name(), JsonNodeFactory.instance.textNode(States.INVALID.name())); } + if (attestation.get(_osState.name()).asText().equals(States.ATTESTATION_REQUESTED.name()) + && !attestation.get("name").asText().equals(propertyToUpdate) + ) { + JsonNode claim = claimRequestClient.getClaimByAttestationId(attestation.get("osid").asText()); + logger.info("Closing claim: ", claim.get("id")); + claimRequestClient.closeClaim(claim.get("id").asText(), userId, "CLOSING CLAIM. ENTITY UPDATED AFTER RAISING CLAIM"); + logger.info("Invalidating the attestation. Attestation id: " + attestation.get("osid").asText()); + ((ObjectNode) attestation).set(_osState.name(), JsonNodeFactory.instance.textNode(States.DRAFT.name())); + } } } diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/util/ClaimRequestClient.java b/java/registry/src/main/java/dev/sunbirdrc/registry/util/ClaimRequestClient.java index 5f0102c1d..0c51051cc 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/util/ClaimRequestClient.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/util/ClaimRequestClient.java @@ -53,6 +53,10 @@ public JsonNode getClaim(JsonNode jsonNode, String entityName, String claimId) { return restTemplate.postForObject(claimRequestUrl + FETCH_CLAIMS_PATH + "/" + claimId, requestBody, JsonNode.class); } + public JsonNode getClaimByAttestationId(String attestationId) { + return restTemplate.getForObject(claimRequestUrl + FETCH_CLAIMS_PATH + "?attestationId=" + attestationId, JsonNode.class); + } + public ResponseEntity attestClaim(JsonNode attestationRequest, String claimId) { return restTemplate.exchange( claimRequestUrl + CLAIMS_PATH + "/" + claimId, @@ -61,4 +65,16 @@ public ResponseEntity attestClaim(JsonNode attestationRequest, String cl Object.class ); } + + public ResponseEntity closeClaim(String claimId, String userId, String notes) { + ObjectNode requestBody = JsonNodeFactory.instance.objectNode(); + requestBody.set("userId", JsonNodeFactory.instance.textNode(userId)); + requestBody.set("notes", JsonNodeFactory.instance.textNode(notes)); + return restTemplate.exchange( + claimRequestUrl + CLAIMS_PATH + "/" + claimId, + HttpMethod.PUT, + new HttpEntity<>(requestBody), + Object.class + ); + } }