RED-3243: Read redaction annotation from preview documents

This commit is contained in:
deiflaender 2022-01-26 13:01:50 +01:00
parent 713d1fc5bc
commit abd311a2e0
6 changed files with 179 additions and 2 deletions

View File

@ -0,0 +1,8 @@
package com.iqser.red.service.persistence.service.v1.api.model.annotations;
public enum ImportedAnnotationStatus {
NEW,
APPROVED,
DECLINED,
ADDED
}

View File

@ -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<RectangleEntity> positions = new ArrayList<>();
@ManyToOne
private FileEntity fileStatus;
@Column
private String comment;
}

View File

@ -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<Annotation> 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<ImportedAnnotationEntity> findImportedAnnotations(String fileId) {
return importedAnnotationRepository.findByIdFileId(fileId);
}
private List<RectangleEntity> convert(List<Rectangle> positions) {
List<RectangleEntity> 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;
}
}

View File

@ -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<ImportedAnnotationEntity, AnnotationEntityId> {
List<ImportedAnnotationEntity> 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);
}

View File

@ -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<String> 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");
}

View File

@ -27,7 +27,7 @@
<properties>
<redaction-service.version>3.56.0</redaction-service.version>
<search-service.version>2.18.0</search-service.version>
<pdftron-redaction-service.version>3.17.0</pdftron-redaction-service.version>
<pdftron-redaction-service.version>3.28.0</pdftron-redaction-service.version>
<redaction-report-service.version>3.19.0</redaction-report-service.version>
</properties>