RED-10264: always include unprocessed during manual change insertion to avoid...

This commit is contained in:
Kilian Schüttler 2024-11-06 11:13:38 +01:00
parent bbf7c37b5f
commit b1b36d1b71
34 changed files with 340 additions and 218 deletions

View File

@ -188,8 +188,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')")
public ManualRedactionResponse removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, public ManualRedactionResponse removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestBody Set<RemoveRedactionRequestModel> removeRedactionRequests, @RequestBody Set<RemoveRedactionRequestModel> removeRedactionRequests) {
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) {
var dossier = dossierManagementService.getDossierById(dossierId, false, false); var dossier = dossierManagementService.getDossierById(dossierId, false, false);
accessControlService.checkAccessPermissionsToDossier(dossierId); accessControlService.checkAccessPermissionsToDossier(dossierId);
@ -205,7 +204,7 @@ public class ManualRedactionController implements ManualRedactionResource {
fileId, fileId,
removeRedactionRequests, removeRedactionRequests,
dossier.getDossierTemplateId(), dossier.getDossierTemplateId(),
includeUnprocessed); true);
responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId()) .userId(KeycloakSecurity.getUserId())
@ -268,8 +267,7 @@ public class ManualRedactionController implements ManualRedactionResource {
@PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')")
public ManualRedactionResponse recategorizeBulk(@PathVariable(DOSSIER_ID) String dossierId, public ManualRedactionResponse recategorizeBulk(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestBody Set<RecategorizationRequestModel> recategorizationRequests, @RequestBody Set<RecategorizationRequestModel> recategorizationRequests) {
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) {
var dossier = dossierManagementService.getDossierById(dossierId, false, false); var dossier = dossierManagementService.getDossierById(dossierId, false, false);
accessControlService.checkAccessPermissionsToDossier(dossierId); accessControlService.checkAccessPermissionsToDossier(dossierId);
@ -280,7 +278,7 @@ public class ManualRedactionController implements ManualRedactionResource {
fileId, fileId,
dossier, dossier,
recategorizationRequests, recategorizationRequests,
includeUnprocessed); true);
responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId()) .userId(KeycloakSecurity.getUserId())
@ -297,14 +295,13 @@ public class ManualRedactionController implements ManualRedactionResource {
@PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')") @PreAuthorize("hasAuthority('" + DO_MANUAL_REDACTION + "')")
public ManualRedactionResponse resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, public ManualRedactionResponse resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestBody Set<ResizeRedactionRequestModel> resizeRedactionRequests, @RequestBody Set<ResizeRedactionRequestModel> resizeRedactionRequests) {
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed) {
accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId);
accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyFileIsNotApproved(dossierId, fileId);
accessControlService.verifyUserIsMemberOrApprover(dossierId); accessControlService.verifyUserIsMemberOrApprover(dossierId);
List<ManualAddResponse> responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequests, includeUnprocessed); List<ManualAddResponse> responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, resizeRedactionRequests, true);
responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId()) .userId(KeycloakSecurity.getUserId())

View File

@ -20,6 +20,7 @@ import org.springframework.web.multipart.MultipartFile;
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.dataexchange.service.FileExchangeImportService; import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.FileExchangeImportService;
import com.iqser.red.service.persistence.management.v1.processor.migration.MigrationController;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusMapper; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusMapper;
import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService;

View File

