Pull request #198: RED-3242

Merge in RED/persistence-service from RED-3242 to master

* commit 'a2066533e286e8a92c9900a15aa1430c40fe81a2':
  Fixded PMD
  Fixded PMD
  Final touches for RED-3242
  RED-3242 - excluded from automatic analysis
This commit is contained in:
Timo Bejan 2022-01-27 10:23:09 +01:00
commit 36a8fc74ba
46 changed files with 348 additions and 330 deletions

View File

@ -0,0 +1,17 @@
package com.iqser.red.service.persistence.service.v1.api.model.annotations;
import lombok.Data;
import java.time.OffsetDateTime;
@Data
public class BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private AnnotationStatus status;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
}

View File

@ -5,21 +5,12 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class IdRemoval { public class IdRemoval extends BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private AnnotationStatus status;
private boolean removeFromDictionary; private boolean removeFromDictionary;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
} }

View File

@ -5,21 +5,12 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class ManualForceRedaction { public class ManualForceRedaction extends BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private AnnotationStatus status;
private String legalBasis; private String legalBasis;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
} }

View File

@ -5,20 +5,11 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class ManualImageRecategorization { public class ManualImageRecategorization extends BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private AnnotationStatus status;
private String type; private String type;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
} }

View File

@ -5,23 +5,14 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class ManualLegalBasisChange { public class ManualLegalBasisChange extends BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private AnnotationStatus status;
private String section; private String section;
private String value; private String value;
private String legalBasis; private String legalBasis;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
} }

View File

@ -5,7 +5,6 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -13,23 +12,16 @@ import java.util.List;
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class ManualRedactionEntry { public class ManualRedactionEntry extends BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private String type; private String type;
private String value; private String value;
private String reason; private String reason;
private String legalBasis; private String legalBasis;
private AnnotationStatus status;
private String section; private String section;
private boolean rectangle; private boolean rectangle;
private boolean addToDictionary; private boolean addToDictionary;
private boolean addToDossierDictionary; private boolean addToDossierDictionary;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
private List<Rectangle> positions = new ArrayList<>(); private List<Rectangle> positions = new ArrayList<>();
private String textBefore; private String textBefore;
private String textAfter; private String textAfter;

View File

@ -1,27 +1,19 @@
package com.iqser.red.service.persistence.service.v1.api.model.annotations; 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.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class ManualResizeRedaction { public class ManualResizeRedaction extends BaseAnnotation {
private String annotationId;
private String fileId;
private String user;
private AnnotationStatus status;
private OffsetDateTime requestDate;
private OffsetDateTime processedDate;
private OffsetDateTime softDeletedTime;
private String value; private String value;
@Builder.Default @Builder.Default
private List<Rectangle> positions = new ArrayList<>(); private List<Rectangle> positions = new ArrayList<>();

View File

@ -21,29 +21,31 @@ public interface ReanalysisResource {
@PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM) @PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM)
void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force); @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force);
@PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_PARAM)
void reanalyzeFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId,
@RequestBody Set<Integer> sectionsToReanalyse);
@PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH) @PostMapping(value = REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH)
void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds, void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force); @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force);
@PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM) @PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM)
void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId); void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser);
@PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_PARAM) @PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_PARAM)
void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId, @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force); void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force);
@PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH) @PostMapping(value = OCR_REANALYZE_PATH + DOSSIER_ID_PATH_PARAM + BULK_REST_PATH)
void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds); void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestBody Set<String> fileIds);
@PostMapping(value = REINDEX_PATH) @PostMapping(value = REINDEX_PATH)

View File

