diff --git a/openapi.yml b/openapi.yml index 7cbf550..10928c5 100644 --- a/openapi.yml +++ b/openapi.yml @@ -90,7 +90,8 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/PatchSigningRequestDocumentRequest" + items: + $ref: "#/components/schemas/PatchOperation" responses: 204: description: "Signing request document was patched" @@ -216,7 +217,7 @@ components: confirmed: type: boolean - PatchSigningRequestDocumentRequest: + PatchOperation: type: object required: - op diff --git a/src/main/java/ch/dlmw/swisssignchallenge/controllers/ControllerAdvice.java b/src/main/java/ch/dlmw/swisssignchallenge/controllers/ControllerAdvice.java index fad9c6b..2d2af8d 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/controllers/ControllerAdvice.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/controllers/ControllerAdvice.java @@ -6,13 +6,19 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import java.util.NoSuchElementException; - @RestControllerAdvice public class ControllerAdvice { - @ExceptionHandler(value = {NoSuchElementException.class}) - public ResponseEntity handleAuthenticationException(Exception e) { - var response = new ErrorResponse("TODO", HttpStatus.UNAUTHORIZED.value()); - return new ResponseEntity<>(response, HttpStatus.UNAUTHORIZED); + @ExceptionHandler(value = {IllegalArgumentException.class}) + public ResponseEntity handleIllegalArgumentException(Exception e) { + e.printStackTrace(); + var response = new ErrorResponse(e.getMessage(), HttpStatus.BAD_REQUEST.value()); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(value = {RuntimeException.class}) + public ResponseEntity handleRuntimeException(Exception e) { + e.printStackTrace(); + var response = new ErrorResponse(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value()); + return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); } } diff --git a/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java b/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java index 23d6725..b2fb34d 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java @@ -1,20 +1,53 @@ package ch.dlmw.swisssignchallenge.controllers; +import ch.dlmw.swisssignchallenge.entities.SigningRequestDocument; import ch.dlmw.swisssignchallenge.services.SigningRequestDocumentService; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.fge.jsonpatch.JsonPatch; +import com.github.fge.jsonpatch.JsonPatchException; import lombok.AllArgsConstructor; import org.openapitools.api.SigningRequestDocumentApi; -import org.openapitools.model.PatchSigningRequestDocumentRequest; +import org.openapitools.model.PatchOperation; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; +import java.util.List; + @RestController @AllArgsConstructor public class SigningRequestDocumentController implements SigningRequestDocumentApi { private final SigningRequestDocumentService signingRequestDocumentService; + private final ObjectMapper objectMapper; @Override - public ResponseEntity patchSigningRequestDocument(String id, PatchSigningRequestDocumentRequest patchSigningRequestDocumentRequest) { - signingRequestDocumentService.patchSigningRequestDocument(id, patchSigningRequestDocumentRequest); - return ResponseEntity.noContent().build(); + public ResponseEntity patchSigningRequestDocument(String id, List patchOperations) { + // Fetch the existing document + var document = signingRequestDocumentService.getSigningRequestDocument(id); + + try { + ObjectMapper mapper = new ObjectMapper(); + // Serialize patchOperations to JsonNode + JsonNode patchNode = mapper.valueToTree(patchOperations); + + // Create JsonPatch from JsonNode + JsonPatch jsonPatch = JsonPatch.fromJson(patchNode); + + // Apply patch to the document's JsonNode + JsonNode patchedNode = jsonPatch.apply(mapper.convertValue(document, JsonNode.class)); + + // Convert the patched JsonNode back to SigningRequestDocument + SigningRequestDocument patchedDocument = mapper.treeToValue(patchedNode, SigningRequestDocument.class); + + // Now, update the document in the service layer + signingRequestDocumentService.updateSigningRequestDocument(patchedDocument); + + return ResponseEntity.noContent().build(); + } catch (IOException | JsonPatchException e) { + // Handle exceptions appropriately + throw new RuntimeException("Failed to apply patch", e); + } } + } diff --git a/src/main/java/ch/dlmw/swisssignchallenge/entities/SigningRequestDocument.java b/src/main/java/ch/dlmw/swisssignchallenge/entities/SigningRequestDocument.java index 1868989..0a83869 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/entities/SigningRequestDocument.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/entities/SigningRequestDocument.java @@ -1,5 +1,6 @@ package ch.dlmw.swisssignchallenge.entities; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; @@ -18,6 +19,7 @@ public class SigningRequestDocument { @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "signing_request_id", nullable = false) + @JsonIgnore private SigningRequest signingRequest; @Column(name = "name", nullable = false) diff --git a/src/main/java/ch/dlmw/swisssignchallenge/services/SigningRequestDocumentService.java b/src/main/java/ch/dlmw/swisssignchallenge/services/SigningRequestDocumentService.java index 7e2a59f..5b96789 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/services/SigningRequestDocumentService.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/services/SigningRequestDocumentService.java @@ -1,7 +1,9 @@ package ch.dlmw.swisssignchallenge.services; -import org.openapitools.model.PatchSigningRequestDocumentRequest; +import ch.dlmw.swisssignchallenge.entities.SigningRequestDocument; public interface SigningRequestDocumentService { - void patchSigningRequestDocument(String id, PatchSigningRequestDocumentRequest patchSigningRequestDocumentRequest); + void updateSigningRequestDocument(SigningRequestDocument signingRequestDocument); + + SigningRequestDocument getSigningRequestDocument(String id); } diff --git a/src/main/java/ch/dlmw/swisssignchallenge/services/impl/SigningRequestDocumentServiceImpl.java b/src/main/java/ch/dlmw/swisssignchallenge/services/impl/SigningRequestDocumentServiceImpl.java index ece174c..adfe03c 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/services/impl/SigningRequestDocumentServiceImpl.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/services/impl/SigningRequestDocumentServiceImpl.java @@ -1,10 +1,9 @@ package ch.dlmw.swisssignchallenge.services.impl; +import ch.dlmw.swisssignchallenge.entities.SigningRequestDocument; import ch.dlmw.swisssignchallenge.repositories.SigningRequestDocumentRepository; import ch.dlmw.swisssignchallenge.services.SigningRequestDocumentService; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.AllArgsConstructor; -import org.openapitools.model.PatchSigningRequestDocumentRequest; import org.springframework.stereotype.Service; import java.util.UUID; @@ -13,12 +12,16 @@ import java.util.UUID; @AllArgsConstructor public class SigningRequestDocumentServiceImpl implements SigningRequestDocumentService { private final SigningRequestDocumentRepository signingRequestDocumentRepository; - private final ObjectMapper objectMapper; @Override - public void patchSigningRequestDocument(String id, PatchSigningRequestDocumentRequest patchSigningRequestDocumentRequest) { - var document = signingRequestDocumentRepository.findById(UUID.fromString(id)).orElseThrow(); + public void updateSigningRequestDocument(SigningRequestDocument signingRequestDocument) { + var document = signingRequestDocumentRepository.findById(signingRequestDocument.getId()).orElseThrow(); + signingRequestDocument.setSigningRequest(document.getSigningRequest()); // todo: this is a bit ugly.. due to recursion the relationship is ignored so I set it manually + signingRequestDocumentRepository.save(signingRequestDocument); + } - System.out.println(document.isConfirmed()); + @Override + public SigningRequestDocument getSigningRequestDocument(String id) { + return signingRequestDocumentRepository.findById(UUID.fromString(id)).orElseThrow(); } }