@ -95,35 +95,36 @@ public interface DossierTemplateResource {
@ResponseStatus(value = HttpStatus.NO_CONTENT) @ResponseStatus(value = HttpStatus.NO_CONTENT)
@PostMapping(value = DOSSIER_TEMPLATE_PATH + IMPORT_PATH, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = DOSSIER_TEMPLATE_PATH + IMPORT_PATH, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Receives an archive to import", description = "None") @Operation(summary = "Receives an archive to import", description = """
@ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Archive have successfully imported"), @ApiResponse(responseCode = "400", description = "Import process stuck in one of the steps:" Import process stuck in one of the steps:"
+ "0 - Reading the archive content\n" 0 - Reading the archive content
+ "\n"
+ "1 - store information about the dossier template\n" 1 - store information about the dossier template
+ "\n"
+ "2 - store the colors\n" 2 - store the colors
+ "\n"
+ "3 - store the watermarks\n" 3 - store the watermarks
+ "\n"
+ "4 - store the dossier status\n" 4 - store the dossier status
+ "\n"
+ "5 - store the dossier attributes\n" 5 - store the dossier attributes
+ "\n"
+ "6 - store the file attributes\n" 6 - store the file attributes
+ "\n"
+ "7 - store the report templates\n" 7 - store the report templates
+ "\n"
+ "8 - store the legal basis\n" 8 - store the legal basis
+ "\n"
+ "9 - store the file attribute configuration\n" 9 - store the file attribute configuration
+ "\n"
+ "10 - store the component definitions\n" 10 - store the component definitions
+ "\n"
+ "11 - store the component mappings\n" 11 - store the component mappings
+ "\n"
+ "12 - store the types and entities\n" 12 - store the types and entities
+ "\n"
+ "13 - store the rules and component rules"), @ApiResponse(responseCode = "404", description = "The dossier template to update does not exist")}) 13 - store the rules and component rules""")
@ApiResponses(value = {@ApiResponse(responseCode = "204", description = "Archive have successfully imported"), @ApiResponse(responseCode = "400"), @ApiResponse(responseCode = "404", description = "The dossier template to update does not exist")})
DossierTemplateModel importDossierTemplate(@Schema(type = "string", format = "binary", name = "file") @RequestPart(name = "file") MultipartFile file, DossierTemplateModel importDossierTemplate(@Schema(type = "string", format = "binary", name = "file") @RequestPart(name = "file") MultipartFile file,
@RequestParam(value = DOSSIER_TEMPLATE_ID, required = false) String dossierTemplateId, @RequestParam(value = DOSSIER_TEMPLATE_ID, required = false) String dossierTemplateId,
@RequestParam(value = "updateExistingDossierTemplate", required = false, defaultValue = "false") boolean updateExistingDossierTemplate); @RequestParam(value = "updateExistingDossierTemplate", required = false, defaultValue = "false") boolean updateExistingDossierTemplate);

View File

@ -1,6 +1,5 @@
package com.iqser.red.service.persistence.service.v1.api.external.resource; package com.iqser.red.service.persistence.service.v1.api.external.resource;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -15,7 +14,6 @@ import org.springframework.web.bind.annotation.ResponseStatus;
import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationComments; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationComments;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactionResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactionResponse;
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions;
import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequestModel;
@ -105,8 +103,7 @@ public interface ManualRedactionResource {
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")})
ManualRedactionResponse removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, ManualRedactionResponse removeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestBody Set<RemoveRedactionRequestModel> removeRedactionRequests, @RequestBody Set<RemoveRedactionRequestModel> removeRedactionRequests);
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);
@ResponseStatus(value = HttpStatus.OK) @ResponseStatus(value = HttpStatus.OK)
@ -143,8 +140,7 @@ public interface ManualRedactionResource {
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")})
ManualRedactionResponse recategorizeBulk(@PathVariable(DOSSIER_ID) String dossierId, ManualRedactionResponse recategorizeBulk(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestBody Set<RecategorizationRequestModel> recategorizationRequests, @RequestBody Set<RecategorizationRequestModel> recategorizationRequests);
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);
@ResponseStatus(value = HttpStatus.OK) @ResponseStatus(value = HttpStatus.OK)
@ -156,8 +152,7 @@ public interface ManualRedactionResource {
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Dossier or file not found"), @ApiResponse(responseCode = "403", description = "Forbidden")})
ManualRedactionResponse resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId, ManualRedactionResponse resizeRedactionBulk(@PathVariable(DOSSIER_ID) String dossierId,
@PathVariable(FILE_ID) String fileId, @PathVariable(FILE_ID) String fileId,
@RequestBody Set<ResizeRedactionRequestModel> resizeRedactionRequests, @RequestBody Set<ResizeRedactionRequestModel> resizeRedactionRequests);
@RequestParam(value = "includeUnprocessed", required = false, defaultValue = FALSE) boolean includeUnprocessed);
@ResponseStatus(value = HttpStatus.OK) @ResponseStatus(value = HttpStatus.OK)

View File

@ -11,13 +11,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)

View File

@ -10,7 +10,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)

View File

@ -8,7 +8,6 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class ManualLegalBasisChangeExportModel { public class ManualLegalBasisChangeExportModel {

View File

@ -12,7 +12,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)

View File

@ -10,7 +10,6 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class ManualRemoveExportModel { public class ManualRemoveExportModel {

View File

@ -14,7 +14,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)

View File

@ -12,7 +12,6 @@ import lombok.NoArgsConstructor;
@Embeddable @Embeddable
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class AnnotationEntityId implements Serializable { public class AnnotationEntityId implements Serializable {

View File

@ -17,14 +17,12 @@ import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Entity @Entity
@Table(name = "id_removal") @Table(name = "id_removal")
@Data @Data
@Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class IdRemovalEntity implements IBaseAnnotation { public class IdRemovalEntity implements IBaseAnnotation {

View File

@ -15,7 +15,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder //@Builder // disabled, cause the ManualChangesExportMapper will not map addToDictionary and addToAllDossiers at all
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity

View File

@ -10,12 +10,10 @@ import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity

View File

@ -17,12 +17,10 @@ import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity

View File

@ -22,13 +22,11 @@ import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Entity @Entity
@Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Table(name = "manual_redaction") @Table(name = "manual_redaction")

View File

@ -19,12 +19,10 @@ import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity

View File

@ -73,65 +73,76 @@ public interface ManualChangesExportMapper {
@AfterMapping @AfterMapping
default void setFileStatusAndId(ManualLegalBasisChangeExportModel model, default void setFileStatusAndId(ManualLegalBasisChangeExportModel model,
@MappingTarget ManualLegalBasisChangeEntity.ManualLegalBasisChangeEntityBuilder entity, @MappingTarget ManualLegalBasisChangeEntity entity,
@Context FileEntity file, @Context String userId) { @Context FileEntity file,
@Context String userId) {
AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId()); AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId());
entity.id(annotationEntityId); entity.setId(annotationEntityId);
entity.fileStatus(file); entity.setFileStatus(file);
entity.user(userId); entity.setUser(userId);
} }
@AfterMapping @AfterMapping
default void setFileStatusAndId(ManualRecategorizationExportModel model, default void setFileStatusAndId(ManualRecategorizationExportModel model,
@MappingTarget ManualRecategorizationEntity.ManualRecategorizationEntityBuilder entity, @MappingTarget ManualRecategorizationEntity entity,
@Context FileEntity file, @Context String userId) { @Context FileEntity file,
@Context String userId) {
AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId()); AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId());
entity.id(annotationEntityId); entity.setId(annotationEntityId);
entity.fileStatus(file); entity.setFileStatus(file);
entity.user(userId); entity.setUser(userId);
} }
@AfterMapping @AfterMapping
default void setFileStatusAndId(ManualAddExportModel model, @MappingTarget ManualRedactionEntryEntity.ManualRedactionEntryEntityBuilder entity, @Context FileEntity file, @Context String userId) { default void setFileStatusAndId(ManualAddExportModel model,
@MappingTarget ManualRedactionEntryEntity entity,
@Context FileEntity file,
@Context String userId) {
AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId()); AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId());
entity.id(annotationEntityId); entity.setId(annotationEntityId);
entity.fileStatus(file); entity.setFileStatus(file);
entity.user(userId); entity.setUser(userId);
} }
@AfterMapping @AfterMapping
default void setFileStatusAndId(ManualResizeExportModel model, @MappingTarget ManualResizeRedactionEntity.ManualResizeRedactionEntityBuilder entity, @Context FileEntity file, @Context String userId) { default void setFileStatusAndId(ManualResizeExportModel model,
@MappingTarget ManualResizeRedactionEntity entity,
@Context FileEntity file,
@Context String userId) {
AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId()); AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId());
entity.id(annotationEntityId); entity.setId(annotationEntityId);
entity.fileStatus(file); entity.setFileStatus(file);
entity.user(userId); entity.setUser(userId);
} }
@AfterMapping @AfterMapping
default void setFileStatusAndId(ManualForceExportModel model, @MappingTarget ManualForceRedactionEntity.ManualForceRedactionEntityBuilder entity, @Context FileEntity file, @Context String userId) { default void setFileStatusAndId(ManualForceExportModel model,
@MappingTarget ManualForceRedactionEntity entity,
@Context FileEntity file,
@Context String userId) {
AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId()); AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId());
entity.id(annotationEntityId); entity.setId(annotationEntityId);
entity.fileStatus(file); entity.setFileStatus(file);
entity.user(userId); entity.setUser(userId);
} }
@AfterMapping @AfterMapping
default void setFileStatusAndId(ManualRemoveExportModel model, @MappingTarget IdRemovalEntity.IdRemovalEntityBuilder entity, @Context FileEntity file, @Context String userId) { default void setFileStatusAndId(ManualRemoveExportModel model, @MappingTarget IdRemovalEntity entity, @Context FileEntity file, @Context String userId) {
AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId()); AnnotationEntityId annotationEntityId = new AnnotationEntityId(model.getAnnotationId(), file.getId());
entity.id(annotationEntityId); entity.setId(annotationEntityId);
entity.fileStatus(file); entity.setFileStatus(file);
entity.user(userId); entity.setUser(userId);
} }
} }

View File

@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.migration;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -12,8 +13,6 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.annotati
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.model.ManualChangesQueryOptions; import com.iqser.red.service.persistence.management.v1.processor.model.ManualChangesQueryOptions;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -39,26 +38,27 @@ public class SaasMigrationManualChangesUpdateService {
if (unprocessedManualAdd.isAddToDictionary() || unprocessedManualAdd.isAddToAllDossiers()) { if (unprocessedManualAdd.isAddToDictionary() || unprocessedManualAdd.isAddToAllDossiers()) {
// copy pending dict change to a new one with a different id. Can't reuse the same one, as it's the primary key of the table. // copy pending dict change to a new one with a different id. Can't reuse the same one, as it's the primary key of the table.
// It has no functionality, its only there, such that the UI can show a pending change. // It has no functionality, its only there, such that the UI can show a pending change.
ManualRedactionEntryEntity pendingDictAdd = ManualRedactionEntryEntity.builder() ManualRedactionEntryEntity pendingDictAdd = new ManualRedactionEntryEntity(buildSecondaryId(unprocessedManualAdd.getId(), fileId),
.id(buildSecondaryId(unprocessedManualAdd.getId(), fileId)) unprocessedManualAdd.getUser(),
.user(unprocessedManualAdd.getUser()) unprocessedManualAdd.getTypeId(),
.typeId(unprocessedManualAdd.getTypeId()) unprocessedManualAdd.getValue(),
.value(unprocessedManualAdd.getValue()) unprocessedManualAdd.getReason(),
.reason(unprocessedManualAdd.getReason()) unprocessedManualAdd.getLegalBasis(),
.legalBasis(unprocessedManualAdd.getLegalBasis()) unprocessedManualAdd.getSection(),
.section(unprocessedManualAdd.getSection()) unprocessedManualAdd.isRectangle(),
.rectangle(unprocessedManualAdd.isRectangle()) unprocessedManualAdd.isAddToDictionary(),
.addToDictionary(unprocessedManualAdd.isAddToDictionary()) unprocessedManualAdd.isAddToAllDossiers(),
.addToAllDossiers(unprocessedManualAdd.isAddToAllDossiers()) unprocessedManualAdd.isAddToDossierDictionary(),
.dictionaryEntryType(DictionaryEntryType.ENTRY) DictionaryEntryType.ENTRY,
.requestDate(unprocessedManualAdd.getRequestDate()) unprocessedManualAdd.getRequestDate(),
.positions(new ArrayList<>(unprocessedManualAdd.getPositions())) // copy to new List null,
.fileStatus(unprocessedManualAdd.getFileStatus()) null,
.textBefore(unprocessedManualAdd.getTextBefore()) new ArrayList<>(unprocessedManualAdd.getPositions()),
.textAfter(unprocessedManualAdd.getTextAfter()) unprocessedManualAdd.getFileStatus(),
.sourceId(unprocessedManualAdd.getSourceId()) unprocessedManualAdd.getTextBefore(),
.typeIdsOfModifiedDictionaries(unprocessedManualAdd.getTypeIdsOfModifiedDictionaries()) unprocessedManualAdd.getTextAfter(),
.build(); unprocessedManualAdd.getSourceId(),
new HashSet<>(unprocessedManualAdd.getTypeIdsOfModifiedDictionaries()));
addRedactionPersistenceService.update(pendingDictAdd); addRedactionPersistenceService.update(pendingDictAdd);

View File

@ -380,7 +380,7 @@ public class SaasMigrationService implements TenantSyncService {
private AnnotationEntityId buildAnnotationId(String fileId, String annotationId) { private AnnotationEntityId buildAnnotationId(String fileId, String annotationId) {
return AnnotationEntityId.builder().fileId(fileId).annotationId(annotationId).build(); return new AnnotationEntityId(annotationId, fileId);
} }

View File

@ -0,0 +1,90 @@
package com.iqser.red.service.persistence.management.v1.processor.migration.migrations;
import java.time.OffsetDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.migration.Migration;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualRedactionType;
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogEntryDocumentRepository;
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.projections.EntryWithManualChangesProjection;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class ManualChangesReorderingMigration23 extends Migration {
private static final String NAME = "Migration for reordering mixed up manual changes";
private static final long VERSION = 28;
private final EntityLogEntryDocumentRepository entityLogEntryDocumentRepository;
private final AddRedactionPersistenceService addRedactionPersistenceService;
private final FileStatusService fileStatusService;
public ManualChangesReorderingMigration23(EntityLogEntryDocumentRepository entityLogEntryDocumentRepository,
AddRedactionPersistenceService addRedactionPersistenceService,
FileStatusService fileStatusService) {
super(NAME, VERSION);
this.entityLogEntryDocumentRepository = entityLogEntryDocumentRepository;
this.addRedactionPersistenceService = addRedactionPersistenceService;
this.fileStatusService = fileStatusService;
}
@Override
protected void migrate() {
log.info("Searching for entityLogEntries of type ENTITY with state APPLIED and no legalbasis");
List<EntryWithManualChangesProjection> entriesWithManualChanges = entityLogEntryDocumentRepository.findAppliedEntitiesWhereLegalBasisEmpty();
log.info("Found {} applied entries with no legal basis", entriesWithManualChanges.size());
int numberOfChanged = 0;
Set<FileAndDossier> affectedFiles = new HashSet<>();
for (EntryWithManualChangesProjection entry : entriesWithManualChanges) {
if (entry.getManualChanges().isEmpty()) {
continue;
}
Optional<ManualChange> optionalAdd = entry.getManualChanges()
.stream()
.filter(mc -> mc.getManualRedactionType().equals(ManualRedactionType.ADD))
.findFirst();
if (optionalAdd.isEmpty()) {
continue;
}
ManualChange add = optionalAdd.get();
ManualChange first = entry.getManualChanges()
.get(0);
if (add.equals(first)) {
continue;
}
OffsetDateTime firstTimestamp = first.getRequestedDate().minusSeconds(1);
String dossierId = entry.getEntityLogId().split("/")[0];
String fileId = entry.getEntityLogId().split("/")[1];
int i = addRedactionPersistenceService.updateRequestDate(fileId, entry.getEntryId(), firstTimestamp);
if (i != 0) {
affectedFiles.add(new FileAndDossier(fileId, dossierId));
numberOfChanged += i;
}
}
log.info("Updated request date of {} manual add redactions in {} files.", numberOfChanged, affectedFiles.size());
log.info("Reanalyzing affected files");
for (FileAndDossier affectedFile : affectedFiles) {
fileStatusService.setStatusReprocess(affectedFile.dossierId(), affectedFile.fileId(), false);
}
}
private record FileAndDossier(String fileId, String dossierId) {
}
}

View File

@ -1,6 +1,5 @@
package com.iqser.red.service.persistence.management.v1.processor.migration.migrations; package com.iqser.red.service.persistence.management.v1.processor.migration.migrations;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -14,7 +13,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.FileMan
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported.ImportedRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported.ImportedRedaction;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported.ImportedRedactions;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported.ImportedRedactionsPerPage; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.imported.ImportedRedactionsPerPage;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;

View File

@ -16,6 +16,7 @@ public class NerServiceRequest {
public static final String TARGET_FILE_EXTENSION = FileType.SIMPLIFIED_TEXT + FileType.SIMPLIFIED_TEXT.getExtension() + ".gz"; public static final String TARGET_FILE_EXTENSION = FileType.SIMPLIFIED_TEXT + FileType.SIMPLIFIED_TEXT.getExtension() + ".gz";
public static final String RESPONSE_FILE_EXTENSION = FileType.NER_ENTITIES + FileType.NER_ENTITIES.getExtension() + ".gz"; public static final String RESPONSE_FILE_EXTENSION = FileType.NER_ENTITIES + FileType.NER_ENTITIES.getExtension() + ".gz";
private String dossierTemplateId;
private String dossierId; private String dossierId;
private String fileId; private String fileId;
private String targetFileExtension; private String targetFileExtension;

View File

@ -194,4 +194,10 @@ public class FileStatusManagementService {
fileStatusService.setExcludedPages(fileId, excludedPages); fileStatusService.setExcludedPages(fileId, excludedPages);
} }
public List<FileModel> findAllByIds(Set<String> fileIds) {
return fileStatusService.findAllByIds(fileIds);
}
} }

View File

@ -281,7 +281,7 @@ public class FileStatusService {
if (settings.isNerServiceEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.NER_ENTITIES)) { if (settings.isNerServiceEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.NER_ENTITIES)) {
log.debug("Add file: {} from dossier {} to NER queue", fileId, dossierId); log.debug("Add file: {} from dossier {} to NER queue", fileId, dossierId);
addToNerQueue(dossierId, fileId); addToNerQueue(dossier.getDossierTemplateId(), dossierId, fileId);
sendReadOnlyAnalysisEvent(dossierId, fileId, fileEntity); sendReadOnlyAnalysisEvent(dossierId, fileId, fileEntity);
return; return;
} }
@ -467,11 +467,12 @@ public class FileStatusService {
} }
protected void addToNerQueue(String dossierId, String fileId) { protected void addToNerQueue(String dossierTemplateId, String dossierId, String fileId) {
setStatusNerAnalyzing(fileId); setStatusNerAnalyzing(fileId);
rabbitTemplate.convertAndSend(MessagingConfiguration.NER_SERVICE_QUEUE, rabbitTemplate.convertAndSend(MessagingConfiguration.NER_SERVICE_QUEUE,
NerServiceRequest.builder() NerServiceRequest.builder()
.dossierTemplateId(dossierTemplateId)
.dossierId(dossierId) .dossierId(dossierId)
.fileId(fileId) .fileId(fileId)
.targetFileExtension(NerServiceRequest.TARGET_FILE_EXTENSION) .targetFileExtension(NerServiceRequest.TARGET_FILE_EXTENSION)
@ -627,7 +628,12 @@ public class FileStatusService {
@Transactional @Transactional
public void setStatusReprocess(String dossierId, String fileId, boolean priority, Set<Integer> sectionsToReanalyse, boolean triggeredManually, boolean manualRedactionReanalyse) { public void setStatusReprocess(String dossierId,
String fileId,
boolean priority,
Set<Integer> sectionsToReanalyse,
boolean triggeredManually,
boolean manualRedactionReanalyse) {
log.info("Reprocessing file: {} from dossier {}", fileId, dossierId); log.info("Reprocessing file: {} from dossier {}", fileId, dossierId);
@ -757,7 +763,7 @@ public class FileStatusService {
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.DOCUMENT_STRUCTURE); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.DOCUMENT_STRUCTURE);
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.NER_ENTITIES); fileManagementStorageService.deleteObject(dossierId, fileId, FileType.NER_ENTITIES);
if(applicationType.equalsIgnoreCase("DocuMine")){ if (applicationType.equalsIgnoreCase("DocuMine")) {
entityLogMongoService.deleteEntityLog(dossierId, fileId); entityLogMongoService.deleteEntityLog(dossierId, fileId);
} }
@ -904,4 +910,13 @@ public class FileStatusService {
} }
} }
public List<FileModel> findAllByIds(Set<String> fileIds) {
return fileStatusPersistenceService.findAllByIds(fileIds)
.stream()
.map(entity -> MagicConverter.convert(entity, FileModel.class, new FileModelMapper()))
.toList();
}
} }

View File

@ -107,7 +107,7 @@ public class ManualRedactionMapper {
for (EntityLogEntry entityLogEntry : entityLogEntriesWithId) { for (EntityLogEntry entityLogEntry : entityLogEntriesWithId) {
if (invalidDictionaryRequest(removeRedactionRequest, entityLogEntry) || invalidLocalRequest(removeRedactionRequest, entityLogEntry)) { if (entityLogEntry.getState().equals(EntryState.PENDING) || entityLogEntry.getState().equals(EntryState.REMOVED)) {
continue; continue;
} }
@ -134,24 +134,6 @@ public class ManualRedactionMapper {
} }
private static boolean invalidLocalRequest(RemoveRedactionRequestModel removeRedactionRequest, EntityLogEntry entityLogEntry) {
return !isDictionaryRequest(removeRedactionRequest) && entityLogEntry.getState().equals(EntryState.REMOVED);
}
private static boolean isDictionaryRequest(RemoveRedactionRequestModel removeRedactionRequest) {
return removeRedactionRequest.isRemoveFromDictionary() || removeRedactionRequest.isRemoveFromAllDossiers();
}
private static boolean invalidDictionaryRequest(RemoveRedactionRequestModel removeRedactionRequest, EntityLogEntry entityLogEntry) {
return isDictionaryRequest(removeRedactionRequest) && entityLogEntry.getState().equals(EntryState.PENDING);
}
public List<RequestEntryPair<ForceRedactionRequest>> toForceRedactionRequestList(String dossierId, public List<RequestEntryPair<ForceRedactionRequest>> toForceRedactionRequestList(String dossierId,
String fileId, String fileId,
Set<ForceRedactionRequestModel> forceRedactionRequests, Set<ForceRedactionRequestModel> forceRedactionRequests,
@ -239,7 +221,7 @@ public class ManualRedactionMapper {
for (EntityLogEntry entityLogEntry : entityLogEntriesById) { for (EntityLogEntry entityLogEntry : entityLogEntriesById) {
if (invalidDictionaryRequest(recategorizationRequest, entityLogEntry) || invalidLocalRequest(recategorizationRequest, entityLogEntry)) { if (entityLogEntry.getState().equals(EntryState.PENDING) || entityLogEntry.getState().equals(EntryState.REMOVED)) {
continue; continue;
} }
@ -293,24 +275,6 @@ public class ManualRedactionMapper {
} }
private static boolean invalidLocalRequest(RecategorizationRequestModel removeRedactionRequest, EntityLogEntry entityLogEntry) {
return !isDictionaryRequest(removeRedactionRequest) && entityLogEntry.getState().equals(EntryState.REMOVED);
}
private static boolean isDictionaryRequest(RecategorizationRequestModel removeRedactionRequest) {
return removeRedactionRequest.isAddToDictionary() || removeRedactionRequest.isAddToAllDossiers();
}
private static boolean invalidDictionaryRequest(RecategorizationRequestModel removeRedactionRequest, EntityLogEntry entityLogEntry) {
return isDictionaryRequest(removeRedactionRequest) && entityLogEntry.getState().equals(EntryState.PENDING);
}
private void checkSectionLength(String changedSection) { private void checkSectionLength(String changedSection) {
if (changedSection == null) { if (changedSection == null) {
@ -354,8 +318,11 @@ public class ManualRedactionMapper {
List<RequestEntryPair<ResizeRedactionRequest>> requests = new ArrayList<>(); List<RequestEntryPair<ResizeRedactionRequest>> requests = new ArrayList<>();
for (ResizeRedactionRequestModel resizeRedactionRequest : resizeRedactionRequests) { for (ResizeRedactionRequestModel resizeRedactionRequest : resizeRedactionRequests) {
for (EntityLogEntry entityLogEntry : entityLogEntries) {
if (entityLogEntry.getState().equals(EntryState.REMOVED) || entityLogEntry.getState().equals(EntryState.PENDING)) {
continue;
}
entityLogEntries.forEach(entityLogEntry -> {
ResizeRedactionRequest request = ResizeRedactionRequest.builder() ResizeRedactionRequest request = ResizeRedactionRequest.builder()
.annotationId(resizeRedactionRequest.getAnnotationId()) .annotationId(resizeRedactionRequest.getAnnotationId())
.user(KeycloakSecurity.getUserId()) .user(KeycloakSecurity.getUserId())
@ -375,10 +342,9 @@ public class ManualRedactionMapper {
} }
requests.add(RequestEntryPair.<ResizeRedactionRequest>builder().request(request).entityLogEntry(entityLogEntry).build()); requests.add(RequestEntryPair.<ResizeRedactionRequest>builder().request(request).entityLogEntry(entityLogEntry).build());
}); }
} }
return requests; return requests;
} }

View File

@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
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.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -685,4 +686,10 @@ public class FileStatusPersistenceService {
fileRepository.setLastFlagCalculationDate(fileId, lastFlagCalculation, OffsetDateTime.now()); fileRepository.setLastFlagCalculationDate(fileId, lastFlagCalculation, OffsetDateTime.now());
} }
public List<FileEntity> findAllByIds(Set<String> fileIds) {
return fileRepository.findAllById(fileIds);
}
} }

View File

@ -152,4 +152,11 @@ public class AddRedactionPersistenceService {
manualRedactionRepository.undeleteByFileId(fileId, deletionTime); manualRedactionRepository.undeleteByFileId(fileId, deletionTime);
} }
@Transactional
public int updateRequestDate(String fileId, String annotationId, OffsetDateTime requestDate) {
return manualRedactionRepository.updateRequestDateById(new AnnotationEntityId(annotationId, fileId), requestDate);
}
} }

View File

@ -3,7 +3,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.List; import java.util.List;
import java.util.Set;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -31,7 +30,7 @@ public class RecategorizationPersistenceService {
AnnotationEntityId id = new AnnotationEntityId(request.getAnnotationId(), fileId); AnnotationEntityId id = new AnnotationEntityId(request.getAnnotationId(), fileId);
ManualRecategorizationEntity entity = recategorizationRepository.findById(id) ManualRecategorizationEntity entity = recategorizationRepository.findById(id)
.orElse(ManualRecategorizationEntity.builder().id(id).build()); .orElse(buildEntity(id));
entity.setUser(request.getUser()); entity.setUser(request.getUser());
@ -60,6 +59,14 @@ public class RecategorizationPersistenceService {
} }
private static ManualRecategorizationEntity buildEntity(AnnotationEntityId id) {
var e = new ManualRecategorizationEntity();
e.setId(id);
return e;
}
@Transactional @Transactional
public void hardDelete(String fileId, String annotationId) { public void hardDelete(String fileId, String annotationId) {
@ -87,21 +94,25 @@ public class RecategorizationPersistenceService {
.orElseThrow(() -> new NotFoundException("Unknown file/annotation combination: " + fileId + "/" + annotationId)); .orElseThrow(() -> new NotFoundException("Unknown file/annotation combination: " + fileId + "/" + annotationId));
} }
public List<ManualRecategorizationEntity> findEntriesByFileIdAndOptions(String fileId, ManualChangesQueryOptions options) { public List<ManualRecategorizationEntity> findEntriesByFileIdAndOptions(String fileId, ManualChangesQueryOptions options) {
return recategorizationRepository.findByFileIdAndOptions(fileId, options.isIncludeDeletions(), options.isIncludeOnlyUnprocessed(), options.isIncludeDictChanges()); return recategorizationRepository.findByFileIdAndOptions(fileId, options.isIncludeDeletions(), options.isIncludeOnlyUnprocessed(), options.isIncludeDictChanges());
} }
public int softDeleteByFileIds(List<String> fileIds, OffsetDateTime softDeletionTime) { public int softDeleteByFileIds(List<String> fileIds, OffsetDateTime softDeletionTime) {
return recategorizationRepository.softDeleteByFileIds(fileIds, softDeletionTime); return recategorizationRepository.softDeleteByFileIds(fileIds, softDeletionTime);
} }
public int deleteByFileIds(List<String> fileIds) { public int deleteByFileIds(List<String> fileIds) {
return recategorizationRepository.deleteByFileIds(fileIds); return recategorizationRepository.deleteByFileIds(fileIds);
} }
@Transactional @Transactional
public void markAsProcessed(String annotationId, String fileId) { public void markAsProcessed(String annotationId, String fileId) {
@ -115,6 +126,7 @@ public class RecategorizationPersistenceService {
recategorizationRepository.saveAndFlush(recategorizationEntity); recategorizationRepository.saveAndFlush(recategorizationEntity);
} }
public void undeleteByFileId(String fileId, OffsetDateTime deletionTime) { public void undeleteByFileId(String fileId, OffsetDateTime deletionTime) {
recategorizationRepository.undeleteByFileId(fileId, deletionTime); recategorizationRepository.undeleteByFileId(fileId, deletionTime);

View File

@ -53,20 +53,26 @@ public interface ManualRedactionRepository extends JpaRepository<ManualRedaction
@Modifying @Modifying
@Query("update ManualRedactionEntryEntity m set m.softDeletedTime = :softDeletedTime where m.id.fileId in (:fileIds) and m.softDeletedTime is null") @Query("update ManualRedactionEntryEntity m set m.softDeletedTime = :softDeletedTime where m.id.fileId in (:fileIds) and m.softDeletedTime is null")
int softDeleteByFileIds(@Param("fileIds") List<String> fileIds, int softDeleteByFileIds(@Param("fileIds") List<String> fileIds, @Param("softDeletedTime") OffsetDateTime softDeletedTime);
@Param("softDeletedTime") OffsetDateTime softDeletedTime);
@Modifying @Modifying
@Query("update ManualRedactionEntryEntity m set m.softDeletedTime = null where m.id.fileId = :fileId and m.softDeletedTime >= :softDeletedTime") @Query("update ManualRedactionEntryEntity m set m.softDeletedTime = null where m.id.fileId = :fileId and m.softDeletedTime >= :softDeletedTime")
int undeleteByFileId(@Param("fileId") String fileId, int undeleteByFileId(@Param("fileId") String fileId, @Param("softDeletedTime") OffsetDateTime softDeletedTime);
@Param("softDeletedTime") OffsetDateTime softDeletedTime);
@Modifying @Modifying
@Query("delete ManualRedactionEntryEntity m where m.id.fileId in (:fileIds)") @Query("delete ManualRedactionEntryEntity m where m.id.fileId in (:fileIds)")
int deleteByFileIds(@Param("fileIds") List<String> fileIds); int deleteByFileIds(@Param("fileIds") List<String> fileIds);
@Modifying @Modifying
@Query("update ManualRedactionEntryEntity m set m.processedDate = :processedDate where m.id = :annotationEntityId") @Query("update ManualRedactionEntryEntity m set m.processedDate = :processedDate where m.id = :annotationEntityId")
void markAsProcessed(@Param("annotationEntityId") AnnotationEntityId annotationEntityId, @Param("processedDate") OffsetDateTime processedDate); void markAsProcessed(@Param("annotationEntityId") AnnotationEntityId annotationEntityId, @Param("processedDate") OffsetDateTime processedDate);
@Modifying
@Query("update ManualRedactionEntryEntity e set e.requestDate = :requestDate where e.id = :annotationEntityId")
int updateRequestDateById(@Param("annotationEntityId") AnnotationEntityId annotationEntityId, @Param("requestDate") OffsetDateTime requestDate);
} }

View File

@ -432,28 +432,26 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
manualRedactionClient.removeRedactionBulk(dossierId, manualRedactionClient.removeRedactionBulk(dossierId,
fileId, fileId,
Set.of(RemoveRedactionRequestModel.builder().annotationId(annotationId).comment("comment").removeFromDictionary(false).build()), Set.of(RemoveRedactionRequestModel.builder().annotationId(annotationId).comment("removeComment").removeFromDictionary(false).build()));
false);
manualRedactionClient.forceRedactionBulk(dossierId, manualRedactionClient.forceRedactionBulk(dossierId,
fileId, fileId,
Set.of(ForceRedactionRequestModel.builder().annotationId("forceRedactionAnnotation").comment("comment").legalBasis("1").build())); Set.of(ForceRedactionRequestModel.builder().annotationId("forceRedactionAnnotation").comment("forceComment").legalBasis("1").build()));
manualRedactionClient.legalBasisChangeBulk(dossierId, manualRedactionClient.legalBasisChangeBulk(dossierId,
fileId, fileId,
Set.of(LegalBasisChangeRequestModel.builder() Set.of(LegalBasisChangeRequestModel.builder()
.annotationId("legalBasisChangeAnnotation") .annotationId("legalBasisChangeAnnotation")
.comment("comment") .comment("legalBasisComment")
.legalBasis("1") .legalBasis("1")
.build())); .build()));
manualRedactionClient.recategorizeBulk(dossierId, manualRedactionClient.recategorizeBulk(dossierId,
fileId, fileId,
Set.of(RecategorizationRequestModel.builder() Set.of(RecategorizationRequestModel.builder()
.annotationId(annotationId) .annotationId(annotationId)
.comment("comment") .comment("recategorizationComment")
.type("new-type") .type("new-type")
.legalBasis(null) .legalBasis(null)
.section("section") .section("section")
.build()), .build()));
false);
manualRedactionClient.addComment(dossierId, fileId, commentId, AddCommentRequestModel.builder().text("comment added via text fileId").build()); manualRedactionClient.addComment(dossierId, fileId, commentId, AddCommentRequestModel.builder().text("comment added via text fileId").build());
@ -780,8 +778,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
.legalBasis("") .legalBasis("")
.section("section") .section("section")
.value("value entry 3") .value("value entry 3")
.build()), .build()));
false);
var loadedFile = fileClient.getFileStatus(dossierId, fileId); var loadedFile = fileClient.getFileStatus(dossierId, fileId);

View File

@ -42,6 +42,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.FileMan
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.EntryPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionRequest; import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult;
import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType;
@ -124,6 +125,9 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
@Autowired @Autowired
private ManualRedactionService manualRedactionService; private ManualRedactionService manualRedactionService;
@Autowired
private AddRedactionPersistenceService addRedactionPersistenceService;
@Test @Test
public void testRemoveToDossierTemplateWithDossierDictionaryOnlyTrue() { public void testRemoveToDossierTemplateWithDossierDictionaryOnlyTrue() {
@ -163,8 +167,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.annotationId("AnnotationId") .annotationId("AnnotationId")
.removeFromDictionary(true) .removeFromDictionary(true)
.removeFromAllDossiers(true) .removeFromAllDossiers(true)
.build()), .build())));//.get(0);
false));//.get(0);
var dossierTemplateDictionary = internalDictionaryClient.getDictionaryForType(toTypeId(type.getType(), dossierTemplate.getId()), null); var dossierTemplateDictionary = internalDictionaryClient.getDictionaryForType(toTypeId(type.getType(), dossierTemplate.getId()), null);
assertThat(dossierTemplateDictionary.getEntries().size()).isZero(); assertThat(dossierTemplateDictionary.getEntries().size()).isZero();
@ -356,8 +359,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.annotationId("AnnotationId") .annotationId("AnnotationId")
.removeFromDictionary(true) .removeFromDictionary(true)
.removeFromAllDossiers(true) .removeFromAllDossiers(true)
.build()), .build()));
false);
dossierTemplateDictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); dossierTemplateDictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null);
assertThat(dossierTemplateDictionary.getEntries()).containsExactlyInAnyOrder("Darth Vader"); assertThat(dossierTemplateDictionary.getEntries()).containsExactlyInAnyOrder("Darth Vader");
@ -412,8 +414,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
manualRedactionClient.removeRedactionBulk(dossier.getId(), manualRedactionClient.removeRedactionBulk(dossier.getId(),
file.getId(), file.getId(),
Set.of(RemoveRedactionRequestModel.builder().annotationId("AnnotationId").removeFromDictionary(true).build()), Set.of(RemoveRedactionRequestModel.builder().annotationId("AnnotationId").removeFromDictionary(true).build())).getManualAddResponses()
false).getManualAddResponses()
.get(0); .get(0);
var dossierDictionary = internalDictionaryClient.getDictionaryForType(toTypeId(type.getType(), dossierTemplate.getId(), dossier.getId()), null); var dossierDictionary = internalDictionaryClient.getDictionaryForType(toTypeId(type.getType(), dossierTemplate.getId(), dossier.getId()), null);
@ -471,8 +472,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.annotationId("AnnotationId") .annotationId("AnnotationId")
.removeFromDictionary(true) .removeFromDictionary(true)
.removeFromAllDossiers(true) .removeFromAllDossiers(true)
.build()), .build())).getManualAddResponses()
false).getManualAddResponses()
.get(0); .get(0);
var dossierDictionary = internalDictionaryClient.getDictionaryForType(toTypeId(type.getType(), dossierTemplate.getId(), dossier.getId()), null); var dossierDictionary = internalDictionaryClient.getDictionaryForType(toTypeId(type.getType(), dossierTemplate.getId(), dossier.getId()), null);
@ -592,7 +592,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.addToAllDossiers(true) .addToAllDossiers(true)
.build(); .build();
manualRedactionClient.resizeRedactionBulk(dossier1.getId(), file1.getFileId(), Set.of(resizeRedactionDosAndAddToAllDos), false); manualRedactionClient.resizeRedactionBulk(dossier1.getId(), file1.getFileId(), Set.of(resizeRedactionDosAndAddToAllDos));
loadedRedactionsFile1 = manualRedactionClient.getManualRedactions(file1.getDossierId(), file1.getFileId(), false, true); loadedRedactionsFile1 = manualRedactionClient.getManualRedactions(file1.getDossierId(), file1.getFileId(), false, true);
@ -761,7 +761,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.addToAllDossiers(true) .addToAllDossiers(true)
.build(); .build();
manualRedactionClient.resizeRedactionBulk(dossier1.getId(), file1.getFileId(), Set.of(resizeRedactionDosAndAddToAllDos), false); manualRedactionClient.resizeRedactionBulk(dossier1.getId(), file1.getFileId(), Set.of(resizeRedactionDosAndAddToAllDos));
loadedRedactionsFile1 = manualRedactionClient.getManualRedactions(file1.getDossierId(), file1.getFileId(), false, true); loadedRedactionsFile1 = manualRedactionClient.getManualRedactions(file1.getDossierId(), file1.getFileId(), false, true);
@ -934,7 +934,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.addToAllDossiers(true) .addToAllDossiers(true)
.build(); .build();
var resizeRedactions = manualRedactionClient.resizeRedactionBulk(dossier2.getId(), file2.getFileId(), Set.of(resizeRedactionDosTemp), false); var resizeRedactions = manualRedactionClient.resizeRedactionBulk(dossier2.getId(), file2.getFileId(), Set.of(resizeRedactionDosTemp));
var loadedRedactionsFile2 = manualRedactionClient.getManualRedactions(file2.getDossierId(), file2.getFileId(), false, true); var loadedRedactionsFile2 = manualRedactionClient.getManualRedactions(file2.getDossierId(), file2.getFileId(), false, true);
@ -1104,7 +1104,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.addToAllDossiers(true) .addToAllDossiers(true)
.build(); .build();
var resizeRedactions = manualRedactionClient.resizeRedactionBulk(dossier2.getId(), file2.getFileId(), Set.of(resizeRedactionDosTemp), false); var resizeRedactions = manualRedactionClient.resizeRedactionBulk(dossier2.getId(), file2.getFileId(), Set.of(resizeRedactionDosTemp));
var loadedRedactionsFile2 = manualRedactionClient.getManualRedactions(file2.getDossierId(), file2.getFileId(), false, true); var loadedRedactionsFile2 = manualRedactionClient.getManualRedactions(file2.getDossierId(), file2.getFileId(), false, true);
@ -1229,8 +1229,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.legalBasis("") .legalBasis("")
.section("section") .section("section")
.value(lukeSkywalker) .value(lukeSkywalker)
.build()), .build()));
false);
dossierTemplateDictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); dossierTemplateDictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null);
assertThat(dossierTemplateDictionary.getEntries()).containsExactlyInAnyOrder(darthVader); assertThat(dossierTemplateDictionary.getEntries()).containsExactlyInAnyOrder(darthVader);
@ -1315,8 +1314,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.legalBasis("") .legalBasis("")
.section("section") .section("section")
.value(lukeSkywalker) .value(lukeSkywalker)
.build()), .build()));
false);
dossierTemplateDictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); dossierTemplateDictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null);
assertThat(dossierTemplateDictionary.getEntries()).isEmpty(); assertThat(dossierTemplateDictionary.getEntries()).isEmpty();
@ -1492,8 +1490,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.annotationId("AnnotationId") .annotationId("AnnotationId")
.removeFromDictionary(true) .removeFromDictionary(true)
.removeFromAllDossiers(true) .removeFromAllDossiers(true)
.build()), .build()));
false);
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
assertEquals(allManualRedactions.getIdsToRemove().size(), 1); assertEquals(allManualRedactions.getIdsToRemove().size(), 1);
@ -1523,8 +1520,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.annotationId("AnnotationId2") .annotationId("AnnotationId2")
.removeFromDictionary(true) .removeFromDictionary(true)
.removeFromAllDossiers(true) .removeFromAllDossiers(true)
.build()), .build()));
false);
allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
assertEquals(allManualRedactions.getIdsToRemove().size(), 2); assertEquals(allManualRedactions.getIdsToRemove().size(), 2);
@ -1720,8 +1716,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
manualRedactionClient.recategorizeBulk(dossier.getId(), manualRedactionClient.recategorizeBulk(dossier.getId(),
file.getId(), file.getId(),
Set.of(RecategorizationRequestModel.builder().annotationId("dv").legalBasis("").section("section").type(type.getType()).build()), Set.of(RecategorizationRequestModel.builder().annotationId("dv").legalBasis("").section("section").type(type.getType()).build()));
false);
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
assertEquals(allManualRedactions.getRecategorizations().size(), 1); assertEquals(allManualRedactions.getRecategorizations().size(), 1);
@ -1747,8 +1742,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
manualRedactionClient.recategorizeBulk(dossier.getId(), manualRedactionClient.recategorizeBulk(dossier.getId(),
file.getId(), file.getId(),
Set.of(RecategorizationRequestModel.builder().annotationId("dv2").legalBasis("").section("section").type(type.getType()).build()), Set.of(RecategorizationRequestModel.builder().annotationId("dv2").legalBasis("").section("section").type(type.getType()).build()));
false);
allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
assertEquals(allManualRedactions.getRecategorizations().size(), 2); assertEquals(allManualRedactions.getRecategorizations().size(), 2);
@ -2048,7 +2042,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.addToAllDossiers(true) .addToAllDossiers(true)
.build(); .build();
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel, recatModelNoLegalBasis), false); manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel, recatModelNoLegalBasis));
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
assertEquals(2, allManualRedactions.getRecategorizations().size()); assertEquals(2, allManualRedactions.getRecategorizations().size());
@ -2056,7 +2050,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.stream() .stream()
.anyMatch(entry -> entry.getAnnotationId().equals("annotationId"))); .anyMatch(entry -> entry.getAnnotationId().equals("annotationId")));
assertThatThrownBy(() -> manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModelLongLegalBasis), false).getManualAddResponses() assertThatThrownBy(() -> manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModelLongLegalBasis)).getManualAddResponses()
.get(0)).isInstanceOf(FeignException.class).hasMessageContaining("The legal basis is too long"); .get(0)).isInstanceOf(FeignException.class).hasMessageContaining("The legal basis is too long");
assertNull(allManualRedactions.getRecategorizations() assertNull(allManualRedactions.getRecategorizations()
@ -2122,7 +2116,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.section("overriddenSection") .section("overriddenSection")
.build(); .build();
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel), false); manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel));
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
assertEquals(1, allManualRedactions.getRecategorizations().size()); assertEquals(1, allManualRedactions.getRecategorizations().size());
@ -2171,7 +2165,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.legalBasis("") .legalBasis("")
.build(); .build();
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false); manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel));
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
@ -2267,7 +2261,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.positions(List.of(Rectangle.builder().page(1).height(1).width(2).topLeftX(1).topLeftY(1).build())) .positions(List.of(Rectangle.builder().page(1).height(1).width(2).topLeftX(1).topLeftY(1).build()))
.build(); .build();
manualRedactionClient.resizeRedactionBulk(dossier.getId(), file.getId(), Set.of(resizeRedactionRequestModel), false); manualRedactionClient.resizeRedactionBulk(dossier.getId(), file.getId(), Set.of(resizeRedactionRequestModel));
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
@ -2422,7 +2416,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.value("Image:Other") .value("Image:Other")
.build(); .build();
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false); manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel));
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
@ -2492,7 +2486,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.value("Ranya Eikenboom") .value("Ranya Eikenboom")
.build(); .build();
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false); manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel));
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true); var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
@ -2688,8 +2682,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.addToAllDossiers(false) .addToAllDossiers(false)
.value("Luke") .value("Luke")
.positions(List.of(new Rectangle(5f, 5f, 5f, 5f, 1))) .positions(List.of(new Rectangle(5f, 5f, 5f, 5f, 1)))
.build()), .build())).getManualAddResponses()
false).getManualAddResponses()
.get(0); .get(0);
assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getId(), "AnnotationId");
@ -2747,8 +2740,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.legalBasis("") .legalBasis("")
.section("section") .section("section")
.value("Luke Skywalker") .value("Luke Skywalker")
.build()), .build())).getManualAddResponses()
false).getManualAddResponses()
.get(0); .get(0);
assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getId(), "AnnotationId");
@ -2793,8 +2785,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.annotationId("AnnotationId") .annotationId("AnnotationId")
.removeFromDictionary(false) .removeFromDictionary(false)
.removeFromAllDossiers(false) .removeFromAllDossiers(false)
.build()), .build())).getManualAddResponses()
false).getManualAddResponses()
.get(0); .get(0);
assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getId(), "AnnotationId");
@ -2850,8 +2841,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
.legalBasis("Article legal basis") .legalBasis("Article legal basis")
.section("section") .section("section")
.value("Luke Skywalker") .value("Luke Skywalker")
.build()), .build())).getManualAddResponses()
false).getManualAddResponses()
.get(0); .get(0);
assertEquals(response.getEntityLogEntry().getId(), "AnnotationId"); assertEquals(response.getEntityLogEntry().getId(), "AnnotationId");
@ -2897,7 +2887,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog); when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog);
ManualRedactionResponse manualRedactionResponse = manualRedactionClient.removeRedactionBulk(dossier.getId(), file.getId(), removeRedactionRequestModels, false); ManualRedactionResponse manualRedactionResponse = manualRedactionClient.removeRedactionBulk(dossier.getId(), file.getId(), removeRedactionRequestModels);
assertEquals(manualRedactionResponse.getManualAddResponses().size(), 600); assertEquals(manualRedactionResponse.getManualAddResponses().size(), 600);
} }
@ -2971,7 +2961,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog); when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog);
ManualRedactionResponse manualRedactionResponse = manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), recategorizationRequestModels, false); ManualRedactionResponse manualRedactionResponse = manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), recategorizationRequestModels);
assertEquals(manualRedactionResponse.getManualAddResponses().size(), 600); assertEquals(manualRedactionResponse.getManualAddResponses().size(), 600);
} }
@ -3003,7 +2993,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog); when(entityLogService.getEntityLog(any(), any(), anyBoolean())).thenReturn(entityLog);
var result = assertThrows(FeignException.class, () -> manualRedactionClient.removeRedactionBulk(dossier.getId(), file.getId(), removeRedactionRequestModels, false)); var result = assertThrows(FeignException.class, () -> manualRedactionClient.removeRedactionBulk(dossier.getId(), file.getId(), removeRedactionRequestModels));
assertTrue(result.getMessage().contains("Maximum number of remove from dictionary requests is 100.")); assertTrue(result.getMessage().contains("Maximum number of remove from dictionary requests is 100."));
} }

View File

@ -9,6 +9,7 @@ import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogEntryDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogEntryDocument;
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.projections.EntryWithManualChangesProjection;
@Repository @Repository
public interface EntityLogEntryDocumentRepository extends MongoRepository<EntityLogEntryDocument, String> { public interface EntityLogEntryDocumentRepository extends MongoRepository<EntityLogEntryDocument, String> {
@ -21,6 +22,10 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository<Entity
List<EntityLogEntryDocument> findByEntityLogIdAndChangesAnalysisNumberEquals(String entityLogId, Integer analysisNumber); List<EntityLogEntryDocument> findByEntityLogIdAndChangesAnalysisNumberEquals(String entityLogId, Integer analysisNumber);
@Query("{ 'entityLogId' : ?0, 'changes.analysisNumber' : { $gte: ?1, $lte: ?2 } }")
List<EntityLogEntryDocument> findByEntityLogIdAndChangesAnalysisNumberBetween(String entityLogId, Integer analysisNumberStart, Integer analysisNumberEnd);
@Query("{ 'entityLogId' : ?0}") @Query("{ 'entityLogId' : ?0}")
List<EntityLogEntryDocument> findByEntityLogId(String entityLogId); List<EntityLogEntryDocument> findByEntityLogId(String entityLogId);
@ -64,4 +69,14 @@ public interface EntityLogEntryDocumentRepository extends MongoRepository<Entity
@Query(value = "{ 'entityLogId': ?0, 'engines': 'IMPORTED' }", exists = true) @Query(value = "{ 'entityLogId': ?0, 'engines': 'IMPORTED' }", exists = true)
boolean existsByEntityLogIdAndEngineImported(String entityLogId); boolean existsByEntityLogIdAndEngineImported(String entityLogId);
@Query(value = """
{
'entryType': 'ENTITY',
'state': 'APPLIED',
$or: [{ 'legalBasis': null },
{ 'legalBasis': '' }
]}
""", fields = "{ 'entryId': 1, 'entityLogId': 1, 'state': 1, 'entryType': 1 , 'manualChanges': 1}")
List<EntryWithManualChangesProjection> findAppliedEntitiesWhereLegalBasisEmpty();
} }

View File

@ -0,0 +1,25 @@
package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.projections;
import java.util.List;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange;
public interface EntryWithManualChangesProjection {
String getEntryId();
String getEntityLogId();
EntryState getState();
EntryType getEntryType();
List<ManualChange> getManualChanges();
}