From abd311a2e0fd9e3db26d8f273e92c3bf0492217c Mon Sep 17 00:00:00 2001 From: deiflaender Date: Wed, 26 Jan 2022 13:01:50 +0100 Subject: [PATCH] RED-3243: Read redaction annotation from preview documents --- .../annotations/ImportedAnnotationStatus.java | 8 ++ .../annotations/ImportedAnnotationEntity.java | 54 ++++++++++++ .../ImportedAnnotationPersistenceService.java | 86 +++++++++++++++++++ .../ImportedAnnotationRepository.java | 24 ++++++ .../v1/server/service/FileService.java | 7 +- persistence-service-v1/pom.xml | 2 +- 6 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImportedAnnotationStatus.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ImportedAnnotationEntity.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImportedAnnotationPersistenceService.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/ImportedAnnotationRepository.java diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImportedAnnotationStatus.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImportedAnnotationStatus.java new file mode 100644 index 000000000..8d52b1eea --- /dev/null +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/annotations/ImportedAnnotationStatus.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.model.annotations; + +public enum ImportedAnnotationStatus { + NEW, + APPROVED, + DECLINED, + ADDED +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ImportedAnnotationEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ImportedAnnotationEntity.java new file mode 100644 index 000000000..6734a86df --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/annotations/ImportedAnnotationEntity.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.ImportedAnnotationStatus; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Entity +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "imported_annotation") +public class ImportedAnnotationEntity { + + @EmbeddedId + private AnnotationEntityId id; + + @Column(name = "user_id") + private String user; + + @Column + @Enumerated(EnumType.STRING) + private ImportedAnnotationStatus status; + + @Column + private OffsetDateTime processedDate; + + @ElementCollection + private List positions = new ArrayList<>(); + + @ManyToOne + private FileEntity fileStatus; + + @Column + private String comment; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImportedAnnotationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImportedAnnotationPersistenceService.java new file mode 100644 index 000000000..348692af9 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ImportedAnnotationPersistenceService.java @@ -0,0 +1,86 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence; + +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; + +import javax.transaction.Transactional; + +import org.springframework.stereotype.Service; + +import com.iqser.red.service.pdftron.redaction.v1.api.model.Annotation; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ImportedAnnotationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ImportedAnnotationRepository; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImportedAnnotationStatus; +import com.iqser.red.service.redaction.v1.model.Rectangle; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ImportedAnnotationPersistenceService { + + private final ImportedAnnotationRepository importedAnnotationRepository; + + + @Transactional + public void insert(String fileId, List annotations) { + + annotations.forEach(annotation -> insert(fileId, annotation, ImportedAnnotationStatus.NEW, null, null)); + } + + + @Transactional + public void insert(String fileId, Annotation annotation, ImportedAnnotationStatus status, String userId, String comment) { + + ImportedAnnotationEntity importedAnnotationEntity = new ImportedAnnotationEntity(); + importedAnnotationEntity.setId(new AnnotationEntityId(annotation.getId(), fileId)); + importedAnnotationEntity.setStatus(status); + importedAnnotationEntity.setProcessedDate(status == ImportedAnnotationStatus.ADDED ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : null); + importedAnnotationEntity.setUser(userId); + importedAnnotationEntity.setComment(comment); + importedAnnotationEntity.setPositions(convert(annotation.getPositions())); + importedAnnotationRepository.save(importedAnnotationEntity); + } + + + @Transactional + public void updateStatus(String fileId, String annotationId, ImportedAnnotationStatus annotationStatus, + String comment, String userId) { + + importedAnnotationRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), OffsetDateTime.now() + .truncatedTo(ChronoUnit.MILLIS), annotationStatus, comment, userId); + } + + + @Transactional + public void delete(String fileId, String annotationId){ + importedAnnotationRepository.deleteById(new AnnotationEntityId(annotationId, fileId)); + } + + + public List findImportedAnnotations(String fileId) { + + return importedAnnotationRepository.findByIdFileId(fileId); + } + + + private List convert(List positions) { + + List rectangleEntities = new ArrayList<>(); + positions.forEach(p -> { + RectangleEntity re = new RectangleEntity(); + re.setTopLeftX(p.getTopLeft().getX()); + re.setTopLeftY(p.getTopLeft().getY()); + re.setWidth(p.getWidth()); + re.setHeight(p.getHeight()); + re.setPage(p.getPage()); + rectangleEntities.add(re); + }); + return rectangleEntities; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImportedAnnotationRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImportedAnnotationRepository.java new file mode 100644 index 000000000..f845109f0 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/ImportedAnnotationRepository.java @@ -0,0 +1,24 @@ +package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; + +import java.time.OffsetDateTime; +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; +import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ImportedAnnotationEntity; +import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImportedAnnotationStatus; + +public interface ImportedAnnotationRepository extends JpaRepository { + + List findByIdFileId(String fileId); + + + @Modifying + @Query("update ImportedAnnotationEntity m set m.processedDate = :processedDate, m.status = :annotationStatus, m.comment = :comment, m.user = :userId where m.id = :id") + void updateStatus(AnnotationEntityId id, OffsetDateTime processedDate, ImportedAnnotationStatus annotationStatus, + String comment, String userId); + +} 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 a30817066..925538735 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 @@ -2,6 +2,8 @@ package com.iqser.red.service.peristence.v1.server.service; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; +import com.iqser.red.service.pdftron.redaction.v1.api.model.AnnotationExtractionResponse; +import com.iqser.red.service.pdftron.redaction.v1.api.model.DocumentRequest; import com.iqser.red.service.pdftron.redaction.v1.api.model.PdfTronOptimizeRequest; import com.iqser.red.service.pdftron.redaction.v1.api.model.PdfTronOptimizeResponse; import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient; @@ -47,6 +49,7 @@ public class FileService { private final LegalBasisChangePersistenceService legalBasisChangePersistenceService; private final ResizeRedactionPersistenceService resizeRedactionPersistenceService; private final IndexingService indexingService; + private final ImportedAnnotationPersistenceService importedAnnotationPersistenceService; public JSONPrimitive upload(BinaryFileRequest request) { @@ -68,7 +71,9 @@ public class FileService { } try { - PdfTronOptimizeResponse optimized = pdfTronRedactionClient.optimize(new PdfTronOptimizeRequest(request.getData())); + AnnotationExtractionResponse optimized = pdfTronRedactionClient.optimizeGetAndRemoveAnnotations(new DocumentRequest(request.getData())); + importedAnnotationPersistenceService.insert(fileId, optimized.getAnnotations()); + if (optimized.getNumberOfPages() == 0) { throw new BadRequestException("Empty document"); } diff --git a/persistence-service-v1/pom.xml b/persistence-service-v1/pom.xml index 3df65b12a..798af4cdf 100755 --- a/persistence-service-v1/pom.xml +++ b/persistence-service-v1/pom.xml @@ -27,7 +27,7 @@ 3.56.0 2.18.0 - 3.17.0 + 3.28.0 3.19.0