@ -24,6 +24,8 @@ public interface StatusResource {
String EXCLUDED_STATUS_PARAM = "excluded"; String EXCLUDED_STATUS_PARAM = "excluded";
String EXCLUDED_FROM_AUTOMATIC_ANALYSIS_PARAM = "excludedFromAutomaticAnalysis";
String APPROVER_ID_REQUEST_PARAM = "approverId"; String APPROVER_ID_REQUEST_PARAM = "approverId";
String ASSIGNEE_ID_REQUEST_PARAM = "assigneeId"; String ASSIGNEE_ID_REQUEST_PARAM = "assigneeId";
String USER_ID_REQUEST_PARAM = "userId"; String USER_ID_REQUEST_PARAM = "userId";
@ -74,6 +76,9 @@ public interface StatusResource {
@PostMapping(value = STATUS_PATH + "/toggle-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) @PostMapping(value = STATUS_PATH + "/toggle-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded); void toggleExclusion(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excluded);
@PostMapping(value = STATUS_PATH + "/toggle-automatic-analysis" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void toggleAutomaticAnalysis(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis);
@PostMapping(value = STATUS_PATH + "/exclude-pages" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE) @PostMapping(value = STATUS_PATH + "/exclude-pages" + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE)
void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set<Integer> pages); void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set<Integer> pages);

View File

@ -0,0 +1,24 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.annotations;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import java.time.OffsetDateTime;
public interface IBaseAnnotation {
AnnotationEntityId getId();
AnnotationStatus getStatus();
OffsetDateTime getRequestDate();
void setRequestDate(OffsetDateTime requestedDate);
OffsetDateTime getProcessedDate();
void setProcessedDate(OffsetDateTime processedDate);
OffsetDateTime getSoftDeletedTime();
void setSoftDeletedTime(OffsetDateTime softDeletedTime);
}

View File

@ -16,7 +16,7 @@ import java.time.OffsetDateTime;
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class IdRemovalEntity { public class IdRemovalEntity implements IBaseAnnotation {
@EmbeddedId @EmbeddedId
private AnnotationEntityId id; private AnnotationEntityId id;

View File

@ -16,7 +16,7 @@ import java.time.OffsetDateTime;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = "manual_force_redaction") @Table(name = "manual_force_redaction")
public class ManualForceRedactionEntity { public class ManualForceRedactionEntity implements IBaseAnnotation {
@EmbeddedId @EmbeddedId
private AnnotationEntityId id; private AnnotationEntityId id;

View File

@ -16,7 +16,7 @@ import java.time.OffsetDateTime;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = "manual_image_recategorization") @Table(name = "manual_image_recategorization")
public class ManualImageRecategorizationEntity { public class ManualImageRecategorizationEntity implements IBaseAnnotation {
@EmbeddedId @EmbeddedId
private AnnotationEntityId id; private AnnotationEntityId id;

View File

@ -16,7 +16,7 @@ import java.time.OffsetDateTime;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = "manual_legal_basis_change") @Table(name = "manual_legal_basis_change")
public class ManualLegalBasisChangeEntity { public class ManualLegalBasisChangeEntity implements IBaseAnnotation {
@EmbeddedId @EmbeddedId
private AnnotationEntityId id; private AnnotationEntityId id;

View File

@ -18,7 +18,7 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Table(name = "manual_redaction") @Table(name = "manual_redaction")
public class ManualRedactionEntryEntity { public class ManualRedactionEntryEntity implements IBaseAnnotation {
@EmbeddedId @EmbeddedId
private AnnotationEntityId id; private AnnotationEntityId id;

View File

@ -1,33 +1,24 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.annotations; 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.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = "manual_resize_redaction") @Table(name = "manual_resize_redaction")
public class ManualResizeRedactionEntity { public class ManualResizeRedactionEntity implements IBaseAnnotation {
@EmbeddedId @EmbeddedId
private AnnotationEntityId id; private AnnotationEntityId id;

View File

@ -118,6 +118,9 @@ public class FileEntity {
@Column @Column
private boolean excluded; private boolean excluded;
@Column
private boolean excludedFromAutomaticAnalysis;
@Column @Column
private OffsetDateTime hardDeletedTime; private OffsetDateTime hardDeletedTime;

View File

@ -71,7 +71,7 @@ public class FileStatusPersistenceService {
if (isFileDeleted(fileId)) { if (isFileDeleted(fileId)) {
return; return;
} }
fileRepository.updateFlags(fileId, OffsetDateTime.now(), hasRedactions, hasHints, hasImages, hasSuggestions, hasComments, hasUpdates); fileRepository.updateFlags(fileId, OffsetDateTime.now(), hasRedactions, hasHints, hasImages, hasSuggestions, hasComments, hasUpdates);
} }
@ -81,9 +81,8 @@ public class FileStatusPersistenceService {
if (isFileDeleted(fileId)) { if (isFileDeleted(fileId)) {
return; return;
} }
fileRepository.updateWorkflowStatus(fileId, workflowStatus, fileRepository.updateWorkflowStatus(fileId, workflowStatus, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), approval ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : null, approval);
approval ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : null);
} }
@ -97,9 +96,9 @@ public class FileStatusPersistenceService {
if (processingStatus == ProcessingStatus.PROCESSED) { if (processingStatus == ProcessingStatus.PROCESSED) {
// In case the file is updated to "processed", "lastProcessed" date should be updated to "now" // In case the file is updated to "processed", "lastProcessed" date should be updated to "now"
fileRepository.updateProcessingStatus(fileId, processingStatus, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), fileRepository.updateProcessingStatus(fileId, processingStatus, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
} else { } else {
fileRepository.updateProcessingStatus(fileId, processingStatus, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); fileRepository.updateProcessingStatus(fileId, processingStatus, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
} }
} }
@ -112,7 +111,7 @@ public class FileStatusPersistenceService {
} }
fileRepository.setUpdateStatusIndexingSuccessful(fileId, ProcessingStatus.PROCESSED, fileRepository.setUpdateStatusIndexingSuccessful(fileId, ProcessingStatus.PROCESSED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
} }
@ -122,7 +121,7 @@ public class FileStatusPersistenceService {
if (isFileDeleted(fileId)) { if (isFileDeleted(fileId)) {
return; return;
} }
fileRepository.updateLastOCRTime(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), time); fileRepository.updateLastOCRTime(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), time);
} }
@ -132,7 +131,7 @@ public class FileStatusPersistenceService {
if (isFileDeleted(fileId)) { if (isFileDeleted(fileId)) {
return; return;
} }
fileRepository.updateHasComments(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), hasComments); fileRepository.updateHasComments(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), hasComments);
} }
@ -142,7 +141,7 @@ public class FileStatusPersistenceService {
if (isFileDeleted(fileId)) { if (isFileDeleted(fileId)) {
return; return;
} }
fileRepository.updateLastManualRedaction(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), date); fileRepository.updateLastManualRedaction(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), date);
} }
@ -154,7 +153,7 @@ public class FileStatusPersistenceService {
return; return;
} }
fileRepository.setUpdateLastManualRedactionAndHasSuggestions(fileId, fileRepository.setUpdateLastManualRedactionAndHasSuggestions(fileId,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), date, hasSuggestions); OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), date, hasSuggestions);
} }
@ -171,7 +170,7 @@ public class FileStatusPersistenceService {
var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes); var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes);
file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setFileAttributes(fileAttributeEntities); file.setFileAttributes(fileAttributeEntities);
}, () -> { }, () -> {
throw new NotFoundException("Unknown file=" + fileId); throw new NotFoundException("Unknown file=" + fileId);
}); });
@ -188,7 +187,7 @@ public class FileStatusPersistenceService {
file.setLastManualRedaction(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setLastManualRedaction(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setExcludedPages(excludedPages); file.setExcludedPages(excludedPages);
}, () -> { }, () -> {
throw new NotFoundException("Unknown file=" + fileId); throw new NotFoundException("Unknown file=" + fileId);
}); });
@ -224,7 +223,7 @@ public class FileStatusPersistenceService {
public void softDelete(String fileId, OffsetDateTime softDeletedTime) { public void softDelete(String fileId, OffsetDateTime softDeletedTime) {
int countUpdate = fileRepository.setSoftDelete(fileId, ProcessingStatus.DELETED, int countUpdate = fileRepository.setSoftDelete(fileId, ProcessingStatus.DELETED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime); OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime);
if (countUpdate == 0) { if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId); throw new NotFoundException("Unknown file=" + fileId);
} }
@ -237,7 +236,7 @@ public class FileStatusPersistenceService {
int countUpdate = fileRepository.setHardDelete(fileId, ProcessingStatus.DELETED, int countUpdate = fileRepository.setHardDelete(fileId, ProcessingStatus.DELETED,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
if (countUpdate == 0) { if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId); throw new NotFoundException("Unknown file=" + fileId);
} }
@ -279,7 +278,18 @@ public class FileStatusPersistenceService {
if (isFileDeleted(fileId)) { if (isFileDeleted(fileId)) {
return; return;
} }
int countUpdate = fileRepository.toggleExclusion(fileId, excluded, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); int countUpdate = fileRepository.toggleExclusion(fileId, excluded, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId);
}
}
@Transactional
public void toggleAutomaticAnalysis(String fileId, boolean excludedFromAutomaticAnalysis) {
if (isFileDeleted(fileId)) {
return;
}
int countUpdate = fileRepository.toggleAutomaticAnalysis(fileId, excludedFromAutomaticAnalysis, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
if (countUpdate == 0) { if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId); throw new NotFoundException("Unknown file=" + fileId);
} }
@ -296,7 +306,7 @@ public class FileStatusPersistenceService {
int countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.FULLREPROCESS, int countUpdate = fileRepository.overwriteFile(fileId, filename, uploader, ProcessingStatus.FULLREPROCESS,
WorkflowStatus.NEW, WorkflowStatus.NEW,
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
if (countUpdate == 0) { if (countUpdate == 0) {
throw new NotFoundException("Unknown file=" + fileId); throw new NotFoundException("Unknown file=" + fileId);
} }

View File

@ -1,4 +1,4 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
@ -16,9 +16,9 @@ import javax.transaction.Transactional;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@ -28,7 +28,7 @@ public class AddRedactionPersistenceService {
private final ManualRedactionRepository manualRedactionRepository; private final ManualRedactionRepository manualRedactionRepository;
public void insert(String fileId, String annotationId, AddRedactionRequest addRedactionRequest) { public ManualRedactionEntryEntity insert(String fileId, String annotationId, AddRedactionRequest addRedactionRequest) {
ManualRedactionEntryEntity manualRedactionEntry = new ManualRedactionEntryEntity(); ManualRedactionEntryEntity manualRedactionEntry = new ManualRedactionEntryEntity();
manualRedactionEntry.setId(new AnnotationEntityId(annotationId, fileId)); manualRedactionEntry.setId(new AnnotationEntityId(annotationId, fileId));
@ -37,13 +37,18 @@ public class AddRedactionPersistenceService {
manualRedactionEntry.setPositions(convert(addRedactionRequest.getPositions())); manualRedactionEntry.setPositions(convert(addRedactionRequest.getPositions()));
manualRedactionEntry.setTypeId(addRedactionRequest.getTypeId()); manualRedactionEntry.setTypeId(addRedactionRequest.getTypeId());
manualRedactionRepository.save(manualRedactionEntry); if (addRedactionRequest.getStatus() == AnnotationStatus.APPROVED) {
manualRedactionEntry.setProcessedDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
return manualRedactionRepository.save(manualRedactionEntry);
} }
@Transactional @Transactional
public void updateSurroundingText(AnnotationEntityId id, String textBefore, String textAfter){ public void updateSurroundingText(AnnotationEntityId id, String textBefore, String textAfter) {
manualRedactionRepository.updateSurroundingText(id, textBefore, textAfter); manualRedactionRepository.updateSurroundingText(id, textBefore, textAfter);
} }
@ -69,7 +74,7 @@ public class AddRedactionPersistenceService {
public Set<ManualRedactionEntryEntity> findAddRedactions(String fileId, boolean includeDeletions) { public Set<ManualRedactionEntryEntity> findAddRedactions(String fileId, boolean includeDeletions) {
return manualRedactionRepository.findByFileIdIncludeDeletions(fileId, includeDeletions).stream().collect(Collectors.toSet()); return new HashSet<>(manualRedactionRepository.findByFileIdIncludeDeletions(fileId, includeDeletions));
} }
@ -94,19 +99,13 @@ public class AddRedactionPersistenceService {
@Transactional @Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) { public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
manualRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), manualRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus);
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
annotationStatus);
} }
@Transactional @Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary, boolean isAddOrRemoveFromDossierDictionary) {
, boolean isAddOrRemoveFromDossierDictionary) {
manualRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), manualRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus, isAddOrRemoveFromDictionary, isAddOrRemoveFromDossierDictionary);
OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS),
annotationStatus,
isAddOrRemoveFromDictionary, isAddOrRemoveFromDossierDictionary);
} }
} }

View File

@ -1,4 +1,4 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;

View File

