Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#837-Closing the claim and invalidating the pending attestations when entity is updated #301

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -77,6 +78,38 @@ public ResponseEntity<Claim> attestClaims(@PathVariable String claimId, @Request
return new ResponseEntity<>(updatedClaim, HttpStatus.OK);
}

@RequestMapping(value = "/api/v1/claims/{claimId}", method = RequestMethod.PUT)
public ResponseEntity<Claim> 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<Claim> 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<Claim> getClaims(@RequestParam String attestationId) {
logger.info("Getting claim using attestation id : {}", attestationId);
List<Claim> 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<String> health() {
return ResponseEntity.ok().build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface ClaimRepository extends JpaRepository<Claim, String> {
List<Claim> findByConditionsIn(List<String> conditions);
List<Claim> findByAttestorEntityIn(List<String> entities);
List<Claim> findByAttestorEntity(String entity);
List<Claim> findByAttestationIdEquals(String attestationId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ public List<Claim> findAll() {
return claimRepository.findAll();
}

public List<Claim> findByAttestationId(String attestationId) {
return claimRepository.findByAttestationIdEquals(attestationId);
}

public Map<String, Object> findClaimsForAttestor(String entity, JsonNode attestorNode, Pageable pageable) {
List<Claim> claims = claimRepository.findByAttestorEntity(entity);
logger.info("Found {} claims to process", claims.size());
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.Objects;

@Service
public class ClaimsAuthorizer {
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ public class RegistryHelper {
@Autowired
private ShardManager shardManager;

@Autowired
private ClaimRequestClient claimRequestClient;

@Autowired
RegistryService registryService;

Expand Down Expand Up @@ -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) {
Expand All @@ -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)
Expand All @@ -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()));
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object> attestClaim(JsonNode attestationRequest, String claimId) {
return restTemplate.exchange(
claimRequestUrl + CLAIMS_PATH + "/" + claimId,
Expand All @@ -61,4 +65,16 @@ public ResponseEntity<Object> attestClaim(JsonNode attestationRequest, String cl
Object.class
);
}

public ResponseEntity<Object> 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
);
}
}
Loading