Implement patch, but still a bit ugly
This commit is contained in:
@ -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
|
||||
|
@ -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<ErrorResponse> handleAuthenticationException(Exception e) {
|
||||
var response = new ErrorResponse("TODO", HttpStatus.UNAUTHORIZED.value());
|
||||
return new ResponseEntity<>(response, HttpStatus.UNAUTHORIZED);
|
||||
@ExceptionHandler(value = {IllegalArgumentException.class})
|
||||
public ResponseEntity<ErrorResponse> 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<ErrorResponse> handleRuntimeException(Exception e) {
|
||||
e.printStackTrace();
|
||||
var response = new ErrorResponse(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
|
@ -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<Void> patchSigningRequestDocument(String id, PatchSigningRequestDocumentRequest patchSigningRequestDocumentRequest) {
|
||||
signingRequestDocumentService.patchSigningRequestDocument(id, patchSigningRequestDocumentRequest);
|
||||
public ResponseEntity<Void> patchSigningRequestDocument(String id, List<PatchOperation> 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user