@ -1,12 +1,14 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualForceRedaction;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -33,17 +35,12 @@ public class ForceRedactionPersistenceService {
manualForceRedaction.setId(new AnnotationEntityId(forceRedactionRequest.getAnnotationId(), fileId)); manualForceRedaction.setId(new AnnotationEntityId(forceRedactionRequest.getAnnotationId(), fileId));
BeanUtils.copyProperties(forceRedactionRequest, manualForceRedaction); BeanUtils.copyProperties(forceRedactionRequest, manualForceRedaction);
manualForceRedaction.setRequestDate(OffsetDateTime.now()); manualForceRedaction.setRequestDate(OffsetDateTime.now());
if(manualForceRedaction.getStatus().equals(AnnotationStatus.APPROVED)) {
manualForceRedaction.setProcessedDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
forceRedactionRepository.save(manualForceRedaction); forceRedactionRepository.save(manualForceRedaction);
} }
@Transactional @Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) { public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
forceRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus, forceRedactionRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus);
OffsetDateTime.now());
} }
@ -72,7 +69,10 @@ public class ForceRedactionPersistenceService {
public Set<ManualForceRedactionEntity> findForceRedactions(String fileId, boolean includeDeletions) { public Set<ManualForceRedactionEntity> findForceRedactions(String fileId, boolean includeDeletions) {
return forceRedactionRepository.findByFileIdIncludeDeletions(fileId, includeDeletions).stream().collect(Collectors.toSet()); return new HashSet<>(forceRedactionRepository.findByFileIdIncludeDeletions(fileId, includeDeletions));
} }
public void markAsProcessed(ManualForceRedaction e) {
forceRedactionRepository.markAsProcessed(new AnnotationEntityId(e.getAnnotationId(), e.getFileId()), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
} }

View File

@ -1,4 +1,4 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualImageRecategorizationEntity;
@ -6,12 +6,15 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ImageRecategorizationRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ImageRecategorizationRepository;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest; import com.iqser.red.service.persistence.service.v1.api.model.annotations.ImageRecategorizationRequest;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualForceRedaction;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualImageRecategorization;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List; import java.util.List;
@Service @Service
@ -34,8 +37,7 @@ public class ImageRecategorizationPersistenceService {
@Transactional @Transactional
public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) { public void updateStatus(String fileId, String annotationId, AnnotationStatus annotationStatus) {
imageRecategorizationRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus, imageRecategorizationRepository.updateStatus(new AnnotationEntityId(annotationId, fileId), annotationStatus);
OffsetDateTime.now());
} }
@Transactional @Transactional
@ -68,5 +70,7 @@ public class ImageRecategorizationPersistenceService {
} }
public void markAsProcessed(ManualImageRecategorization e) {
imageRecategorizationRepository.markAsProcessed(new AnnotationEntityId(e.getAnnotationId(), e.getFileId()), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
} }

View File

@ -1,4 +1,4 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity;
@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -22,13 +23,18 @@ public class LegalBasisChangePersistenceService {
private final LegalBasisChangeRepository legalBasisChangeRepository; private final LegalBasisChangeRepository legalBasisChangeRepository;
public void insert(String fileId, LegalBasisChangeRequest legalBasisChangeRequest) { public ManualLegalBasisChangeEntity insert(String fileId, LegalBasisChangeRequest legalBasisChangeRequest) {
ManualLegalBasisChangeEntity manualLegalBasisChange = new ManualLegalBasisChangeEntity(); ManualLegalBasisChangeEntity manualLegalBasisChange = new ManualLegalBasisChangeEntity();
manualLegalBasisChange.setId(new AnnotationEntityId(legalBasisChangeRequest.getAnnotationId(), fileId)); manualLegalBasisChange.setId(new AnnotationEntityId(legalBasisChangeRequest.getAnnotationId(), fileId));
BeanUtils.copyProperties(legalBasisChangeRequest, manualLegalBasisChange); BeanUtils.copyProperties(legalBasisChangeRequest, manualLegalBasisChange);
manualLegalBasisChange.setRequestDate(OffsetDateTime.now()); manualLegalBasisChange.setRequestDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
legalBasisChangeRepository.save(manualLegalBasisChange);
if(legalBasisChangeRequest.getStatus() == AnnotationStatus.APPROVED) {
manualLegalBasisChange.setProcessedDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
return legalBasisChangeRepository.save(manualLegalBasisChange);
} }

View File

@ -1,10 +1,11 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.IdRemovalEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RemoveRedactionRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RemoveRedactionRepository;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus; import com.iqser.red.service.persistence.service.v1.api.model.annotations.AnnotationStatus;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.IdRemoval;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest; import com.iqser.red.service.persistence.service.v1.api.model.annotations.RemoveRedactionRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -12,6 +13,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -74,5 +76,8 @@ public class RemoveRedactionPersistenceService {
annotationStatus, OffsetDateTime.now(), isAddOrRemoveFromDictionary); annotationStatus, OffsetDateTime.now(), isAddOrRemoveFromDictionary);
} }
@Transactional
public void markAsProcessed(IdRemoval e) {
removeRedactionRepository.markAsProcessed(new AnnotationEntityId(e.getAnnotationId(), e.getFileId()), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}
} }

View File

@ -1,4 +1,4 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence; package com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations;
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
@ -29,18 +29,19 @@ public class ResizeRedactionPersistenceService {
@Transactional @Transactional
public void insert(String fileId, ResizeRedactionRequest resizeRedactionRequest) { public ManualResizeRedactionEntity insert(String fileId, ResizeRedactionRequest resizeRedactionRequest) {
ManualResizeRedactionEntity manualResizeRedaction = new ManualResizeRedactionEntity(); ManualResizeRedactionEntity manualResizeRedaction = new ManualResizeRedactionEntity();
manualResizeRedaction.setId(new AnnotationEntityId(resizeRedactionRequest.getAnnotationId(), fileId)); manualResizeRedaction.setId(new AnnotationEntityId(resizeRedactionRequest.getAnnotationId(), fileId));
BeanUtils.copyProperties(resizeRedactionRequest, manualResizeRedaction); BeanUtils.copyProperties(resizeRedactionRequest, manualResizeRedaction);
manualResizeRedaction.setPositions(convert(resizeRedactionRequest.getPositions(), RectangleEntity.class)); manualResizeRedaction.setPositions(convert(resizeRedactionRequest.getPositions(), RectangleEntity.class));
manualResizeRedaction.setRequestDate(OffsetDateTime.now()); manualResizeRedaction.setRequestDate(OffsetDateTime.now());
if(manualResizeRedaction.getStatus().equals(AnnotationStatus.APPROVED)) { if(manualResizeRedaction.getStatus().equals(AnnotationStatus.APPROVED)) {
manualResizeRedaction.setProcessedDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); manualResizeRedaction.setProcessedDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
} }
resizeRedactionRepository.save(manualResizeRedaction); return resizeRedactionRepository.save(manualResizeRedaction);
} }

View File

