From 3dc0218a28f33b3f7341b318066394b12d5aa930 Mon Sep 17 00:00:00 2001 From: aoezyetimoglu Date: Wed, 20 Oct 2021 15:14:56 +0200 Subject: [PATCH] RED-2429: As a user I want to resize a redaction --- .../model/annotations/ManualRedactions.java | 3 + .../annotations/ManualResizeRedaction.java | 28 +++++++ .../annotations/ResizeRedactionRequest.java | 25 ++++++ .../resources/ManualRedactionResource.java | 21 +++++ .../ManualResizeRedactionEntity.java | 54 +++++++++++++ .../ResizeRedactionPersistenceService.java | 81 +++++++++++++++++++ .../repository/ResizeRedactionRepository.java | 13 +++ .../controller/ManualRedactionController.java | 35 ++++++++ .../v1/server/service/FileService.java | 26 ++++++ .../v1/server/service/FileStatusService.java | 7 +- .../ManualRedactionProviderService.java | 5 +- .../service/ManualRedactionService.java | 62 ++++++++++++++ .../utils/ManualResizeRedactionMapper.java | 19 +++++ .../tests/ManualRedactionTest.java | 27 ++++++- 14 files changed, 403 insertions(+), 3 deletions(-) create mode 100644 persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java create mode 100644 persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java index 9fce6c05a..3a86a9c94 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualRedactions.java @@ -28,6 +28,9 @@ public class ManualRedactions { @Builder.Default private Set legalBasisChanges = new HashSet<>(); + @Builder.Default + private Set resizeRedactions = new HashSet<>(); + @Builder.Default private Map> comments = new HashMap<>(); diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java new file mode 100644 index 000000000..60fbefeea --- /dev/null +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ManualResizeRedaction.java @@ -0,0 +1,28 @@ +package com.iqser.red.service.persistence.service.v1.api.model.annotations; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ManualResizeRedaction { + + private String annotationId; + private String fileId; + private String user; + private AnnotationStatus status; + private OffsetDateTime requestDate; + private OffsetDateTime processedDate; + private OffsetDateTime softDeletedTime; + @Builder.Default + private List positions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java new file mode 100644 index 000000000..ee393d3c7 --- /dev/null +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ResizeRedactionRequest.java @@ -0,0 +1,25 @@ +package com.iqser.red.service.persistence.service.v1.api.model.annotations; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ResizeRedactionRequest { + + private String annotationId; + private String user; + private AnnotationStatus status; + private String comment; + private int page; + + @Builder.Default + private List positions = new ArrayList<>(); +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java index 65b20c199..53be0eeb2 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/ManualRedactionResource.java @@ -58,6 +58,12 @@ public interface ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId, @RequestBody CommentRequest comment); + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + ManualAddResponse addResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ResizeRedactionRequest resizeRedactionRequest); + + @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/add" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) ManualRedactionEntry getAddRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); @@ -87,6 +93,11 @@ public interface ManualRedactionResource { Comment getComment(@PathVariable(COMMENT_ID) long commentId); + @GetMapping(value = MANUAL_REDACTION_REST_PATH + "/resize" + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + ManualResizeRedaction getResizeRedaction(@PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId); + + @DeleteMapping(MANUAL_REDACTION_REST_PATH + "/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE) void deleteAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId); @@ -116,6 +127,11 @@ public interface ManualRedactionResource { void deleteComment(@PathVariable(FILE_ID) String fileId, @PathVariable(COMMENT_ID) long commentId); + @DeleteMapping(MANUAL_REDACTION_REST_PATH + "/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE) + void deleteResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId); + + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/add" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) void updateAddRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId, @@ -146,6 +162,11 @@ public interface ManualRedactionResource { @PathVariable(ANNOTATION_ID) String annotationId, @RequestBody JSONPrimitive updateStatusRequest); + @PostMapping(value = MANUAL_REDACTION_REST_PATH + "/status/resize" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + ANNOTATION_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) + void updateResizeRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @RequestBody JSONPrimitive updateStatusRequest); + @GetMapping(value = MANUAL_REDACTION_REST_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java new file mode 100644 index 000000000..dd64dc3be --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ManualResizeRedactionEntity.java @@ -0,0 +1,54 @@ +package com.iqser.red.service.persistence.management.v1.processor.entity.annotations; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "manual_resize_redaction") +public class ManualResizeRedactionEntity { + + @EmbeddedId + private AnnotationEntityId id; + @Column(name = "user_id") + private String user; + @Column + @Enumerated(EnumType.STRING) + private AnnotationStatus status; + @Column + private OffsetDateTime requestDate; + @Column + private OffsetDateTime processedDate; + @Column + private OffsetDateTime softDeletedTime; + @Column + private int page; + + @ManyToOne + private FileEntity fileStatus; + + @ElementCollection + private List positions = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java new file mode 100644 index 000000000..5f00fb561 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ResizeRedactionPersistenceService.java @@ -0,0 +1,81 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.transaction.Transactional; + +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ResizeRedactionRepository; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.ResizeRedactionRequest; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ResizeRedactionPersistenceService { + + private final ResizeRedactionRepository resizeRedactionRepository; + + @Transactional + public void insert(String fileId, ResizeRedactionRequest resizeRedactionRequest) { + + ManualResizeRedactionEntity manualResizeRedaction = new ManualResizeRedactionEntity(); + manualResizeRedaction.setId(new AnnotationEntityId(resizeRedactionRequest.getAnnotationId(), fileId)); + BeanUtils.copyProperties(resizeRedactionRequest, manualResizeRedaction); + manualResizeRedaction.setPositions(convert(resizeRedactionRequest.getPositions(), RectangleEntity.class)); + manualResizeRedaction.setRequestDate(OffsetDateTime.now()); + + resizeRedactionRepository.save(manualResizeRedaction); + } + + @Transactional + public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) { + resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> { + mre.setProcessedDate(OffsetDateTime.now()); + mre.setStatus(annotationStatus); + }); + } + + + @Transactional + public void hardDelete(String fileId, String annotationId) { + resizeRedactionRepository.deleteById(new AnnotationEntityId(annotationId, fileId)); + } + + @Transactional + public void softDelete(String fileId, String annotationId, OffsetDateTime softDeleteTime) { + resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(softDeleteTime)); + } + + @Transactional + public void undelete(String fileId, String annotationId) { + resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)).ifPresent(mre -> mre.setSoftDeletedTime(null)); + } + + public ManualResizeRedactionEntity findResizeRedaction(String fileId, String annotationId) { + + return resizeRedactionRepository.findById(new AnnotationEntityId(annotationId, fileId)) + .filter(mre -> mre.getSoftDeletedTime() == null) + .orElseThrow(() -> + new NotFoundException("Unknown file/annotation combination: " + fileId + "/" + annotationId)); + } + + + public Set findResizeRedactions(String fileId, boolean includeDeletions) { + + return resizeRedactionRepository.findByIdFileId(fileId).stream().filter(mre -> includeDeletions || mre.getSoftDeletedTime() == null).collect(Collectors.toSet()); + + } +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java new file mode 100644 index 000000000..f26c950a0 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ResizeRedactionRepository.java @@ -0,0 +1,13 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity; + +public interface ResizeRedactionRepository extends JpaRepository { + + List findByIdFileId(String fileId); +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java index a9a221ead..4e29df31e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ManualRedactionController.java @@ -3,6 +3,7 @@ package com.iqser.red.service.peristence.v1.server.controller; import com.iqser.red.service.peristence.v1.server.service.ManualRedactionService; import com.iqser.red.service.peristence.v1.server.utils.ManualImageRecategorizationMapper; import com.iqser.red.service.peristence.v1.server.utils.ManualRedactionMapper; +import com.iqser.red.service.peristence.v1.server.utils.ManualResizeRedactionMapper; import com.iqser.red.service.persistence.service.v1.api.model.annotations.*; import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.resources.ManualRedactionResource; @@ -74,6 +75,15 @@ public class ManualRedactionController implements ManualRedactionResource { } + @Override + public ManualAddResponse addResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ResizeRedactionRequest resizeRedactionRequest) { + + return manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequest); + } + + @Override public ManualRedactionEntry getAddRedaction(@PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { @@ -119,6 +129,13 @@ public class ManualRedactionController implements ManualRedactionResource { } + public ManualResizeRedaction getResizeRedaction(@PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId) { + + return convert(manualRedactionService.getResizeRedaction(fileId, annotationId), ManualResizeRedaction.class, new ManualResizeRedactionMapper()); + } + + @Override public void deleteAddRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @PathVariable(ANNOTATION_ID) String annotationId) { @@ -167,6 +184,14 @@ public class ManualRedactionController implements ManualRedactionResource { } + @Override + public void deleteResizeRedaction(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId) { + + manualRedactionService.deleteResizeRedaction(dossierId, fileId, annotationId); + } + + @Override public void updateAddRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @@ -216,6 +241,16 @@ public class ManualRedactionController implements ManualRedactionResource { } + @Override + public void updateResizeRedactionStatus(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @PathVariable(ANNOTATION_ID) String annotationId, + @RequestBody JSONPrimitive updateStatusRequest) { + + manualRedactionService.updateResizeRedactionStatus(dossierId, fileId, annotationId, updateStatusRequest.getValue()); + } + + @Override public ManualRedactions getManualRedactions(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java index 65f7948c2..45a2cd736 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileService.java @@ -42,6 +42,7 @@ public class FileService { private final DossierPersistenceService dossierPersistenceService; private final ImageRecategorizationPersistenceService recategorizationPersistenceService; private final LegalBasisChangePersistenceService legalBasisChangePersistenceService; + private final ResizeRedactionPersistenceService resizeRedactionPersistenceService; private final IndexingService indexingService; @@ -127,6 +128,13 @@ public class FileService { }); }); + resizeRedactionPersistenceService.findResizeRedactions(fileId, false).forEach(annotation -> { + resizeRedactionPersistenceService.softDelete(fileId, annotation.getId().getAnnotationId(), softDeletedTime); + commentPersistenceService.findCommentsByAnnotationId(fileId, annotation.getId().getAnnotationId(), false).forEach(comment -> { + commentPersistenceService.softDelete(comment.getId(), softDeletedTime); + }); + }); + legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false).forEach(legalBasisChange -> { legalBasisChangePersistenceService.softDelete(fileId, legalBasisChange.getId().getAnnotationId(), softDeletedTime); commentPersistenceService.findCommentsByAnnotationId(fileId, legalBasisChange.getId().getAnnotationId(), false) @@ -172,6 +180,13 @@ public class FileService { }); }); + resizeRedactionPersistenceService.findResizeRedactions(fileId, true).forEach(annotation -> { + resizeRedactionPersistenceService.hardDelete(fileId, annotation.getId().getAnnotationId()); + commentPersistenceService.findCommentsByAnnotationId(fileId, annotation.getId().getAnnotationId(), true).forEach(comment -> { + commentPersistenceService.hardDelete(comment.getId()); + }); + }); + } public void undeleteFile(String dossierTemplateId, String dossierId, String fileId, OffsetDateTime softDeletedTime) { @@ -219,6 +234,17 @@ public class FileService { } }); + resizeRedactionPersistenceService.findResizeRedactions(fileId, true).forEach(annotation -> { + if (annotation.getSoftDeletedTime().equals(softDeletedTime) || annotation.getSoftDeletedTime().isAfter(softDeletedTime)) { + resizeRedactionPersistenceService.undelete(fileId, annotation.getId().getAnnotationId()); + commentPersistenceService.findCommentsByAnnotationId(fileId, annotation.getId().getAnnotationId(), true).forEach(comment -> { + if (comment.getSoftDeletedTime().equals(softDeletedTime) || comment.getSoftDeletedTime().isAfter(softDeletedTime)) { + commentPersistenceService.undelete(comment.getId()); + } + }); + } + }); + indexingService.addToIndexingQueue(dossierTemplateId, dossierId, fileId, 2); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java index f1f89efbb..d7dcb752d 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/FileStatusService.java @@ -46,6 +46,7 @@ public class FileStatusService { private final ForceRedactionPersistenceService forceRedactionPersistenceService; private final RemoveRedactionPersistenceService removeRedactionPersistenceService; private final AddRedactionPersistenceService addRedactionPersistenceService; + private final ResizeRedactionPersistenceService resizeRedactionPersistenceService; public List getDossierStatus(String dossierId) { @@ -312,7 +313,11 @@ public class FileStatusService { // wipe image recat var imageRecategorizations = imageRecategorizationPersistenceService.findRecategorizations(fileId, false); - imageRecategorizations.forEach(f -> imageRecategorizationPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now)); + imageRecategorizations.forEach(f -> imageRecategorizationPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));// wipe image recat + + // wipe resize redactions + var resizeRedactions = resizeRedactionPersistenceService.findResizeRedactions(fileId, false); + resizeRedactions.forEach(f -> resizeRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now)); // wipe legal basis changes var legalBasisChanges = legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java index 643f6f0eb..71aae6410 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionProviderService.java @@ -25,6 +25,7 @@ public class ManualRedactionProviderService { private final CommentPersistenceService commentPersistenceService; private final ImageRecategorizationPersistenceService recategorizationPersistenceService; private final LegalBasisChangePersistenceService legalBasisChangePersistenceService; + private final ResizeRedactionPersistenceService resizeRedactionPersistenceService; @Transactional public ManualRedactions getManualRedactions(String fileId) { @@ -40,6 +41,8 @@ public class ManualRedactionProviderService { Set legalBasisChanges = convert(legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false), ManualLegalBasisChange.class); + Set resizeRedactions = convert(resizeRedactionPersistenceService.findResizeRedactions(fileId, false), ManualResizeRedaction.class); + Map> commentEntities = commentPersistenceService.findCommentsByFileID(fileId, false); Map> comments = new HashMap<>(); @@ -48,7 +51,7 @@ public class ManualRedactionProviderService { }); - return new ManualRedactions(removals, entriesToAdd, forceRedactions, recategorizations, legalBasisChanges, comments); + return new ManualRedactions(removals, entriesToAdd, forceRedactions, recategorizations, legalBasisChanges, resizeRedactions, comments); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java index ddee6d382..884535e0b 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/service/ManualRedactionService.java @@ -40,6 +40,7 @@ public class ManualRedactionService { private final FileManagementStorageService fileManagementStorageService; private final ImageRecategorizationPersistenceService recategorizationPersistenceService; private final LegalBasisChangePersistenceService legalBasisChangePersistenceService; + private final ResizeRedactionPersistenceService resizeRedactionPersistenceService; private final FileStatusService fileStatusService; private final ManualRedactionProviderService manualRedactionProviderService; private final AnalysisFlagsCalculationService analysisFlagsCalculationService; @@ -231,6 +232,35 @@ public class ManualRedactionService { return createdComment; } + public ManualAddResponse addResizeRedaction(String dossierId, String fileId, + ResizeRedactionRequest resizeRedactionRequest) { + + dossierPersistenceService.getAndValidateDossier(dossierId); + + OffsetDateTime now = OffsetDateTime.now(); + resizeRedactionPersistenceService.insert(fileId, resizeRedactionRequest); + + Long commentId = null; + if (resizeRedactionRequest.getComment() != null) { + + commentId = addComment(fileId, resizeRedactionRequest.getAnnotationId(), resizeRedactionRequest.getComment(), resizeRedactionRequest + .getUser()).getId(); + } + + if (resizeRedactionRequest.getStatus().equals(AnnotationStatus.REQUESTED)) { + fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, now, true); + } else { + fileStatusPersistenceService.updateLastManualRedaction(fileId, now); + } + + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + + return ManualAddResponse.builder() + .annotationId(resizeRedactionRequest.getAnnotationId()) + .commentId(commentId) + .build(); + } + public ManualRedactionEntryEntity getAddRedaction(String fileId, String annotationId) { @@ -268,6 +298,12 @@ public class ManualRedactionService { } + public ManualResizeRedactionEntity getResizeRedaction(String fileId, String annotationId) { + + return resizeRedactionPersistenceService.findResizeRedaction(fileId, annotationId); + } + + public void deleteAddRedaction(String dossierId, String fileId, String annotationId) { var addRedaction = getAddRedaction(fileId, annotationId); @@ -370,6 +406,22 @@ public class ManualRedactionService { } + public void deleteResizeRedaction(String dossierId, String fileId, String annotationId) { + + var resizeRedaction = getResizeRedaction(fileId, annotationId); + + resizeRedactionPersistenceService.softDelete(fileId, annotationId, OffsetDateTime.now()); + + if (resizeRedaction.getStatus().equals(AnnotationStatus.REQUESTED)) { + boolean hasSuggestions = calculateHasSuggestions(fileId); + fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions); + } else { + fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now()); + } + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + } + + @SuppressWarnings("PMD") public void updateRemoveRedactionStatus(String dossierId, String fileId, String annotationId, AnnotationStatus annotationStatus) { @@ -489,6 +541,16 @@ public class ManualRedactionService { } + public void updateResizeRedactionStatus(String dossierId, String fileId, String annotationId, AnnotationStatus annotationStatus) { + + dossierPersistenceService.getAndValidateDossier(dossierId); + resizeRedactionPersistenceService.updateStatus(fileId, annotationId, annotationStatus); + boolean hasSuggestions = calculateHasSuggestions(fileId); + fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions); + analysisFlagsCalculationService.calculateFlags(dossierId, fileId); + } + + public ManualRedactions getManualRedactions(String fileId) { return manualRedactionProviderService.getManualRedactions(fileId); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java new file mode 100644 index 000000000..88f21b0b0 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/utils/ManualResizeRedactionMapper.java @@ -0,0 +1,19 @@ +package com.iqser.red.service.peristence.v1.server.utils; + +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.util.function.BiConsumer; + +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualResizeRedaction; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.Rectangle; + +public class ManualResizeRedactionMapper implements BiConsumer { + + @Override + public void accept(ManualResizeRedactionEntity manualResizeRedactionEntity, ManualResizeRedaction manualRedaction) { + + manualRedaction.setPositions(convert(manualResizeRedactionEntity.getPositions(), Rectangle.class)); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java index 57a7a187e..bc788fa92 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ManualRedactionTest.java @@ -161,7 +161,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { var imageRecategorization2 = manualRedactionClient.addImageRecategorization(dossier.getId(), file.getId(), ImageRecategorizationRequest.builder() .annotationId(addRedaction2.getAnnotationId()).comment("comment").status(AnnotationStatus.APPROVED).user("test").typeId("new-type:id").build()); - var loadedImageRecategorization2 = manualRedactionClient.getImageRecategorization(file.getId(), imageRecategorization2.getAnnotationId()); assertThat(loadedImageRecategorization2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); @@ -169,6 +168,21 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { loadedImageRecategorization2 = manualRedactionClient.getImageRecategorization(file.getId(), imageRecategorization2.getAnnotationId()); assertThat(loadedImageRecategorization2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); + var resizeRedaction = manualRedactionClient.addResizeRedaction(dossier.getId(), file.getId(), ResizeRedactionRequest.builder() + .annotationId(addRedaction.getAnnotationId()).page(1).comment("comment").status(AnnotationStatus.REQUESTED).positions(List.of(Rectangle.builder().topLeftY(2).topLeftX(2).height(2).width(2).build())).user("test").build()); + var loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId()); + assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); + assertThat(loadedResizeRedaction.getUser()).isEqualTo("test"); + assertThat(loadedResizeRedaction.getPositions()).isNotEmpty(); + + manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), file.getId(), resizeRedaction.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.APPROVED)); + loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId()); + assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.APPROVED); + + manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), file.getId(), resizeRedaction.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.DECLINED)); + loadedResizeRedaction = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction.getAnnotationId()); + assertThat(loadedResizeRedaction.getStatus()).isEqualTo(AnnotationStatus.DECLINED); + ManualRedactions manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId()); assertThat(manualRedactions.getForceRedactions()).isNotEmpty(); @@ -214,5 +228,16 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest { manualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId()); manualRedactions.getLegalBasisChanges().forEach(e -> manualRedactionClient.deleteLegalBasisChange(dossier.getId(), file.getId(), e.getAnnotationId())); + var resizeRedaction2 = manualRedactionClient.addResizeRedaction(dossier.getId(), file.getId(), ResizeRedactionRequest.builder() + .annotationId(addRedaction.getAnnotationId()).page(1).comment("comment").status(AnnotationStatus.APPROVED).positions(List.of(Rectangle.builder().topLeftY(2).topLeftX(2).height(2).width(2).build())).user("test").build()); + var loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId()); + assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); + assertThat(loadedResizeRedaction2.getUser()).isEqualTo("test"); + assertThat(loadedResizeRedaction2.getPositions()).isNotEmpty(); + + manualRedactionClient.updateResizeRedactionStatus(dossier.getId(), file.getId(), resizeRedaction2.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.REQUESTED)); + loadedResizeRedaction2 = manualRedactionClient.getResizeRedaction(file.getId(), resizeRedaction2.getAnnotationId()); + assertThat(loadedResizeRedaction2.getStatus()).isEqualTo(AnnotationStatus.REQUESTED); + } }