diff --git a/src/main/java/au/org/ala/biocache/dto/UserAssertions.java b/src/main/java/au/org/ala/biocache/dto/UserAssertions.java index 07890bdd4..8ef22d3d6 100644 --- a/src/main/java/au/org/ala/biocache/dto/UserAssertions.java +++ b/src/main/java/au/org/ala/biocache/dto/UserAssertions.java @@ -1,5 +1,7 @@ package au.org.ala.biocache.dto; +import org.apache.commons.lang3.StringUtils; + import java.util.ArrayList; public class UserAssertions extends ArrayList { @@ -19,4 +21,17 @@ public boolean deleteUuid(String uuid) { return changed; } -} \ No newline at end of file + + public boolean updateComment(String uuid, String comment) { + boolean changed = false; + for (int i = 0; i < this.size(); i++) { + if (this.get(i).getUuid().equals(uuid) && StringUtils.compare(this.get(i).comment, comment) != 0) { + this.get(i).comment = comment; + changed = true; + break; + } + } + + return changed; + } +} diff --git a/src/main/java/au/org/ala/biocache/service/AssertionService.java b/src/main/java/au/org/ala/biocache/service/AssertionService.java index 1433e7acf..b9bd2cfb3 100644 --- a/src/main/java/au/org/ala/biocache/service/AssertionService.java +++ b/src/main/java/au/org/ala/biocache/service/AssertionService.java @@ -115,6 +115,28 @@ public Optional addAssertion( return Optional.empty(); } + public boolean editAssertion( + String recordUuid, + String assertionId, + String comment + ) throws IOException { + logger.debug("Editing assertion to: " + recordUuid + ", assertionId: " + assertionId + ", comment: " + comment); + + SolrDocument sd = searchDAO.getOcc(recordUuid); + // only when record uuid is valid + if (sd != null) { + UserAssertions userAssertions = store.get(UserAssertions.class, recordUuid).orElse(new UserAssertions()); + // if there's any change made + if (userAssertions.updateComment(assertionId, comment)) { + // Update assertions + updateUserAssertions(recordUuid, userAssertions); + return true; + } + } + + return false; + } + public boolean deleteAssertion(String recordUuid, String assertionUuid) throws IOException { SolrDocument sd = searchDAO.getOcc(recordUuid); diff --git a/src/main/java/au/org/ala/biocache/web/AssertionController.java b/src/main/java/au/org/ala/biocache/web/AssertionController.java index fd1c1e6be..4793d17a5 100644 --- a/src/main/java/au/org/ala/biocache/web/AssertionController.java +++ b/src/main/java/au/org/ala/biocache/web/AssertionController.java @@ -32,6 +32,7 @@ import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.http.entity.ContentType; import org.apache.log4j.Logger; @@ -156,10 +157,11 @@ public ResponseEntity addAssertionWithParams( @RequestParam(value = "assertionUuid", required = false) String assertionUuid, @RequestParam(value = "relatedRecordId", required = false) String relatedRecordId, @RequestParam(value = "relatedRecordReason", required = false) String relatedRecordReason, + @RequestParam(value = "updateId", required = false) String updateId, HttpServletRequest request, HttpServletResponse response) throws Exception { - return addAssertion(recordUuid, code, userId, userDisplayName, comment, userAssertionStatus, assertionUuid, relatedRecordId, relatedRecordReason, request, response); + return addAssertion(recordUuid, code, userId, userDisplayName, comment, userAssertionStatus, assertionUuid, relatedRecordId, relatedRecordReason, updateId, request, response); } /** @@ -243,6 +245,7 @@ public ResponseEntity addAssertion( @RequestParam(value = "assertionUuid", required = false) String assertionUuid, @RequestParam(value = "relatedRecordId", required = false) String relatedRecordId, @RequestParam(value = "relatedRecordReason", required = false) String relatedRecordReason, + @RequestParam(value = "updateId", required = false) String updateId, HttpServletRequest request, HttpServletResponse response) throws Exception { @@ -251,17 +254,26 @@ public ResponseEntity addAssertion( } try { - Optional qa = assertionService.addAssertion( - recordUuid, code, comment, userId, userDisplayName, - userAssertionStatus, assertionUuid, relatedRecordId, relatedRecordReason - ); - if (qa.isPresent()) { - - String server = request.getSession().getServletContext().getInitParameter("serverName"); - return ResponseEntity - .created(new URI(server + "/occurrences/" + recordUuid + "/assertions/" + qa.get().getUuid())) - .contentLength(0) - .build(); + // if the updateId is provided then we are editing an existing assertion + if (StringUtils.isEmpty(updateId)) { + // add the assertion + Optional qa = assertionService.addAssertion( + recordUuid, code, comment, userId, userDisplayName, + userAssertionStatus, assertionUuid, relatedRecordId, relatedRecordReason + ); + if (qa.isPresent()) { + + String server = request.getSession().getServletContext().getInitParameter("serverName"); + return ResponseEntity + .created(new URI(server + "/occurrences/" + recordUuid + "/assertions/" + qa.get().getUuid())) + .contentLength(0) + .build(); + } + } else { + // update the assertion + if (assertionService.editAssertion(recordUuid, updateId, comment)) { + return ResponseEntity.ok().contentLength(0).build(); + } } throw new ResponseStatusException(HttpStatus.BAD_REQUEST);