@ -45,9 +45,9 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
int analysisVersion, OffsetDateTime lastUpdated, OffsetDateTime lastProcessed, int analysisNumber); int analysisVersion, OffsetDateTime lastUpdated, OffsetDateTime lastProcessed, int analysisNumber);
@Modifying @Modifying
@Query("update FileEntity f set f.workflowStatus = :workflowStatus, f.lastUpdated = :lastUpdated, f.approvalDate = :approvalDate " + @Query("update FileEntity f set f.workflowStatus = :workflowStatus, f.lastUpdated = :lastUpdated, f.approvalDate = :approvalDate," +
"where f.id = :fileId") " f.excludedFromAutomaticAnalysis = :excludedFromAutomaticAnalysis where f.id = :fileId")
void updateWorkflowStatus(String fileId, WorkflowStatus workflowStatus, OffsetDateTime lastUpdated, OffsetDateTime approvalDate); void updateWorkflowStatus(String fileId, WorkflowStatus workflowStatus, OffsetDateTime lastUpdated, OffsetDateTime approvalDate, boolean excludedFromAutomaticAnalysis);
@Modifying(clearAutomatically = true) @Modifying(clearAutomatically = true)
@Query("update FileEntity f set f.processingStatus = :processingStatus, f.lastUpdated = :lastUpdated " + @Query("update FileEntity f set f.processingStatus = :processingStatus, f.lastUpdated = :lastUpdated " +
@ -109,6 +109,10 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
@Query("update FileEntity f set f.excluded = :excluded, f.lastUpdated = :lastUpdated where f.id = :fileId") @Query("update FileEntity f set f.excluded = :excluded, f.lastUpdated = :lastUpdated where f.id = :fileId")
int toggleExclusion(String fileId, boolean excluded, OffsetDateTime lastUpdated); int toggleExclusion(String fileId, boolean excluded, OffsetDateTime lastUpdated);
@Modifying(clearAutomatically = true)
@Query("update FileEntity f set f.excludedFromAutomaticAnalysis = :excludedFromAutomaticAnalysis, f.lastUpdated = :lastUpdated where f.id = :fileId")
int toggleAutomaticAnalysis(String fileId, boolean excludedFromAutomaticAnalysis, OffsetDateTime lastUpdated);
@Modifying(clearAutomatically = true) @Modifying(clearAutomatically = true)
@Query("update FileEntity f set f.filename = :filename, f.uploader = :uploader, f.processingStatus = :processingStatus, " + @Query("update FileEntity f set f.filename = :filename, f.uploader = :uploader, f.processingStatus = :processingStatus, " +
"f.workflowStatus = :workflowStatus, f.lastUploaded = :lastUploaded, f.lastUpdated = :lastUpdated, " + "f.workflowStatus = :workflowStatus, f.lastUploaded = :lastUploaded, f.lastUpdated = :lastUpdated, " +

View File

@ -16,9 +16,9 @@ public interface ForceRedactionRepository extends JpaRepository<ManualForceRedac
List<ManualForceRedactionEntity> findByIdFileId(String fileId); List<ManualForceRedactionEntity> findByIdFileId(String fileId);
@Modifying @Modifying
@Query("update ManualForceRedactionEntity mfr set mfr.status = :annotationStatus, mfr.processedDate = :processedDate " + @Query("update ManualForceRedactionEntity mfr set mfr.status = :annotationStatus " +
"where mfr.id = :annotationEntityId") "where mfr.id = :annotationEntityId")
void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate); void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus);
@Modifying @Modifying
@Query("update ManualForceRedactionEntity mfr set mfr.softDeletedTime = :softDeletedTime " + @Query("update ManualForceRedactionEntity mfr set mfr.softDeletedTime = :softDeletedTime " +
@ -31,4 +31,7 @@ public interface ForceRedactionRepository extends JpaRepository<ManualForceRedac
@Query("select mfr from ManualForceRedactionEntity mfr where mfr.id.fileId = :fileId and (:includeDeletions = true or mfr.softDeletedTime is null)") @Query("select mfr from ManualForceRedactionEntity mfr where mfr.id.fileId = :fileId and (:includeDeletions = true or mfr.softDeletedTime is null)")
List<ManualForceRedactionEntity> findByFileIdIncludeDeletions(String fileId, boolean includeDeletions); List<ManualForceRedactionEntity> findByFileIdIncludeDeletions(String fileId, boolean includeDeletions);
@Modifying
@Query("update ManualForceRedactionEntity mfr set mfr.processedDate = :processedDate where mfr.id = :annotationEntityId")
void markAsProcessed(AnnotationEntityId annotationEntityId, OffsetDateTime processedDate);
} }

View File

@ -15,9 +15,9 @@ public interface ImageRecategorizationRepository extends JpaRepository<ManualIma
List<ManualImageRecategorizationEntity> findByIdFileId(String fileId); List<ManualImageRecategorizationEntity> findByIdFileId(String fileId);
@Modifying @Modifying
@Query("update ManualImageRecategorizationEntity mir set mir.status = :annotationStatus, mir.processedDate = :processedDate " + @Query("update ManualImageRecategorizationEntity mir set mir.status = :annotationStatus " +
"where mir.id = :annotationEntityId") "where mir.id = :annotationEntityId")
void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus, OffsetDateTime processedDate); void updateStatus(AnnotationEntityId annotationEntityId, AnnotationStatus annotationStatus);
@Modifying @Modifying
@Query("update ManualImageRecategorizationEntity mir set mir.softDeletedTime = :softDeletedTime " + @Query("update ManualImageRecategorizationEntity mir set mir.softDeletedTime = :softDeletedTime " +
@ -29,4 +29,8 @@ public interface ImageRecategorizationRepository extends JpaRepository<ManualIma
@Query("select mir from ManualImageRecategorizationEntity mir where mir.id.fileId = :fileId and (:includeDeletions = true or mir.softDeletedTime is null)") @Query("select mir from ManualImageRecategorizationEntity mir where mir.id.fileId = :fileId and (:includeDeletions = true or mir.softDeletedTime is null)")
List<ManualImageRecategorizationEntity> findByFileIdIncludeDeletions(String fileId, boolean includeDeletions); List<ManualImageRecategorizationEntity> findByFileIdIncludeDeletions(String fileId, boolean includeDeletions);
@Modifying
@Query("update ManualImageRecategorizationEntity mir set mir.processedDate = :processedDate where mir.id = :annotationEntityId")
void markAsProcessed(AnnotationEntityId annotationEntityId, OffsetDateTime processedDate);
} }

View File

@ -13,8 +13,6 @@ import java.util.Optional;
public interface LegalBasisChangeRepository extends JpaRepository<ManualLegalBasisChangeEntity, AnnotationEntityId> { public interface LegalBasisChangeRepository extends JpaRepository<ManualLegalBasisChangeEntity, AnnotationEntityId> {
List<ManualLegalBasisChangeEntity> findByIdFileId(String fileId);
@Modifying @Modifying
@Query("update ManualLegalBasisChangeEntity mlbc set mlbc.status = :annotationStatus, mlbc.processedDate = :processedDate " + @Query("update ManualLegalBasisChangeEntity mlbc set mlbc.status = :annotationStatus, mlbc.processedDate = :processedDate " +
"where mlbc.id = :annotationEntityId") "where mlbc.id = :annotationEntityId")

View File

@ -20,14 +20,13 @@ public interface ManualRedactionRepository extends JpaRepository<ManualRedaction
void updateSoftDelete(AnnotationEntityId id, OffsetDateTime softDeleteTime); void updateSoftDelete(AnnotationEntityId id, OffsetDateTime softDeleteTime);
@Modifying @Modifying
@Query("update ManualRedactionEntryEntity m set m.processedDate = :processedDate, m.status = :annotationStatus" + @Query("update ManualRedactionEntryEntity m set m.status = :annotationStatus where m.id = :id")
" where m.id = :id") void updateStatus(AnnotationEntityId id, AnnotationStatus annotationStatus);
void updateStatus(AnnotationEntityId id, OffsetDateTime processedDate, AnnotationStatus annotationStatus);
@Modifying @Modifying
@Query("update ManualRedactionEntryEntity m set m.processedDate = :processedDate, m.status = :annotationStatus," + @Query("update ManualRedactionEntryEntity m set m.status = :annotationStatus," +
" m.addToDictionary = :isAddOrRemoveFromDictionary, m.addToDossierDictionary = :isAddOrRemoveFromDossierDictionary where m.id = :id") " m.addToDictionary = :isAddOrRemoveFromDictionary, m.addToDossierDictionary = :isAddOrRemoveFromDossierDictionary where m.id = :id")
void updateStatus(AnnotationEntityId id, OffsetDateTime processedDate, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary, void updateStatus(AnnotationEntityId id, AnnotationStatus annotationStatus, boolean isAddOrRemoveFromDictionary,
boolean isAddOrRemoveFromDossierDictionary); boolean isAddOrRemoveFromDossierDictionary);
@Query("select m from ManualRedactionEntryEntity m where m.id = :id and m.softDeletedTime is null") @Query("select m from ManualRedactionEntryEntity m where m.id = :id and m.softDeletedTime is null")

View File

@ -37,4 +37,7 @@ public interface RemoveRedactionRepository extends JpaRepository<IdRemovalEntity
@Query("select idr from IdRemovalEntity idr where idr.id.fileId = :fileId and (:includeDeletions = true or idr.softDeletedTime is null)") @Query("select idr from IdRemovalEntity idr where idr.id.fileId = :fileId and (:includeDeletions = true or idr.softDeletedTime is null)")
List<IdRemovalEntity> findByFileIdIncludeDeletions(String fileId, boolean includeDeletions); List<IdRemovalEntity> findByFileIdIncludeDeletions(String fileId, boolean includeDeletions);
@Modifying
@Query("update IdRemovalEntity idr set idr.processedDate = :processedDate where idr.id = :annotationEntityId")
void markAsProcessed(AnnotationEntityId annotationEntityId, OffsetDateTime processedDate);
} }

View File

@ -149,6 +149,13 @@ public class FileStatusController implements StatusResource {
} }
public void toggleAutomaticAnalysis(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID) String fileId, @RequestParam(EXCLUDED_STATUS_PARAM) boolean excludedFromAutomaticAnalysis) {
excludeFromAnalysis.toggleAutomaticAnalysis(dossierId, fileId, excludedFromAutomaticAnalysis);
}
public void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set<Integer> pages) { public void excludePages(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody Set<Integer> pages) {
FileEntity fileStatus = fileStatusService.getStatus(fileId); FileEntity fileStatus = fileStatusService.getStatus(fileId);

View File

@ -41,51 +41,35 @@ public class ReanalysisController implements ReanalysisResource {
@Override @Override
public void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, public void reanalyzeDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) { @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) {
var relevantFiles = getRelevantFiles(dossierId); var relevantFiles = getRelevantFiles(dossierId, triggeredByUser);
reanalyseFiles(dossierId, force, relevantFiles); reanalyseFiles(dossierId, force, relevantFiles);
} }
@Override
public void reanalyzeFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID_PARAM) String fileId,
@RequestBody Set<Integer> sectionsToReanalyse) {
log.info("Reanalyse: {} / {} with sections: {}", dossierId, fileId, sectionsToReanalyse);
if (sectionsToReanalyse != null) {
var relevantFiles = getRelevantFiles(dossierId, Sets.newHashSet(fileId));
relevantFiles.forEach(file -> {
fileStatusService.setStatusReprocess(dossierId, fileId, 10, sectionsToReanalyse);
});
} else {
this.reanalyzeFiles(dossierId, Sets.newHashSet(fileId), false);
}
}
@Override @Override
public void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds, public void reanalyzeFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) { @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) {
var relevantFiles = getRelevantFiles(dossierId, fileIds); var relevantFiles = getRelevantFiles(dossierId, fileIds, triggeredByUser);
reanalyseFiles(dossierId, force, relevantFiles); reanalyseFiles(dossierId, force, relevantFiles);
} }
public void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId) { public void ocrDossier(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser) {
var relevantFiles = getRelevantFiles(dossierId); var relevantFiles = getRelevantFiles(dossierId, triggeredByUser);
relevantFiles.stream().filter(fileStatus -> fileStatus.getLastOCRTime() == null).forEach(fileStatus -> fileStatusService.setStatusOcrProcessing(dossierId, fileStatus.getId())); relevantFiles.stream().filter(fileStatus -> fileStatus.getLastOCRTime() == null).forEach(fileStatus -> fileStatusService.setStatusOcrProcessing(dossierId, fileStatus.getId()));
} }
public void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestBody Set<String> fileIds) { public void ocrFiles(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser, @RequestBody Set<String> fileIds) {
var relevantFiles = getRelevantFiles(dossierId, fileIds); var relevantFiles = getRelevantFiles(dossierId, fileIds, triggeredByUser);
relevantFiles.stream().filter(fileStatus -> fileStatus.getLastOCRTime() == null).forEach(fileStatus -> fileStatusService.setStatusOcrProcessing(dossierId, fileStatus.getId())); relevantFiles.stream().filter(fileStatus -> fileStatus.getLastOCRTime() == null).forEach(fileStatus -> fileStatusService.setStatusOcrProcessing(dossierId, fileStatus.getId()));
} }
@ -96,7 +80,9 @@ public class ReanalysisController implements ReanalysisResource {
} }
public void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId, @RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) { public void ocrFile(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId,
@RequestParam(value = "triggeredByUser", required = false, defaultValue = FALSE) boolean triggeredByUser,
@RequestParam(value = "force", required = false, defaultValue = FALSE) boolean force) {
dossierPersistenceService.getAndValidateDossier(dossierId); dossierPersistenceService.getAndValidateDossier(dossierId);
@ -110,26 +96,27 @@ public class ReanalysisController implements ReanalysisResource {
if (dossierFile.getLastOCRTime() != null) { if (dossierFile.getLastOCRTime() != null) {
throw new ConflictException("File already has been OCR processed"); throw new ConflictException("File already has been OCR processed");
} }
ocrFiles(dossierId, Sets.newHashSet(fileId)); ocrFiles(dossierId,triggeredByUser, Sets.newHashSet(fileId));
} }
} }
private List<FileEntity> getRelevantFiles(String dossierId) { private List<FileEntity> getRelevantFiles(String dossierId, boolean triggeredByUser) {
var dossier = dossierPersistenceService.getAndValidateDossier(dossierId); var dossier = dossierPersistenceService.getAndValidateDossier(dossierId);
return fileStatusService.getDossierStatus(dossier.getId()) return fileStatusService.getDossierStatus(dossier.getId())
.stream() .stream()
.filter(fileStatus -> !fileStatus.getProcessingStatus().equals(ProcessingStatus.DELETED)) .filter(fileStatus -> !fileStatus.getProcessingStatus().equals(ProcessingStatus.DELETED))
.filter(fileStatus -> !fileStatus.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) .filter(fileStatus -> !fileStatus.getWorkflowStatus().equals(WorkflowStatus.APPROVED))
.filter(fileStatus -> triggeredByUser || !fileStatus.isExcludedFromAutomaticAnalysis())
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private List<FileEntity> getRelevantFiles(String dossierId, Collection<String> fileIds) { private List<FileEntity> getRelevantFiles(String dossierId, Collection<String> fileIds, boolean triggeredByUser) {
var relevantDossierFiles = getRelevantFiles(dossierId); var relevantDossierFiles = getRelevantFiles(dossierId, triggeredByUser);
var relevantFiles = new ArrayList<FileEntity>(); var relevantFiles = new ArrayList<FileEntity>();
for (var fileId : fileIds) { for (var fileId : fileIds) {
@ -140,10 +127,6 @@ public class ReanalysisController implements ReanalysisResource {
var dossierFile = dossierFileOptional.get(); var dossierFile = dossierFileOptional.get();
if (dossierFile.getProcessingStatus().equals(ProcessingStatus.DELETED) || dossierFile.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) {
throw new ConflictException("Cannot analyse a deleted/approved file");
}
relevantFiles.add(dossierFile); relevantFiles.add(dossierFile);
} }
@ -155,14 +138,14 @@ public class ReanalysisController implements ReanalysisResource {
if (force) { if (force) {
filesToReanalyse.forEach(file -> { filesToReanalyse.forEach(file -> {
fileStatusService.setStatusReprocess(dossierId, file.getId(), 2); fileStatusService.setStatusReprocess(dossierId, file.getId(), 2, true);
}); });
} else { } else {
var enhancedAndConvertedFiles = reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert( var enhancedAndConvertedFiles = reanalysisRequiredStatusService.enhanceFileStatusWithAnalysisRequirements(convert(
fileStatusService.getAllStatuses(), FileModel.class, new FileModelMapper())); fileStatusService.getAllStatuses(), FileModel.class, new FileModelMapper()));
enhancedAndConvertedFiles.forEach(file -> { enhancedAndConvertedFiles.forEach(file -> {
fileStatusService.setStatusReprocess(dossierId, file.getId(), 2); fileStatusService.setStatusReprocess(dossierId, file.getId(), 2, true);
}); });
} }

View File

@ -1,65 +0,0 @@
package com.iqser.red.service.peristence.v1.server.service;
import com.iqser.red.service.peristence.v1.server.client.SearchClient;
import com.iqser.red.service.peristence.v1.server.controller.ReanalysisController;
import com.iqser.red.service.search.v1.model.MatchedSection;
import com.iqser.red.service.search.v1.model.SearchRequest;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class DictionarySearchAndNotifyService {
private final ReanalysisController reanalysisClient;
private final SearchClient searchClient;
public void dictionaryEntriesUpdated(String dossierTemplateId, Collection<String> changedEntries) {
log.info("Detect Changes for dossierTemplateId: {} and entries: {}", dossierTemplateId, changedEntries);
Map<SearchKey, Set<Integer>> searchResultMap = new HashMap<>();
for (var entry : changedEntries) {
var searchResult = searchClient.getDossierStatus(SearchRequest.builder()
.dossierTemplateIds(Collections.singletonList(dossierTemplateId)).page(1).pageSize(10_000)
.returnSections(true)
.queryString(entry)
.build());
log.info("Got changes: {} for entry: {}", searchResult.getTotal(), entry);
searchResult.getMatchedDocuments().forEach(document -> {
var currentSections = searchResultMap.computeIfAbsent(SearchKey.builder().fileId(document.getFileId()).dossierId(document.getDossierId()).build(), (data) -> new HashSet<>());
currentSections.addAll(document.getMatchedSections().stream().map(MatchedSection::getSectionNumber).collect(Collectors.toList()));
});
}
log.info("Should reanalyse: {}", searchResultMap);
searchResultMap.forEach((searchKey, sectionNumbers) -> {
log.info("Reanalyse: {} / {} ", searchKey, sectionNumbers);
reanalysisClient.reanalyzeFile(searchKey.getDossierId(), searchKey.getFileId(), sectionNumbers);
});
}
@Data
@Builder
public static class SearchKey {
private String fileId;
private String dossierId;
}
}

View File

@ -9,10 +9,8 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor @RequiredArgsConstructor
public class ExcludeFromAnalysisService { public class ExcludeFromAnalysisService {
private final FileStatusService fileStatusService; private final FileStatusService fileStatusService;
public void toggleExclusion(String dossierId, String fileId, boolean excluded) { public void toggleExclusion(String dossierId, String fileId, boolean excluded) {
var status = fileStatusService.getStatus(fileId); var status = fileStatusService.getStatus(fileId);
@ -31,4 +29,16 @@ public class ExcludeFromAnalysisService {
} }
public void toggleAutomaticAnalysis(String dossierId, String fileId, boolean excludedFromAutomaticAnalysis) {
// toggle status
fileStatusService.toggleAutomaticAnalysis(fileId, excludedFromAutomaticAnalysis);
if (!excludedFromAutomaticAnalysis) {
// if file has been re-enabled - process it
fileStatusService.setStatusFullReprocess(dossierId, fileId, 2);
}
}
} }

View File

@ -12,6 +12,7 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.BinaryFileRequest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.BinaryFileRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;

View File

@ -31,7 +31,7 @@ public class FileStatusProcessingUpdateService {
case SURROUNDING_TEXT: case SURROUNDING_TEXT:
fileStatusService.setStatusProcessed(analyzeResult.getFileId()); fileStatusService.setStatusProcessed(analyzeResult.getFileId());
manualRedactionService.updateManualRedactions(fileId, analyzeResult.getManualRedactions()); manualRedactionService.updateSurroundingText(fileId, analyzeResult.getManualRedactions());
break; break;
case REANALYSE: case REANALYSE:
case FULL_ANALYSE: case FULL_ANALYSE:
@ -47,6 +47,7 @@ public class FileStatusProcessingUpdateService {
indexingService.addToIndexingQueue(IndexMessageType.INSERT, dossier.getDossierTemplateId(), dossierId, fileId, 2); indexingService.addToIndexingQueue(IndexMessageType.INSERT, dossier.getDossierTemplateId(), dossierId, fileId, 2);
} }
manualRedactionService.updateProcessedDate(fileId, analyzeResult.getManualRedactions());
analysisFlagsCalculationService.calculateFlags(dossierId, fileId); analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
} }

View File

@ -12,13 +12,13 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; import com.iqser.red.service.redaction.v1.model.AnalyzeRequest;
import com.iqser.red.service.redaction.v1.model.AnalyzeResult; import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
import com.iqser.red.service.redaction.v1.model.MessageType; import com.iqser.red.service.redaction.v1.model.MessageType;
import com.iqser.red.service.search.v1.model.IndexMessageType;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -128,12 +128,18 @@ public class FileStatusService {
@Transactional @Transactional
public void setStatusReprocess(String dossierId, String fileId, int priority) { public void setStatusReprocess(String dossierId, String fileId, int priority) {
setStatusReprocess(dossierId, fileId, priority, Sets.newHashSet()); setStatusReprocess(dossierId, fileId, priority, Sets.newHashSet(), false);
}
@Transactional
public void setStatusReprocess(String dossierId, String fileId, int priority, boolean triggeredManually) {
setStatusReprocess(dossierId, fileId, priority, Sets.newHashSet(), triggeredManually);
} }
@Transactional @Transactional
public void setStatusReprocess(String dossierId, String fileId, int priority, Set<Integer> sectionsToReanalyse) { public void setStatusReprocess(String dossierId, String fileId, int priority, Set<Integer> sectionsToReanalyse, boolean triggeredManually) {
log.info("Reprocessing file: {} from dossier {}", fileId, dossierId); log.info("Reprocessing file: {} from dossier {}", fileId, dossierId);
@ -144,6 +150,11 @@ public class FileStatusService {
return; return;
} }
if(fileStatus.isExcludedFromAutomaticAnalysis() && !triggeredManually){
log.debug("File {} is excluded from automatic analysis", fileStatus.getId());
return;
}
fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.REPROCESS); fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.REPROCESS);
addToAnalysisQueue(dossierId, fileId, priority, sectionsToReanalyse); addToAnalysisQueue(dossierId, fileId, priority, sectionsToReanalyse);
} }
@ -241,6 +252,12 @@ public class FileStatusService {
} }
public void toggleAutomaticAnalysis(String fileId, boolean excludedFromAutomaticAnalysis) {
fileStatusPersistenceService.toggleAutomaticAnalysis(fileId, excludedFromAutomaticAnalysis);
}
@Transactional @Transactional
protected void addToAnalysisQueue(String dossierId, String fileId, int priority, Set<Integer> sectionsToReanalyse) { protected void addToAnalysisQueue(String dossierId, String fileId, int priority, Set<Integer> sectionsToReanalyse) {

View File

@ -5,7 +5,7 @@ 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.peristence.v1.server.utils.ManualResizeRedactionMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.*; import com.iqser.red.service.persistence.service.v1.api.model.annotations.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@ -13,21 +13,22 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.*; import com.iqser.red.service.persistence.service.v1.api.model.annotations.*;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.redaction.v1.model.AnalyzeRequest; import com.iqser.red.service.redaction.v1.model.AnalyzeRequest;
import com.iqser.red.service.redaction.v1.model.MessageType; import com.iqser.red.service.redaction.v1.model.MessageType;
import com.iqser.red.service.redaction.v1.model.RedactionLog; import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry; import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
import feign.FeignException; import feign.FeignException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
@ -64,6 +65,7 @@ public class ManualRedactionService {
private final HashFunction hashFunction = Hashing.murmur3_128(); private final HashFunction hashFunction = Hashing.murmur3_128();
@Transactional
public ManualAddResponse addAddRedaction(String dossierId, String fileId, AddRedactionRequest addRedactionRequest) { public ManualAddResponse addAddRedaction(String dossierId, String fileId, AddRedactionRequest addRedactionRequest) {
dossierPersistenceService.getAndValidateDossier(dossierId); dossierPersistenceService.getAndValidateDossier(dossierId);
@ -83,6 +85,7 @@ public class ManualRedactionService {
String annotationId = hashFunction.hashString(fileId + addRedactionRequest, StandardCharsets.UTF_8).toString(); String annotationId = hashFunction.hashString(fileId + addRedactionRequest, StandardCharsets.UTF_8).toString();
OffsetDateTime now = OffsetDateTime.now(); OffsetDateTime now = OffsetDateTime.now();
addRedactionPersistenceService.insert(fileId, annotationId, addRedactionRequest); addRedactionPersistenceService.insert(fileId, annotationId, addRedactionRequest);
Long commentId = null; Long commentId = null;
@ -110,7 +113,6 @@ public class ManualRedactionService {
return ManualAddResponse.builder().annotationId(annotationId).commentId(commentId).build(); return ManualAddResponse.builder().annotationId(annotationId).commentId(commentId).build();
} }
public ManualAddResponse addRemoveRedaction(String dossierId, String fileId, public ManualAddResponse addRemoveRedaction(String dossierId, String fileId,
RemoveRedactionRequest removeRedactionRequest) { RemoveRedactionRequest removeRedactionRequest) {
@ -138,7 +140,7 @@ public class ManualRedactionService {
} }
if (removeRedactionRequest.getStatus().equals(AnnotationStatus.APPROVED)) { if (removeRedactionRequest.getStatus().equals(AnnotationStatus.APPROVED)) {
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} }
return ManualAddResponse.builder() return ManualAddResponse.builder()
@ -171,7 +173,7 @@ public class ManualRedactionService {
analysisFlagsCalculationService.calculateFlags(dossierId, fileId); analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
if (forceRedactionRequest.getStatus().equals(AnnotationStatus.APPROVED)) { if (forceRedactionRequest.getStatus().equals(AnnotationStatus.APPROVED)) {
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} }
return ManualAddResponse.builder() return ManualAddResponse.builder()
@ -228,7 +230,7 @@ public class ManualRedactionService {
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, now, true); fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, now, true);
} else { } else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, now); fileStatusPersistenceService.updateLastManualRedaction(fileId, now);
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} }
analysisFlagsCalculationService.calculateFlags(dossierId, fileId); analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
@ -240,17 +242,6 @@ public class ManualRedactionService {
} }
public CommentEntity addComment(String fileId, String annotationId, CommentRequest commentRequest) {
var createdComment = addComment(fileId, annotationId, commentRequest.getText(), commentRequest.getUser());
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
fileStatusPersistenceService.updateHasComments(fileId, true);
return createdComment;
}
public ManualAddResponse addResizeRedaction(String dossierId, String fileId, public ManualAddResponse addResizeRedaction(String dossierId, String fileId,
ResizeRedactionRequest resizeRedactionRequest) { ResizeRedactionRequest resizeRedactionRequest) {
@ -283,6 +274,16 @@ public class ManualRedactionService {
.build(); .build();
} }
public CommentEntity addComment(String fileId, String annotationId, CommentRequest commentRequest) {
var createdComment = addComment(fileId, annotationId, commentRequest.getText(), commentRequest.getUser());
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
fileStatusPersistenceService.updateHasComments(fileId, true);
return createdComment;
}
public ManualRedactionEntryEntity getAddRedaction(String fileId, String annotationId) { public ManualRedactionEntryEntity getAddRedaction(String fileId, String annotationId) {
@ -408,7 +409,7 @@ public class ManualRedactionService {
fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions); fileStatusPersistenceService.setUpdateLastManualRedactionAndHasSuggestions(fileId, OffsetDateTime.now(), hasSuggestions);
} else { } else {
fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now()); fileStatusPersistenceService.updateLastManualRedaction(fileId, OffsetDateTime.now());
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} }
analysisFlagsCalculationService.calculateFlags(dossierId, fileId); analysisFlagsCalculationService.calculateFlags(dossierId, fileId);
} }
@ -456,7 +457,7 @@ public class ManualRedactionService {
.filter(entry -> entry.getId().equals(idRemoval.getId().getAnnotationId())) .filter(entry -> entry.getId().equals(idRemoval.getId().getAnnotationId()))
.findFirst(); .findFirst();
if (!redactionLogEntryOptional.isPresent()) { if (redactionLogEntryOptional.isEmpty()) {
throw new NotFoundException("Annotation does not exist in redaction log."); throw new NotFoundException("Annotation does not exist in redaction log.");
} }
@ -482,16 +483,6 @@ public class ManualRedactionService {
} }
private String buildTypeId(RedactionLogEntry redactionLogEntry, DossierEntity dossier) {
if (redactionLogEntry.isDossierDictionaryEntry()) {
return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId(), dossier.getId());
} else {
return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId());
}
}
public void updateForceRedactionStatus(String dossierId, String fileId, String annotationId, public void updateForceRedactionStatus(String dossierId, String fileId, String annotationId,
AnnotationStatus annotationStatus) { AnnotationStatus annotationStatus) {
@ -503,6 +494,7 @@ public class ManualRedactionService {
} }
@Transactional
public void updateLegalBasisChangeStatus(String dossierId, String fileId, String annotationId, public void updateLegalBasisChangeStatus(String dossierId, String fileId, String annotationId,
AnnotationStatus annotationStatus) { AnnotationStatus annotationStatus) {
@ -523,10 +515,10 @@ public class ManualRedactionService {
// if it was previously approved, revert the delete // if it was previously approved, revert the delete
if (imageRecategorization.getStatus() == AnnotationStatus.APPROVED) { if (imageRecategorization.getStatus() == AnnotationStatus.APPROVED) {
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} }
} else if (annotationStatus.equals(AnnotationStatus.APPROVED)) { } else if (annotationStatus.equals(AnnotationStatus.APPROVED)) {
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} }
dossierPersistenceService.getAndValidateDossier(dossierId); dossierPersistenceService.getAndValidateDossier(dossierId);
@ -581,6 +573,40 @@ public class ManualRedactionService {
} }
@Transactional
public void updateSurroundingText(String fileId, ManualRedactions manualRedactions) {
// These are marked as processed once surrounding text is computed ( TBD if this is correct ? )
manualRedactions.getEntriesToAdd().forEach(e -> addRedactionPersistenceService.updateSurroundingText(new AnnotationEntityId(e.getAnnotationId(), fileId), e.getTextBefore(), e.getTextAfter()));
manualRedactions.getResizeRedactions().forEach(e -> resizeRedactionPersistenceService.updateSurroundingText(new AnnotationEntityId(e.getAnnotationId(), fileId), e.getTextBefore(), e.getTextAfter()));
}
@Transactional
public void updateProcessedDate(String fileId, ManualRedactions manualRedactions) {
// These are marked as processed once analysis completes, not when they are set as approved
manualRedactions.getIdsToRemove().forEach(removeRedactionPersistenceService::markAsProcessed);
manualRedactions.getForceRedactions().forEach(forceRedactionPersistenceService::markAsProcessed);
manualRedactions.getImageRecategorization().forEach(recategorizationPersistenceService::markAsProcessed);
}
private void reprocess(String dossierId, String fileId) {
fileStatusService.setStatusReprocess(dossierId, fileId, 2);
}
private String buildTypeId(RedactionLogEntry redactionLogEntry, DossierEntity dossier) {
if (redactionLogEntry.isDossierDictionaryEntry()) {
return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId(), dossier.getId());
} else {
return toTypeId(redactionLogEntry.getType(), dossier.getDossierTemplateId());
}
}
private void handleAddToDictionary(String fileId, String annotationId, String typeId, String value, private void handleAddToDictionary(String fileId, String annotationId, String typeId, String value,
AnnotationStatus status, boolean addToDictionary, boolean addToDossierDictionary, AnnotationStatus status, boolean addToDictionary, boolean addToDossierDictionary,
boolean revert, String dossierId) { boolean revert, String dossierId) {
@ -615,7 +641,7 @@ public class ManualRedactionService {
.filter(entry -> entry.getId().equals(annotationId)) .filter(entry -> entry.getId().equals(annotationId))
.findFirst(); .findFirst();
if (!redactionLogEntryOptional.isPresent()) { if (redactionLogEntryOptional.isEmpty()) {
throw new NotFoundException("Annotation does not exist in redaction log."); throw new NotFoundException("Annotation does not exist in redaction log.");
} }
@ -638,7 +664,7 @@ public class ManualRedactionService {
log.debug("Adding entries to {} for {} / {}", typeId, dossierId, fileId); log.debug("Adding entries to {} for {} / {}", typeId, dossierId, fileId);
dictionaryController.addEntries(typeId, List.of(value), false, false); dictionaryController.addEntries(typeId, List.of(value), false, false);
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} catch (Exception e) { } catch (Exception e) {
throw new BadRequestException(e.getMessage()); throw new BadRequestException(e.getMessage());
} }
@ -650,7 +676,7 @@ public class ManualRedactionService {
try { try {
log.debug("Deleting entries to {} for {} / {}", typeId, dossierId, fileId); log.debug("Deleting entries to {} for {} / {}", typeId, dossierId, fileId);
dictionaryController.deleteEntries(typeId, List.of(value)); dictionaryController.deleteEntries(typeId, List.of(value));
fileStatusService.setStatusReprocess(dossierId, fileId, 2); reprocess(dossierId, fileId);
} catch (FeignException e) { } catch (FeignException e) {
throw new BadRequestException(e.getMessage()); throw new BadRequestException(e.getMessage());
} }
@ -711,18 +737,6 @@ public class ManualRedactionService {
} }
public void updateManualRedactions(String fileId, ManualRedactions manualRedactions) {
manualRedactions.getEntriesToAdd().forEach(e -> {
addRedactionPersistenceService.updateSurroundingText(new AnnotationEntityId(e.getAnnotationId(), fileId), e.getTextBefore(), e.getTextAfter());
});
manualRedactions.getResizeRedactions().forEach(e -> {
resizeRedactionPersistenceService.updateSurroundingText(new AnnotationEntityId(e.getAnnotationId(), fileId), e.getTextBefore(), e.getTextAfter());
});
}
private void addManualRedactionToAnalysisQueue(String dossierId, String fileId, ManualRedactions manualRedactions) { private void addManualRedactionToAnalysisQueue(String dossierId, String fileId, ManualRedactions manualRedactions) {
fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.SURROUNDING_TEXT_PROCESSING); fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.SURROUNDING_TEXT_PROCESSING);

View File

@ -67,7 +67,7 @@ public class AutomaticAnalysisScheduler {
if (next.isFullAnalysisRequired()) { if (next.isFullAnalysisRequired()) {
log.info("Queued file: {} for automatic full analysis! ", next.getFilename()); log.info("Queued file: {} for automatic full analysis! ", next.getFilename());
fileStatusService.setStatusFullReprocess(next.getDossierId(), next.getId(), 1); fileStatusService.setStatusFullReprocess(next.getDossierId(), next.getId(), 1);
} else if(next.isReanalysisRequired()){ } else if (next.isReanalysisRequired()) {
log.info("Queued file: {} for automatic reanalysis! ", next.getFilename()); log.info("Queued file: {} for automatic reanalysis! ", next.getFilename());
fileStatusService.setStatusReprocess(next.getDossierId(), next.getId(), 1); fileStatusService.setStatusReprocess(next.getDossierId(), next.getId(), 1);
} }
@ -86,6 +86,7 @@ public class AutomaticAnalysisScheduler {
.stream() .stream()
.filter(f -> !f.getProcessingStatus().equals(ProcessingStatus.DELETED)) .filter(f -> !f.getProcessingStatus().equals(ProcessingStatus.DELETED))
.filter(f -> !f.getWorkflowStatus().equals(WorkflowStatus.APPROVED)) .filter(f -> !f.getWorkflowStatus().equals(WorkflowStatus.APPROVED))
.filter(f -> !f.isExcludedFromAutomaticAnalysis())
.filter(f -> !isProcessing(f)) .filter(f -> !isProcessing(f))
.filter(f -> f.getDossier().getSoftDeletedTime() == null && f.getDossier().getHardDeletedTime() == null && f.getDossier().getArchivedTime() == null) .filter(f -> f.getDossier().getSoftDeletedTime() == null && f.getDossier().getHardDeletedTime() == null && f.getDossier().getArchivedTime() == null)
.collect(Collectors.toList()), FileModel.class, new FileModelMapper())) .collect(Collectors.toList()), FileModel.class, new FileModelMapper()))

View File

@ -0,0 +1,24 @@
databaseChangeLog:
- changeSet:
id: add-excluded-from-automatic-analysis-column
author: timo
changes:
- addColumn:
columns:
- column:
name: excluded_from_automatic_analysis
type: BOOLEAN
defaultValue: false
tableName: file
- changeSet:
id: updated-excluded-from-automatic-analysis-column
author: timo
changes:
- update:
columns:
- column:
name: excluded_from_automatic_analysis
value: true
schemaName: public
tableName: file
where: workflow_status = 'APPROVED'

View File

@ -9,3 +9,5 @@ databaseChangeLog:
file: db/changelog/4-archived-dossier.changelog.yaml file: db/changelog/4-archived-dossier.changelog.yaml
- include: - include:
file: db/changelog/5-imported-annotation.changelog.yaml file: db/changelog/5-imported-annotation.changelog.yaml
- include:
file: db/changelog/6-excluded-from-automatic-analysis-file-column.changelog.yaml

View File

@ -1,20 +1,20 @@
package com.iqser.red.service.peristence.v1.server.integration.tests; package com.iqser.red.service.peristence.v1.server.integration.tests;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
import com.iqser.red.service.peristence.v1.server.integration.client.FileProcessingClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileProcessingClient;
import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.ManualRedactions;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
import com.iqser.red.service.redaction.v1.model.AnalyzeResult; import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
import com.iqser.red.service.redaction.v1.model.MessageType; import com.iqser.red.service.redaction.v1.model.MessageType;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
public class FileProcessingTest extends AbstractPersistenceServerServiceTest { public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
@ -48,6 +48,7 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR);
fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder() fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder()
.manualRedactions(new ManualRedactions())
.messageType(MessageType.FULL_ANALYSE) .messageType(MessageType.FULL_ANALYSE)
.analysisVersion(100) .analysisVersion(100)
.fileId(file.getId()) .fileId(file.getId())
@ -97,6 +98,7 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.ERROR);
fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder() fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder()
.manualRedactions(new ManualRedactions())
.messageType(MessageType.FULL_ANALYSE) .messageType(MessageType.FULL_ANALYSE)
.analysisVersion(100) .analysisVersion(100)
.fileId(file.getId()) .fileId(file.getId())
@ -132,12 +134,13 @@ public class FileProcessingTest extends AbstractPersistenceServerServiceTest {
@Test @Test
public void testFileReanlyseAfterToggleExclusion(){ public void testFileReanlyseAfterToggleExclusion() {
var dossier = dossierTesterAndProvider.provideTestDossier(); var dossier = dossierTesterAndProvider.provideTestDossier();
var file = fileTesterAndProvider.testAndProvideFile(dossier); var file = fileTesterAndProvider.testAndProvideFile(dossier);
fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder() fileProcessingClient.analysisSuccessful(dossier.getId(), file.getId(), AnalyzeResult.builder()
.manualRedactions(new ManualRedactions())
.messageType(MessageType.FULL_ANALYSE) .messageType(MessageType.FULL_ANALYSE)
.analysisVersion(100) .analysisVersion(100)
.fileId(file.getId()) .fileId(file.getId())

View File

@ -291,8 +291,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.build()); .build());
var loadedForceRedaction2 = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction2.getAnnotationId()); var loadedForceRedaction2 = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction2.getAnnotationId());
assertThat(loadedForceRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED); assertThat(loadedForceRedaction2.getStatus()).isEqualTo(AnnotationStatus.APPROVED);
assertThat(loadedForceRedaction2.getProcessedDate()).isNotNull(); assertThat(loadedForceRedaction2.getProcessedDate()).isNull();
manualRedactionClient.updateForceRedactionStatus(dossier.getId(), file.getId(), forceRedaction2.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.REQUESTED)); manualRedactionClient.updateForceRedactionStatus(dossier.getId(), file.getId(), forceRedaction2.getAnnotationId(), JSONPrimitive.of(AnnotationStatus.REQUESTED));
loadedForceRedaction2 = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction2.getAnnotationId()); loadedForceRedaction2 = manualRedactionClient.getForceRedaction(file.getId(), forceRedaction2.getAnnotationId());

View File

@ -42,33 +42,28 @@ public class ReanalysisTest extends AbstractPersistenceServerServiceTest {
var file = fileTesterAndProvider.testAndProvideFile(dossier); var file = fileTesterAndProvider.testAndProvideFile(dossier);
reanalysisClient.ocrDossier(dossier.getId()); reanalysisClient.ocrDossier(dossier.getId(),true);
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING);
resetProcessingStatus(file); resetProcessingStatus(file);
reanalysisClient.ocrFile(dossier.getId(), file.getId(), true); reanalysisClient.ocrFile(dossier.getId(), file.getId(),true, true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING);
resetProcessingStatus(file); resetProcessingStatus(file);
reanalysisClient.ocrFiles(dossier.getId(), Set.of(file.getId())); reanalysisClient.ocrFiles(dossier.getId(),true, Set.of(file.getId()));
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.OCR_PROCESSING);
resetProcessingStatus(file); resetProcessingStatus(file);
reanalysisClient.reanalyzeFiles(dossier.getId(), Set.of(file.getId()), true); reanalysisClient.reanalyzeFiles(dossier.getId(), Set.of(file.getId()), true,true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
resetProcessingStatus(file); resetProcessingStatus(file);
reanalysisClient.reanalyzeFile(dossier.getId(), file.getId(), Sets.newHashSet()); reanalysisClient.reanalyzeDossier(dossier.getId(), true,true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
resetProcessingStatus(file);
reanalysisClient.reanalyzeDossier(dossier.getId(), true);
loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId()); loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING); assertThat(loadedFile.getProcessingStatus()).isEqualTo(ProcessingStatus.PROCESSING);
resetProcessingStatus(file); resetProcessingStatus(file);