Merge branch 'RED-9042-bp' into 'release/2.349.x'
RED-9042: merge legal basis into recategorize See merge request redactmanager/persistence-service!466
This commit is contained in:
commit
866e4a8cd1
@ -6,9 +6,6 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac
|
||||
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DO_MANUAL_REDACTION;
|
||||
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_MANUAL_REDACTIONS;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -23,7 +20,6 @@ import com.iqser.red.service.persistence.management.v1.processor.model.ManualCha
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.CommentService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionUndoService;
|
||||
@ -31,12 +27,17 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
|
||||
import com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest;
|
||||
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.Comment;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.CommentRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest;
|
||||
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.ManualRedactions;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RecategorizationRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RemoveRedactionRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest;
|
||||
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.AddRedactionRequestModel;
|
||||
@ -68,7 +69,6 @@ public class ManualRedactionController implements ManualRedactionResource {
|
||||
AccessControlService accessControlService;
|
||||
CommentService commentService;
|
||||
FileStatusManagementService fileStatusManagementService;
|
||||
EntityLogService entityLogService;
|
||||
|
||||
|
||||
@Override
|
||||
@ -257,12 +257,6 @@ public class ManualRedactionController implements ManualRedactionResource {
|
||||
accessControlService.verifyFileIsNotApproved(dossierId, fileId);
|
||||
accessControlService.verifyUserIsMemberOrApprover(dossierId);
|
||||
|
||||
return handleLegalBasisChanges(dossierId, fileId, legalBasisChangeRequests);
|
||||
}
|
||||
|
||||
|
||||
private List<ManualAddResponse> handleLegalBasisChanges(String dossierId, String fileId, Set<LegalBasisChangeRequestModel> legalBasisChangeRequests) {
|
||||
|
||||
List<ManualAddResponse> responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, legalBasisChangeRequests);
|
||||
|
||||
responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder()
|
||||
@ -272,6 +266,7 @@ public class ManualRedactionController implements ManualRedactionResource {
|
||||
.message("Legal basis reason was changed")
|
||||
.details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId()))
|
||||
.build()));
|
||||
|
||||
return responseList;
|
||||
}
|
||||
|
||||
@ -287,42 +282,11 @@ public class ManualRedactionController implements ManualRedactionResource {
|
||||
accessControlService.verifyFileIsNotApproved(dossierId, fileId);
|
||||
accessControlService.verifyUserIsMemberOrApprover(dossierId);
|
||||
|
||||
EntityLog entityLog = entityLogService.getEntityLog(dossierId, fileId, Collections.emptyList(), includeUnprocessed);
|
||||
|
||||
Set<RecategorizationRequestModel> recategorizations = new HashSet<>();
|
||||
Set<LegalBasisChangeRequestModel> legalBasisChanges = new HashSet<>();
|
||||
|
||||
recategorizationRequests.forEach(recategorizationRequestModel -> {
|
||||
var entry = entityLog.getEntityLogEntry()
|
||||
.stream()
|
||||
.filter(entityLogEntry -> entityLogEntry.getId().equals(recategorizationRequestModel.getAnnotationId()))
|
||||
.findFirst();
|
||||
if (entry.isPresent()) {
|
||||
if (manualRedactionService.isLegalBasisChangeRequest(recategorizationRequestModel, entry.get())) {
|
||||
LegalBasisChangeRequestModel legalBasisChange = manualRedactionService.convertRecategorizationToLegalBasisChange(recategorizationRequestModel);
|
||||
legalBasisChanges.add(legalBasisChange);
|
||||
} else {
|
||||
recategorizations.add(recategorizationRequestModel);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
List<ManualAddResponse> responseList = new ArrayList<>();
|
||||
|
||||
responseList.addAll(handleLegalBasisChanges(dossierId, fileId, legalBasisChanges));
|
||||
responseList.addAll(handleRectegorizations(dossierId, fileId, recategorizations, includeUnprocessed, dossier.getDossierTemplateId()));
|
||||
|
||||
return responseList;
|
||||
}
|
||||
|
||||
|
||||
private List<ManualAddResponse> handleRectegorizations(String dossierId,
|
||||
String fileId,
|
||||
Set<RecategorizationRequestModel> recategorizationRequests,
|
||||
boolean includeUnprocessed,
|
||||
String dossierTemplateId) {
|
||||
|
||||
List<ManualAddResponse> responseList = manualRedactionService.addRecategorization(dossierId, fileId, recategorizationRequests, dossierTemplateId, includeUnprocessed);
|
||||
List<ManualAddResponse> responseList = manualRedactionService.addRecategorization(dossierId,
|
||||
fileId,
|
||||
recategorizationRequests,
|
||||
dossier.getDossierTemplateId(),
|
||||
includeUnprocessed);
|
||||
|
||||
responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder()
|
||||
.userId(KeycloakSecurity.getUserId())
|
||||
|
||||
@ -14,6 +14,7 @@ import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
|
||||
@ -29,6 +29,9 @@ import lombok.NoArgsConstructor;
|
||||
@Table(name = "manual_recategorization")
|
||||
public class ManualRecategorizationEntity implements IBaseAnnotation {
|
||||
|
||||
public static final int MAX_LEGAL_BASIS_LENGTH = 4000;
|
||||
public static final int MAX_SECTION_LENGTH = 1024;
|
||||
|
||||
@EmbeddedId
|
||||
private AnnotationEntityId id;
|
||||
@Column(name = "user_id")
|
||||
@ -47,9 +50,9 @@ public class ManualRecategorizationEntity implements IBaseAnnotation {
|
||||
private boolean addToDictionary;
|
||||
@Column
|
||||
private boolean addToAllDossiers;
|
||||
@Column(length = 4000)
|
||||
@Column(length = MAX_LEGAL_BASIS_LENGTH)
|
||||
private String legalBasis;
|
||||
@Column(length = 1024)
|
||||
@Column(length = MAX_SECTION_LENGTH)
|
||||
private String section;
|
||||
@Column
|
||||
private String value;
|
||||
|
||||
@ -7,7 +7,6 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@ -18,20 +17,15 @@ import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.assertj.core.util.Strings;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.PendingDictionaryEntryFactory;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DictionaryPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Change;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ChangeType;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine;
|
||||
@ -40,8 +34,8 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
|
||||
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;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualRedactionType;
|
||||
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.annotations.ManualChangeFactory;
|
||||
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.Rectangle;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation;
|
||||
@ -51,7 +45,6 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType;
|
||||
|
||||
import io.micrometer.observation.annotation.Observed;
|
||||
@ -67,9 +60,6 @@ import lombok.extern.slf4j.Slf4j;
|
||||
public class EntityLogMergeService {
|
||||
|
||||
DictionaryPersistenceService dictionaryPersistenceService;
|
||||
RabbitTemplate rabbitTemplate;
|
||||
FileStatusService fileStatusService;
|
||||
FileStatusPersistenceService fileStatusPersistenceService;
|
||||
PendingDictionaryEntryFactory pendingDictionaryEntryFactory;
|
||||
|
||||
|
||||
@ -87,13 +77,11 @@ public class EntityLogMergeService {
|
||||
|
||||
List<EntityLogEntry> entityLogEntries = new LinkedList<>(entityLog.getEntityLogEntry());
|
||||
|
||||
Map<String, EntityLogEntry> addedLocalManualEntries = buildUnprocessedLocalManualRedactions(unprocessedManualRedactions,
|
||||
entityLog,
|
||||
dossier).collect(Collectors.toMap(EntityLogEntry::getId, Function.identity()));
|
||||
Map<String, EntityLogEntry> addedLocalManualEntries = buildUnprocessedLocalManualRedactions(unprocessedManualRedactions, entityLog, dossier)//
|
||||
.collect(Collectors.toMap(EntityLogEntry::getId, Function.identity()));
|
||||
|
||||
entityLogEntries.addAll(addedLocalManualEntries.values());
|
||||
|
||||
|
||||
buildPendingDictionaryChanges(unprocessedManualRedactions).forEach(entityLogEntries::add);
|
||||
|
||||
int numberOfAddedPendingEntries = 0; // since list is dynamically growing we need to keep track of the number of added pending entries to ignore them in the loop
|
||||
@ -249,13 +237,7 @@ public class EntityLogMergeService {
|
||||
}
|
||||
|
||||
List<ManualChange> manualChanges = new ArrayList<>();
|
||||
manualChanges.add(ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.ADD)
|
||||
.requestedDate(manualRedactionEntry.getRequestDate())
|
||||
.processedDate(null)
|
||||
.userId(manualRedactionEntry.getUser())
|
||||
.propertyChanges(Map.of("value", manualRedactionEntry.getValue()))
|
||||
.build());
|
||||
manualChanges.add(ManualChangeFactory.toLocalManualChange(manualRedactionEntry));
|
||||
|
||||
List<Change> changes = new ArrayList<>();
|
||||
changes.add(Change.builder().analysisNumber(entityLog.getAnalysisNumber()).dateTime(manualRedactionEntry.getRequestDate()).type(ChangeType.ADDED).build());
|
||||
@ -320,14 +302,7 @@ public class EntityLogMergeService {
|
||||
entityLogEntry.setState(EntryState.IGNORED);
|
||||
entityLogEntry.getEngines().add(Engine.MANUAL);
|
||||
addChanges(entityLogEntry.getChanges(), ChangeType.REMOVED, analysisNumber, idRemoval.getRequestDate());
|
||||
entityLogEntry.getManualChanges()
|
||||
.add(ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.REMOVE)
|
||||
.requestedDate(idRemoval.getRequestDate())
|
||||
.processedDate(null)
|
||||
.userId(idRemoval.getUser())
|
||||
.propertyChanges(Collections.emptyMap())
|
||||
.build());
|
||||
entityLogEntry.getManualChanges().add(ManualChangeFactory.toLocalManualChange(idRemoval));
|
||||
}
|
||||
|
||||
|
||||
@ -339,15 +314,7 @@ public class EntityLogMergeService {
|
||||
entityLogEntry.setValue(manualResizeRedaction.getValue());
|
||||
entityLogEntry.getEngines().add(Engine.MANUAL);
|
||||
addChanges(entityLogEntry.getChanges(), ChangeType.CHANGED, analysisNumber, manualResizeRedaction.getRequestDate());
|
||||
ManualChange.ManualChangeBuilder manualChange = ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.RESIZE)
|
||||
.requestedDate(manualResizeRedaction.getRequestDate())
|
||||
.processedDate(null)
|
||||
.userId(manualResizeRedaction.getUser());
|
||||
if (!Strings.isNullOrEmpty(manualResizeRedaction.getValue())) {
|
||||
manualChange.propertyChanges(Map.of("value", manualResizeRedaction.getValue()));
|
||||
}
|
||||
entityLogEntry.getManualChanges().add(manualChange.build());
|
||||
entityLogEntry.getManualChanges().add(ManualChangeFactory.toLocalManualChange(manualResizeRedaction));
|
||||
}
|
||||
|
||||
|
||||
@ -357,124 +324,62 @@ public class EntityLogMergeService {
|
||||
}
|
||||
|
||||
|
||||
private void mergeLegalBasisChange(ManualLegalBasisChange manualLegalBasisChange,
|
||||
EntityLogEntry entityLogEntry,
|
||||
int analysisNumber) {
|
||||
@Deprecated(forRemoval = true)
|
||||
private void mergeLegalBasisChange(ManualLegalBasisChange manualLegalBasisChange, EntityLogEntry entityLogEntry, int analysisNumber) {
|
||||
|
||||
entityLogEntry.setLegalBasis(manualLegalBasisChange.getLegalBasis());
|
||||
entityLogEntry.setSection(manualLegalBasisChange.getSection());
|
||||
entityLogEntry.setValue(manualLegalBasisChange.getValue());
|
||||
entityLogEntry.getEngines().add(Engine.MANUAL);
|
||||
addChanges(entityLogEntry.getChanges(), ChangeType.CHANGED, analysisNumber, manualLegalBasisChange.getRequestDate());
|
||||
Map<String, String> propertyChanges = getPropertyChanges(manualLegalBasisChange);
|
||||
entityLogEntry.getManualChanges()
|
||||
.add(ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE)
|
||||
.requestedDate(manualLegalBasisChange.getRequestDate())
|
||||
.processedDate(null)
|
||||
.propertyChanges(propertyChanges)
|
||||
.userId(manualLegalBasisChange.getUser())
|
||||
.build());
|
||||
entityLogEntry.getManualChanges().add(ManualChangeFactory.toLocalManualChange(manualLegalBasisChange));
|
||||
}
|
||||
|
||||
|
||||
private Map<String, String> getPropertyChanges(ManualLegalBasisChange manualLegalBasisChange) {
|
||||
private EntityLogEntry mergeRecategorization(ManualRecategorization recategorization, EntityLogEntry entityLogEntry, DossierEntity dossier, int analysisNumber) {
|
||||
|
||||
Map<String, String> propertyChanges = new HashMap<>();
|
||||
if (!Strings.isNullOrEmpty(manualLegalBasisChange.getLegalBasis())) {
|
||||
propertyChanges.put("legalBasis", manualLegalBasisChange.getLegalBasis());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(manualLegalBasisChange.getValue())) {
|
||||
propertyChanges.put("value", manualLegalBasisChange.getValue());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(manualLegalBasisChange.getSection())) {
|
||||
propertyChanges.put("section", manualLegalBasisChange.getSection());
|
||||
}
|
||||
return propertyChanges;
|
||||
}
|
||||
if ((recategorization.getType() != null && !Objects.equals(recategorization.getType(), entityLogEntry.getType()) && Strings.isNullOrEmpty(recategorization.getLegalBasis()))//
|
||||
&& (entityLogEntry.getEntryType().equals(EntryType.IMAGE) || entityLogEntry.getEntryType().equals(EntryType.IMAGE_HINT))) {
|
||||
|
||||
|
||||
private EntityLogEntry mergeRecategorization(ManualRecategorization recategorization,
|
||||
EntityLogEntry entityLogEntry,
|
||||
DossierEntity dossier,
|
||||
int analysisNumber) {
|
||||
|
||||
if (entityLogEntry.getEntryType().equals(EntryType.IMAGE) || entityLogEntry.getEntryType().equals(EntryType.IMAGE_HINT)) {
|
||||
return pendingDictionaryEntryFactory.buildPendingImageRecategorizationEntry(recategorization, entityLogEntry);
|
||||
}
|
||||
|
||||
boolean isHint = isHint(recategorization.getType(), dossier);
|
||||
|
||||
if (!Strings.isNullOrEmpty(recategorization.getType())) {
|
||||
entityLogEntry.setType(recategorization.getType());
|
||||
}
|
||||
|
||||
entityLogEntry.setEntryType(getEntryType(isHint, recategorization.getType()));
|
||||
|
||||
entityLogEntry.getEngines().add(Engine.MANUAL);
|
||||
|
||||
if (recategorization.getType() != null && !recategorization.getType().equals(entityLogEntry.getType())) {
|
||||
entityLogEntry.setType(recategorization.getType());
|
||||
entityLogEntry.setEntryType(getEntryType(isHint, recategorization.getType()));
|
||||
entityLogEntry.setState(EntryState.SKIPPED);
|
||||
}
|
||||
|
||||
if (!Strings.isNullOrEmpty(recategorization.getLegalBasis())) {
|
||||
entityLogEntry.setLegalBasis(recategorization.getLegalBasis());
|
||||
entityLogEntry.setState(isHint ? EntryState.SKIPPED : EntryState.APPLIED);
|
||||
} else {
|
||||
entityLogEntry.setState(EntryState.SKIPPED);
|
||||
}
|
||||
|
||||
if (!Strings.isNullOrEmpty(recategorization.getSection())) {
|
||||
if (recategorization.getSection() != null) {
|
||||
entityLogEntry.setSection(recategorization.getSection());
|
||||
}
|
||||
|
||||
if (!Strings.isNullOrEmpty(recategorization.getValue())) {
|
||||
if (recategorization.getValue() != null) {
|
||||
entityLogEntry.setValue(recategorization.getValue());
|
||||
}
|
||||
|
||||
addChanges(entityLogEntry.getChanges(), ChangeType.CHANGED, analysisNumber, recategorization.getRequestDate());
|
||||
entityLogEntry.getManualChanges()
|
||||
.add(ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.RECATEGORIZE)
|
||||
.requestedDate(recategorization.getRequestDate())
|
||||
.processedDate(recategorization.getProcessedDate())
|
||||
.userId(recategorization.getUser())
|
||||
.propertyChanges(getPropertyChanges(recategorization))
|
||||
.build());
|
||||
entityLogEntry.getManualChanges().add(ManualChangeFactory.toLocalManualChange(recategorization));
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static Map<String, String> getPropertyChanges(ManualRecategorization recategorization) {
|
||||
|
||||
Map<String, String> propertyChanges = new HashMap<>();
|
||||
if (!Strings.isNullOrEmpty(recategorization.getType())) {
|
||||
propertyChanges.put("type", recategorization.getType());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(recategorization.getLegalBasis())) {
|
||||
propertyChanges.put("legalBasis", recategorization.getLegalBasis());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(recategorization.getSection())) {
|
||||
propertyChanges.put("section", recategorization.getSection());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(recategorization.getValue())) {
|
||||
propertyChanges.put("value", recategorization.getValue());
|
||||
}
|
||||
return propertyChanges;
|
||||
}
|
||||
|
||||
|
||||
private void mergeForceRedaction(ManualForceRedaction forceRedaction, EntityLogEntry entityLogEntry, int analysisNumber) {
|
||||
|
||||
entityLogEntry.setLegalBasis(forceRedaction.getLegalBasis());
|
||||
entityLogEntry.setState(entityLogEntry.getEntryType().equals(EntryType.HINT) ? EntryState.SKIPPED : EntryState.APPLIED);
|
||||
entityLogEntry.getEngines().add(Engine.MANUAL);
|
||||
addChanges(entityLogEntry.getChanges(), ChangeType.CHANGED, analysisNumber, forceRedaction.getRequestDate());
|
||||
var forceRedactManualChange = ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.FORCE)
|
||||
.requestedDate(forceRedaction.getRequestDate())
|
||||
.processedDate(forceRedaction.getProcessedDate())
|
||||
.userId(forceRedaction.getUser());
|
||||
if (forceRedaction.getLegalBasis() != null && !forceRedaction.getLegalBasis().isEmpty()) {
|
||||
forceRedactManualChange.propertyChanges(Map.of("legalBasis", forceRedaction.getLegalBasis()));
|
||||
}
|
||||
entityLogEntry.getManualChanges().add(forceRedactManualChange.build());
|
||||
entityLogEntry.getManualChanges().add(ManualChangeFactory.toLocalManualChange(forceRedaction));
|
||||
}
|
||||
|
||||
|
||||
@ -535,24 +440,4 @@ public class EntityLogMergeService {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
public void sendToAnalyseQueue(String fileId, DossierEntity dossier, FileModel fileModel, ManualRedactions manualRedactions) {
|
||||
|
||||
var fileEntity = fileStatusPersistenceService.getStatus(fileId);
|
||||
var analyseRequest = AnalyzeRequest.builder()
|
||||
.messageType(MessageType.SURROUNDING_TEXT_ANALYSIS)
|
||||
.dossierId(dossier.getId())
|
||||
.analysisNumber(fileModel.getNumberOfAnalyses() + 1)
|
||||
.sectionsToReanalyse(Sets.newHashSet())
|
||||
.fileId(fileId)
|
||||
.manualRedactions(manualRedactions)
|
||||
.dossierTemplateId(dossier.getDossierTemplateId())
|
||||
.lastProcessed(fileModel.getLastProcessed())
|
||||
.fileAttributes(fileStatusService.convertAttributes(fileEntity.getFileAttributes(), dossier.getDossierTemplateId()))
|
||||
.build();
|
||||
|
||||
log.info("Sending Surrounding Text Analysis for unprocessed manual redactions: {} for file: {} ", manualRedactions, fileId);
|
||||
rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_QUEUE, analyseRequest);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -68,19 +68,19 @@ public class ManualRedactionDictionaryUpdateHandler {
|
||||
ManualRequestWithAddToDictionary manualRequestWithAddToDictionary,
|
||||
Set<String> typeIdsOfModifiedDictionaries) {
|
||||
|
||||
List<DictionaryEntry> dictionaryEntriesToUnDelete = dictionaryManagementService.getAllEntriesInDossierTemplate(manualRequestWithAddToDictionary.getDossierTemplateTypeId(),
|
||||
List<DictionaryEntry> dictionaryEntriesToUnDelete = dictionaryManagementService.getAllEntriesInDossierTemplate(manualRequestWithAddToDictionary.getDictionaryTypeId(),
|
||||
value,
|
||||
manualRequestWithAddToDictionary.getDictionaryEntryType());
|
||||
dictionaryEntriesToUnDelete.forEach(entry -> {
|
||||
typeIdsOfModifiedDictionaries.add(entry.getTypeId());
|
||||
addToDictionary(entry.getTypeId(), value, manualRequestWithAddToDictionary.getDossierId(), fileId, manualRequestWithAddToDictionary.getDictionaryEntryType());
|
||||
});
|
||||
addToDictionary(manualRequestWithAddToDictionary.getDossierTemplateTypeId(),
|
||||
addToDictionary(manualRequestWithAddToDictionary.getDictionaryTypeId(),
|
||||
value,
|
||||
manualRequestWithAddToDictionary.getDossierId(),
|
||||
fileId,
|
||||
manualRequestWithAddToDictionary.getDictionaryEntryType());
|
||||
typeIdsOfModifiedDictionaries.add(manualRequestWithAddToDictionary.getDossierTemplateTypeId());
|
||||
typeIdsOfModifiedDictionaries.add(manualRequestWithAddToDictionary.getDictionaryTypeId());
|
||||
return typeIdsOfModifiedDictionaries;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ public class ManualRedactionDictionaryUpdateHandler {
|
||||
ManualRequestWithAddToDictionary manualRequestWithAddToDictionary,
|
||||
Set<String> typeIdsOfModifiedDictionaries) {
|
||||
|
||||
String dossierDictionaryTypeId = manualRequestWithAddToDictionary.getDossierTemplateTypeId() + ":" + manualRequestWithAddToDictionary.getDossierId();
|
||||
String dossierDictionaryTypeId = manualRequestWithAddToDictionary.getDictionaryTypeId() + ":" + manualRequestWithAddToDictionary.getDossierId();
|
||||
addToDictionary(dossierDictionaryTypeId, value, manualRequestWithAddToDictionary.getDossierId(), fileId, manualRequestWithAddToDictionary.getDictionaryEntryType());
|
||||
typeIdsOfModifiedDictionaries.add(dossierDictionaryTypeId);
|
||||
return typeIdsOfModifiedDictionaries;
|
||||
@ -252,7 +252,7 @@ public class ManualRedactionDictionaryUpdateHandler {
|
||||
if (addRedactionRequest.isAddToDictionary()) {
|
||||
if (addRedactionRequest.isAddToAllDossiers()) {
|
||||
// validate add to dossier template dictionaries
|
||||
dictionaryManagementService.validateAddRemoveToDossierTemplateDictionary(addRedactionRequest.getDossierTemplateTypeId());
|
||||
dictionaryManagementService.validateAddRemoveToDossierTemplateDictionary(addRedactionRequest.getDictionaryTypeId());
|
||||
}
|
||||
validateDictionary(addRedactionRequest, value);
|
||||
}
|
||||
@ -265,9 +265,9 @@ public class ManualRedactionDictionaryUpdateHandler {
|
||||
if (!addRedactionRequest.isForceAddToDictionary() && stopwordService.isStopword(value)) {
|
||||
throw new ConflictException("The entry you are trying to add is a stopword");
|
||||
}
|
||||
dictionaryPersistenceService.getType(addRedactionRequest.getDossierTemplateTypeId());
|
||||
dictionaryPersistenceService.getType(addRedactionRequest.getDictionaryTypeId());
|
||||
} catch (NotFoundException e) {
|
||||
throw new BadRequestException("Invalid type: " + addRedactionRequest.getDossierTemplateTypeId());
|
||||
throw new BadRequestException("Invalid type: " + addRedactionRequest.getDictionaryTypeId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -5,12 +5,14 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ty
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRecategorizationEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine;
|
||||
@ -61,7 +63,7 @@ public class ManualRedactionMapper {
|
||||
.value(StringCleaningUtility.cleanString(addRedactionRequest.getValue()))
|
||||
.legalBasis(addRedactionRequest.getLegalBasis())
|
||||
.user(KeycloakSecurity.getUserId())
|
||||
.dossierTemplateTypeId(toTypeId(addRedactionRequest.getType(), dossierTemplateId))
|
||||
.dictionaryTypeId(toTypeId(addRedactionRequest.getType(), dossierTemplateId))
|
||||
.reason(addRedactionRequest.getReason())
|
||||
.addToDictionary(addRedactionRequest.isAddToDictionary())
|
||||
.comment(addRedactionRequest.getComment() != null ? addRedactionRequest.getComment().getText() : null)
|
||||
@ -137,6 +139,7 @@ public class ManualRedactionMapper {
|
||||
}
|
||||
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
public List<LegalBasisChangeRequest> toLegalBasisChangeRequestList(String dossierId,
|
||||
String fileId,
|
||||
Set<LegalBasisChangeRequestModel> legalBasisChangeRequests,
|
||||
@ -181,6 +184,24 @@ public class ManualRedactionMapper {
|
||||
for (RecategorizationRequestModel recategorizationRequest : recategorizationRequests) {
|
||||
|
||||
EntityLogEntry entityLogEntry = getEntityLogEntry(entityLog, recategorizationRequest.getAnnotationId());
|
||||
|
||||
String changedValue;
|
||||
String changedTypeId;
|
||||
|
||||
if (recategorizationRequest.isAddToDictionary() || recategorizationRequest.isAddToAllDossiers()) {
|
||||
changedValue = recategorizationRequest.getValue();
|
||||
changedTypeId = toTypeId(recategorizationRequest.getType(), dossierTemplateId);
|
||||
} else {
|
||||
changedValue = Objects.equals(recategorizationRequest.getValue(), entityLogEntry.getValue()) ? null : recategorizationRequest.getValue();
|
||||
changedTypeId = Objects.equals(recategorizationRequest.getType(), entityLogEntry.getType()) ? null : toTypeId(recategorizationRequest.getType(), dossierTemplateId);
|
||||
}
|
||||
|
||||
String changedLegalBasis = Objects.equals(recategorizationRequest.getLegalBasis(), entityLogEntry.getLegalBasis()) ? null : recategorizationRequest.getLegalBasis();
|
||||
String changedSection = Objects.equals(recategorizationRequest.getSection(), entityLogEntry.getSection()) ? null : recategorizationRequest.getSection();
|
||||
|
||||
checkLegalBasisLength(changedLegalBasis);
|
||||
checkSectionLength(changedSection);
|
||||
|
||||
RecategorizationRequest request = RecategorizationRequest.builder()
|
||||
.annotationId(recategorizationRequest.getAnnotationId())
|
||||
.user(KeycloakSecurity.getUserId())
|
||||
@ -190,12 +211,11 @@ public class ManualRedactionMapper {
|
||||
.addToDictionary(recategorizationRequest.isAddToDictionary())
|
||||
.addToAllDossiers(recategorizationRequest.isAddToAllDossiers())
|
||||
.dictionaryEntryType(getDictionaryEntryType(entityLogEntry))
|
||||
.value(recategorizationRequest.getValue())
|
||||
.typeToRemove(entityLogEntry.getType())
|
||||
.dossierTemplateTypeId(toTypeId(recategorizationRequest.getType(), dossierTemplateId))
|
||||
.legalBasis(Optional.ofNullable(recategorizationRequest.getLegalBasis())
|
||||
.orElse(""))
|
||||
.section(recategorizationRequest.getSection())
|
||||
.value(changedValue)
|
||||
.dictionaryTypeId(changedTypeId)
|
||||
.legalBasis(changedLegalBasis)
|
||||
.section(changedSection)
|
||||
.build();
|
||||
|
||||
if (!entityLogEntry.getEngines().contains(Engine.MANUAL)
|
||||
@ -212,6 +232,33 @@ public class ManualRedactionMapper {
|
||||
}
|
||||
|
||||
|
||||
private void checkSectionLength(String changedSection) {
|
||||
|
||||
if (changedSection == null) {
|
||||
return;
|
||||
}
|
||||
if (changedSection.length() > ManualRecategorizationEntity.MAX_SECTION_LENGTH) {
|
||||
|
||||
throw new BadRequestException(String.format("The section is too long (%s), max length %s", changedSection.length(), ManualRecategorizationEntity.MAX_SECTION_LENGTH));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void checkLegalBasisLength(String legalBasis) {
|
||||
|
||||
if (legalBasis == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (legalBasis.length() > ManualRecategorizationEntity.MAX_LEGAL_BASIS_LENGTH) {
|
||||
throw new BadRequestException(String.format("The legal basis is too long (%s), max length %s",
|
||||
legalBasis.length(),
|
||||
ManualRecategorizationEntity.MAX_LEGAL_BASIS_LENGTH));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<ResizeRedactionRequest> toResizeRedactionRequestList(Set<ResizeRedactionRequestModel> resizeRedactionRequests,
|
||||
EntityLog entityLog,
|
||||
Consumer<EntityLogEntry> entityLogEntryConsumer) {
|
||||
|
||||
@ -12,16 +12,20 @@ import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.hash.HashFunction;
|
||||
import com.google.common.hash.Hashing;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRecategorizationEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRedactionEntryEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualResizeRedactionEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.RectangleEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.model.ManualChangesQueryOptions;
|
||||
@ -40,6 +44,8 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
|
||||
import com.iqser.red.service.persistence.management.v1.processor.utils.ManualRedactionEntryMapper;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.utils.ManualResizeRedactionMapper;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.utils.TypeIdUtils;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.MessageType;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
||||
@ -94,8 +100,7 @@ public class ManualRedactionService {
|
||||
EntityLogMergeService entityLogMergeService;
|
||||
FileStatusPersistenceService fileStatusPersistenceService;
|
||||
ManualRedactionMapper manualRedactionMapper;
|
||||
|
||||
private static final int MAX_LEGAL_BASIS_LENGTH = 4000;
|
||||
RabbitTemplate rabbitTemplate;
|
||||
|
||||
|
||||
@Transactional
|
||||
@ -133,7 +138,7 @@ public class ManualRedactionService {
|
||||
FileModel fileStatus = fileStatusService.getStatus(fileId);
|
||||
if (!localManualRedactionEntryEntities.isEmpty() && fileStatus.isExcludedFromAutomaticAnalysis()) {
|
||||
ManualRedactions manualRedactions = ManualRedactions.builder().entriesToAdd(convertEntriesToAdd(localManualRedactionEntryEntities)).build();
|
||||
entityLogMergeService.sendToAnalyseQueue(fileId, dossierEntity, fileStatusService.getStatus(fileId), manualRedactions);
|
||||
sendToSurroundingTextAnalysisQueue(fileId, dossierEntity, fileStatusService.getStatus(fileId), manualRedactions);
|
||||
} else {
|
||||
reprocess(dossierId, fileId);
|
||||
}
|
||||
@ -222,6 +227,7 @@ public class ManualRedactionService {
|
||||
}
|
||||
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Transactional
|
||||
public List<ManualAddResponse> addLegalBasisChange(String dossierId, String fileId, Set<LegalBasisChangeRequestModel> legalBasisChangeRequests) {
|
||||
|
||||
@ -233,8 +239,6 @@ public class ManualRedactionService {
|
||||
getEntityLogEntryConsumer(fileId));
|
||||
|
||||
for (var legalBasisChangeRequest : requests) {
|
||||
checkLegalBasisLength(legalBasisChangeRequest.getLegalBasis());
|
||||
|
||||
legalBasisChangePersistenceService.insert(fileId, legalBasisChangeRequest);
|
||||
|
||||
Long commentId = commentService.addCommentAndGetId(fileId,
|
||||
@ -273,9 +277,7 @@ public class ManualRedactionService {
|
||||
recategorizationRequest.getTypeToRemove(),
|
||||
recategorizationRequest.getDossierTemplateId());
|
||||
|
||||
checkLegalBasisLength(recategorizationRequest.getLegalBasis());
|
||||
|
||||
recategorizationPersistenceService.insert(fileId, recategorizationRequest);
|
||||
ManualRecategorizationEntity recategorizationEntity = recategorizationPersistenceService.createOrUpdate(fileId, recategorizationRequest);
|
||||
|
||||
Set<String> typeIdsOfDictionariesWithAdd = manualRedactionDictionaryUpdateHandler.handleAddToDictionaryAndReturnModifiedTypeIds(fileId,
|
||||
recategorizationRequest.getValue(),
|
||||
@ -283,11 +285,9 @@ public class ManualRedactionService {
|
||||
|
||||
Set<String> typeIdsOfDictionariesWithDelete = manualRedactionDictionaryUpdateHandler.handleRemoveFromDictionaryAndReturnModifiedTypeIds(fileId,
|
||||
recategorizationRequest);
|
||||
recategorizationEntity.setTypeIdsOfDictionariesWithAdd(typeIdsOfDictionariesWithAdd);
|
||||
recategorizationEntity.setTypeIdsOfDictionariesWithDelete(typeIdsOfDictionariesWithDelete);
|
||||
|
||||
recategorizationPersistenceService.updateModifiedDictionaries(fileId,
|
||||
recategorizationRequest.getAnnotationId(),
|
||||
typeIdsOfDictionariesWithAdd,
|
||||
typeIdsOfDictionariesWithDelete);
|
||||
|
||||
Long commentId = commentService.addCommentAndGetId(fileId,
|
||||
recategorizationRequest.getAnnotationId(),
|
||||
@ -295,6 +295,7 @@ public class ManualRedactionService {
|
||||
recategorizationRequest.getUser());
|
||||
|
||||
response.add(ManualAddResponse.builder().annotationId(recategorizationRequest.getAnnotationId()).commentId(commentId).build());
|
||||
recategorizationPersistenceService.saveAndFlush(recategorizationEntity);
|
||||
}
|
||||
|
||||
reprocess(dossierId, fileId);
|
||||
@ -305,14 +306,6 @@ public class ManualRedactionService {
|
||||
}
|
||||
|
||||
|
||||
private void checkLegalBasisLength(String legalBasis) {
|
||||
|
||||
if (legalBasis.length() > MAX_LEGAL_BASIS_LENGTH) {
|
||||
throw new BadRequestException(String.format("The legal basis is too long (%s), max length %s", legalBasis.length(), MAX_LEGAL_BASIS_LENGTH));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
@Observed(name = "ManualRedactionService", contextualName = "add-manual-redaction")
|
||||
public List<ManualAddResponse> addResizeRedaction(String dossierId, String fileId, Set<ResizeRedactionRequestModel> resizeRedactionRequests, boolean includeUnprocessed) {
|
||||
@ -354,7 +347,7 @@ public class ManualRedactionService {
|
||||
FileModel fileStatus = fileStatusService.getStatus(fileId);
|
||||
if (!manualResizeRedactionEntities.isEmpty() && fileStatus.isExcludedFromAutomaticAnalysis()) {
|
||||
ManualRedactions manualRedactions = ManualRedactions.builder().resizeRedactions(convertResizeRedactions(manualResizeRedactionEntities)).build();
|
||||
entityLogMergeService.sendToAnalyseQueue(fileId, dossierPersistenceService.getAndValidateDossier(dossierId), fileStatusService.getStatus(fileId), manualRedactions);
|
||||
sendToSurroundingTextAnalysisQueue(fileId, dossierPersistenceService.getAndValidateDossier(dossierId), fileStatusService.getStatus(fileId), manualRedactions);
|
||||
} else {
|
||||
reprocess(dossierId, fileId);
|
||||
}
|
||||
@ -542,15 +535,23 @@ public class ManualRedactionService {
|
||||
}
|
||||
|
||||
|
||||
public LegalBasisChangeRequestModel convertRecategorizationToLegalBasisChange(RecategorizationRequestModel recategorizationRequestModel) {
|
||||
private void sendToSurroundingTextAnalysisQueue(String fileId, DossierEntity dossier, FileModel fileModel, ManualRedactions manualRedactions) {
|
||||
|
||||
return MagicConverter.convert(recategorizationRequestModel, LegalBasisChangeRequestModel.class);
|
||||
}
|
||||
var fileEntity = fileStatusPersistenceService.getStatus(fileId);
|
||||
var analyseRequest = AnalyzeRequest.builder()
|
||||
.messageType(MessageType.SURROUNDING_TEXT_ANALYSIS)
|
||||
.dossierId(dossier.getId())
|
||||
.analysisNumber(fileModel.getNumberOfAnalyses() + 1)
|
||||
.sectionsToReanalyse(Sets.newHashSet())
|
||||
.fileId(fileId)
|
||||
.manualRedactions(manualRedactions)
|
||||
.dossierTemplateId(dossier.getDossierTemplateId())
|
||||
.lastProcessed(fileModel.getLastProcessed())
|
||||
.fileAttributes(fileStatusService.convertAttributes(fileEntity.getFileAttributes(), dossier.getDossierTemplateId()))
|
||||
.build();
|
||||
|
||||
|
||||
public boolean isLegalBasisChangeRequest(RecategorizationRequestModel requestModel, EntityLogEntry entry) {
|
||||
|
||||
return !ObjectUtils.isEmpty(requestModel.getLegalBasis()) && !requestModel.getLegalBasis().equals(entry.getLegalBasis());
|
||||
log.info("Sending Surrounding Text Analysis for unprocessed manual redactions: {} for file: {} ", manualRedactions, fileId);
|
||||
rabbitTemplate.convertAndSend(MessagingConfiguration.REDACTION_PRIORITY_QUEUE, analyseRequest);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -12,7 +12,6 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@ -188,17 +187,17 @@ public class ManualRedactionUndoService {
|
||||
|
||||
deleteRecategorization(dossierId, fileId, manualRecategorizations, includeUnprocessed);
|
||||
manualRecategorizations.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder()
|
||||
.userId(KeycloakSecurity.getUserId())
|
||||
.objectId(fileId)
|
||||
.category(AuditCategory.DOCUMENT.name())
|
||||
.message("Undo of manual recategorization was done.")
|
||||
.details(Map.of(DOSSIER_ID,
|
||||
dossierId,
|
||||
FILE_ID,
|
||||
fileId,
|
||||
ANNOTATION_ID,
|
||||
annotationId))
|
||||
.build()));
|
||||
.userId(KeycloakSecurity.getUserId())
|
||||
.objectId(fileId)
|
||||
.category(AuditCategory.DOCUMENT.name())
|
||||
.message("Undo of manual recategorization was done.")
|
||||
.details(Map.of(DOSSIER_ID,
|
||||
dossierId,
|
||||
FILE_ID,
|
||||
fileId,
|
||||
ANNOTATION_ID,
|
||||
annotationId))
|
||||
.build()));
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,8 +216,10 @@ public class ManualRedactionUndoService {
|
||||
fileId,
|
||||
dossierId,
|
||||
recategorizationEntity.getTypeIdsOfDictionariesWithAdd());
|
||||
recategorizationPersistenceService.updateModifiedDictionaries(fileId, annotationId, Collections.emptySet(), Collections.emptySet());
|
||||
recategorizationPersistenceService.softDelete(fileId, annotationId, OffsetDateTime.now());
|
||||
recategorizationEntity.setTypeIdsOfDictionariesWithAdd(Collections.emptySet());
|
||||
recategorizationEntity.setTypeIdsOfDictionariesWithDelete(Collections.emptySet());
|
||||
recategorizationEntity.setSoftDeletedTime(OffsetDateTime.now());
|
||||
recategorizationPersistenceService.saveAndFlush(recategorizationEntity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -9,13 +9,13 @@ import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogMergeService;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Engine;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
|
||||
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.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.model.analysislog.entitylog.Position;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualChangeFactory;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||
@ -206,16 +206,9 @@ public class PendingDictionaryEntryFactory {
|
||||
}
|
||||
|
||||
|
||||
|
||||
public EntityLogEntry buildPendingImageRecategorizationEntry(ManualRecategorization manualChange, EntityLogEntry originalEntry) {
|
||||
|
||||
var manualChanges = List.of(ManualChange.builder()
|
||||
.manualRedactionType(ManualRedactionType.RECATEGORIZE)
|
||||
.requestedDate(manualChange.getRequestDate())
|
||||
.processedDate(manualChange.getProcessedDate())
|
||||
.userId(manualChange.getUser())
|
||||
.propertyChanges(EntityLogMergeService.getPropertyChanges(manualChange))
|
||||
.build());
|
||||
var manualChanges = List.of(ManualChangeFactory.toLocalManualChange(manualChange));
|
||||
|
||||
String reason = String.format("Image has been recategorized from %s to %s", originalEntry.getType(), manualChange.getType());
|
||||
|
||||
|
||||
@ -39,7 +39,7 @@ public class AddRedactionPersistenceService {
|
||||
BeanUtils.copyProperties(addRedactionRequest, manualRedactionEntry);
|
||||
manualRedactionEntry.setRequestDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||
manualRedactionEntry.setPositions(convert(addRedactionRequest.getPositions()));
|
||||
manualRedactionEntry.setTypeId(addRedactionRequest.getDossierTemplateTypeId());
|
||||
manualRedactionEntry.setTypeId(addRedactionRequest.getDictionaryTypeId());
|
||||
manualRedactionEntry.setDictionaryEntryType(addRedactionRequest.getDictionaryEntryType());
|
||||
manualRedactionEntry.setSection(addRedactionRequest.getSection());
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
|
||||
@ -5,14 +5,11 @@ import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualRecategorizationEntity;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.model.ManualChangesQueryOptions;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RecategorizationRepository;
|
||||
@ -26,42 +23,40 @@ import lombok.extern.slf4j.Slf4j;
|
||||
@RequiredArgsConstructor
|
||||
public class RecategorizationPersistenceService {
|
||||
|
||||
private final int SECTION_MAX_LENGTH = 1024;
|
||||
|
||||
private final RecategorizationRepository recategorizationRepository;
|
||||
|
||||
|
||||
public void insert(String fileId, RecategorizationRequest recategorizationRequest) {
|
||||
public ManualRecategorizationEntity createOrUpdate(String fileId, RecategorizationRequest request) {
|
||||
|
||||
ManualRecategorizationEntity manualRecategorization = new ManualRecategorizationEntity();
|
||||
manualRecategorization.setId(new AnnotationEntityId(recategorizationRequest.getAnnotationId(), fileId));
|
||||
checkSection(recategorizationRequest.getSection());
|
||||
BeanUtils.copyProperties(recategorizationRequest, manualRecategorization);
|
||||
manualRecategorization.setRequestDate(OffsetDateTime.now());
|
||||
manualRecategorization.setTypeId(recategorizationRequest.getDossierTemplateTypeId());
|
||||
recategorizationRepository.saveAndFlush(manualRecategorization);
|
||||
AnnotationEntityId id = new AnnotationEntityId(request.getAnnotationId(), fileId);
|
||||
|
||||
}
|
||||
ManualRecategorizationEntity entity = recategorizationRepository.findById(id)
|
||||
.orElse(ManualRecategorizationEntity.builder().id(id).build());
|
||||
|
||||
entity.setUser(request.getUser());
|
||||
|
||||
private void checkSection(String section) {
|
||||
|
||||
if (!StringUtils.isEmpty(section) && section.length() > SECTION_MAX_LENGTH) {
|
||||
throw new BadRequestException(String.format("The section is too long (%s), max length %s", section.length(), SECTION_MAX_LENGTH));
|
||||
if (request.getDictionaryTypeId() != null) {
|
||||
entity.setTypeId(request.getDictionaryTypeId());
|
||||
}
|
||||
}
|
||||
|
||||
entity.setRequestDate(OffsetDateTime.now());
|
||||
entity.setPage(request.getPage());
|
||||
entity.setAddToDictionary(request.isAddToDictionary());
|
||||
entity.setAddToAllDossiers(request.isAddToAllDossiers());
|
||||
|
||||
@Transactional
|
||||
public void updateModifiedDictionaries(String fileId, String annotationId, Set<String> typeIdsOfDictionaryWithAdd, Set<String> typeIdsOfDictionaryWithDelete) {
|
||||
if (request.getLegalBasis() != null) {
|
||||
entity.setLegalBasis(request.getLegalBasis());
|
||||
}
|
||||
|
||||
ManualRecategorizationEntity addRedaction = recategorizationRepository.findById(new AnnotationEntityId(annotationId, fileId))
|
||||
.orElseThrow(() -> new NotFoundException("Unknown file/annotation combination: " + fileId + "/" + annotationId));
|
||||
if (request.getSection() != null) {
|
||||
entity.setSection(request.getSection());
|
||||
}
|
||||
|
||||
addRedaction.setTypeIdsOfDictionariesWithAdd(typeIdsOfDictionaryWithAdd);
|
||||
addRedaction.setTypeIdsOfDictionariesWithDelete(typeIdsOfDictionaryWithDelete);
|
||||
|
||||
recategorizationRepository.saveAndFlush(addRedaction);
|
||||
if (request.getValue() != null) {
|
||||
entity.setValue(request.getValue());
|
||||
}
|
||||
entity.setProcessedDate(null);
|
||||
return entity;
|
||||
}
|
||||
|
||||
|
||||
@ -117,4 +112,11 @@ public class RecategorizationPersistenceService {
|
||||
recategorizationRepository.markAsProcessed(new AnnotationEntityId(annotationId, fileId), OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public void saveAndFlush(ManualRecategorizationEntity recategorizationEntity) {
|
||||
|
||||
recategorizationRepository.saveAndFlush(recategorizationEntity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ import org.springframework.data.repository.query.Param;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.AnnotationEntityId;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.ManualLegalBasisChangeEntity;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
public interface LegalBasisChangeRepository extends JpaRepository<ManualLegalBasisChangeEntity, AnnotationEntityId>, AnnotationEntityRepository {
|
||||
|
||||
@Modifying
|
||||
|
||||
@ -10,7 +10,9 @@ public class ManualRecategorizationMapper implements BiConsumer<ManualRecategori
|
||||
@Override
|
||||
public void accept(ManualRecategorizationEntity manualRecategorizationEntity, ManualRecategorization manualRedactionEntry) {
|
||||
|
||||
manualRedactionEntry.setType(manualRecategorizationEntity.getTypeId().substring(0, manualRecategorizationEntity.getTypeId().indexOf(":")));
|
||||
if (manualRecategorizationEntity.getTypeId() != null) {
|
||||
manualRedactionEntry.setType(manualRecategorizationEntity.getTypeId().substring(0, manualRecategorizationEntity.getTypeId().indexOf(":")));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -197,3 +197,5 @@ databaseChangeLog:
|
||||
file: db/changelog/tenant/124-create-migration-required-status-for-each-present-file.yaml
|
||||
- include:
|
||||
file: db/changelog/tenant/sql/207-acl-migration-cleanup.sql
|
||||
- include:
|
||||
file: db/changelog/tenant/125-drop-not-null-for-legal-basis-in-manual-recategorization.yaml
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
databaseChangeLog:
|
||||
- changeSet:
|
||||
id: drop-not-null-for-legal-basis-in-manual-recategorization.yaml
|
||||
author: kilian
|
||||
changes:
|
||||
- dropNotNullConstraint:
|
||||
tableName: manual_recategorization
|
||||
columnName: legal_basis
|
||||
@ -96,11 +96,7 @@ public class EntityLogMergeTest {
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
|
||||
entityLogMergeService = new EntityLogMergeService(dictionaryPersistenceService,
|
||||
rabbitTemplate,
|
||||
fileStatusService,
|
||||
fileStatusPersistenceService,
|
||||
new PendingDictionaryEntryFactory());
|
||||
entityLogMergeService = new EntityLogMergeService(dictionaryPersistenceService, new PendingDictionaryEntryFactory());
|
||||
}
|
||||
|
||||
|
||||
@ -249,7 +245,13 @@ public class EntityLogMergeTest {
|
||||
String entryLegalBasisId = UUID.randomUUID().toString();
|
||||
String forceRedactionId = UUID.randomUUID().toString();
|
||||
|
||||
ManualRedactions manualRedactions = provideManualRedactions(entryLegalBasisId, entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId, fileId, rectangleToAddId);
|
||||
ManualRedactions manualRedactions = provideManualRedactions(entryLegalBasisId,
|
||||
entryToRemoveId,
|
||||
entryToResizeId,
|
||||
entryLegalBasisId,
|
||||
forceRedactionId,
|
||||
fileId,
|
||||
rectangleToAddId);
|
||||
|
||||
var entityLog = provideEntityLog(entryToRemoveId, entryToResizeId, entryLegalBasisId, forceRedactionId, true);
|
||||
|
||||
|
||||
@ -434,7 +434,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
||||
.annotationId(annotationId)
|
||||
.comment("comment")
|
||||
.type("new-type")
|
||||
.legalBasis("")
|
||||
.legalBasis(null)
|
||||
.section("section")
|
||||
.build()),
|
||||
false);
|
||||
|
||||
@ -4,8 +4,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.utils.Ty
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
@ -22,7 +21,6 @@ import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.testcontainers.shaded.org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient;
|
||||
@ -39,7 +37,6 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryManagementService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService;
|
||||
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.FileStatusPersistenceService;
|
||||
import com.iqser.red.service.persistence.management.v1.processor.service.redactionlog.RedactionRequest;
|
||||
@ -55,7 +52,10 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
|
||||
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.Position;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest;
|
||||
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.Rectangle;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
|
||||
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.type.DictionaryEntryType;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel;
|
||||
@ -118,9 +118,6 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
@Autowired
|
||||
private FileProcessingClient fileProcessingClient;
|
||||
|
||||
@Autowired
|
||||
private ManualRedactionService manualRedactionService;
|
||||
|
||||
|
||||
@Test
|
||||
public void testRemoveToDossierTemplateWithDossierDictionaryOnlyTrue() {
|
||||
@ -153,7 +150,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
|
||||
when(entityLogService.getEntityLog(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyBoolean())).thenReturn(entityLog);
|
||||
|
||||
assertThrows(FeignException.Forbidden.class,
|
||||
Assertions.assertThrows(FeignException.Forbidden.class,
|
||||
() -> manualRedactionClient.removeRedactionBulk(dossier.getId(),
|
||||
file.getId(),
|
||||
Set.of(RemoveRedactionRequestModel.builder()
|
||||
@ -178,7 +175,7 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
|
||||
var type = typeProvider.testAndProvideType(dossierTemplate, null, "type", true);
|
||||
assertThat(type.isDossierDictionaryOnly()).isTrue();
|
||||
assertThrows(FeignException.Forbidden.class, () ->
|
||||
Assertions.assertThrows(FeignException.Forbidden.class, () ->
|
||||
|
||||
manualRedactionClient.addRedactionBulk(dossier.getId(),
|
||||
file.getId(),
|
||||
@ -1961,12 +1958,11 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
assertThatThrownBy(() -> manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModelLongLegalBasis), false)
|
||||
.get(0)).isInstanceOf(FeignException.class).hasMessageContaining("The legal basis is too long");
|
||||
|
||||
assertEquals("",
|
||||
allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.filter(manualRecategorization -> manualRecategorization.getAnnotationId().equals("annotationId3"))
|
||||
.findFirst()
|
||||
.get().getLegalBasis());
|
||||
assertNull(allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.filter(manualRecategorization -> manualRecategorization.getAnnotationId().equals("annotationId3"))
|
||||
.findFirst()
|
||||
.get().getLegalBasis());
|
||||
|
||||
}
|
||||
|
||||
@ -2100,47 +2096,22 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
.addToDictionary(false)
|
||||
.addToAllDossiers(false)
|
||||
.legalBasis("lb2")
|
||||
.section("section")
|
||||
.section("overriddenSection")
|
||||
.build();
|
||||
|
||||
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recatModel), false);
|
||||
|
||||
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
|
||||
assertEquals(1, allManualRedactions.getLegalBasisChanges().size());
|
||||
assertTrue(allManualRedactions.getLegalBasisChanges()
|
||||
assertEquals(1, allManualRedactions.getRecategorizations().size());
|
||||
assertTrue(allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.anyMatch(entry -> entry.getAnnotationId().equals("annotationId")));
|
||||
assertTrue(allManualRedactions.getLegalBasisChanges()
|
||||
assertTrue(allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.anyMatch(entry -> entry.getLegalBasis().equals("lb2")));
|
||||
assertTrue(allManualRedactions.getLegalBasisChanges()
|
||||
assertTrue(allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.anyMatch(entry -> entry.getSection().equals("section")));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testConvertRecategorizeToLegalBasisChange() {
|
||||
|
||||
RecategorizationRequestModel r = RecategorizationRequestModel.builder()
|
||||
.annotationId("id")
|
||||
.type("type 1")
|
||||
.comment("Kommi")
|
||||
.addToDictionary(false)
|
||||
.addToAllDossiers(false)
|
||||
.section("here")
|
||||
.legalBasis("some legal basis")
|
||||
.value("val")
|
||||
.build();
|
||||
|
||||
LegalBasisChangeRequestModel l = manualRedactionService.convertRecategorizationToLegalBasisChange(r);
|
||||
|
||||
assertEquals(r.getAnnotationId(), l.getAnnotationId());
|
||||
assertEquals(r.getComment(), l.getComment());
|
||||
assertEquals(r.getLegalBasis(), l.getLegalBasis());
|
||||
assertEquals(r.getSection(), l.getSection());
|
||||
assertEquals(r.getValue(), l.getValue());
|
||||
|
||||
.anyMatch(entry -> entry.getSection().equals("overriddenSection")));
|
||||
}
|
||||
|
||||
|
||||
@ -2203,9 +2174,13 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
.value("Image:Other")
|
||||
.build();
|
||||
|
||||
var resp = manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false);
|
||||
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false);
|
||||
|
||||
System.out.println(resp);
|
||||
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
|
||||
|
||||
assertTrue(allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.anyMatch(manualRecategorization -> manualRecategorization.getType().equals(typeLogo.getType())));
|
||||
|
||||
}
|
||||
|
||||
@ -2269,9 +2244,13 @@ public class ManualRedactionTest extends AbstractPersistenceServerServiceTest {
|
||||
.value("Ranya Eikenboom")
|
||||
.build();
|
||||
|
||||
var resp = manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false);
|
||||
manualRedactionClient.recategorizeBulk(dossier.getId(), file.getId(), Set.of(recategorizationRequestModel), false);
|
||||
|
||||
System.out.println(resp);
|
||||
var allManualRedactions = manualRedactionClient.getManualRedactions(dossier.getId(), file.getId(), false, true);
|
||||
|
||||
assertTrue(allManualRedactions.getRecategorizations()
|
||||
.stream()
|
||||
.anyMatch(manualRecategorization -> manualRecategorization.getLegalBasis().equals(recategorizationRequestModel.getLegalBasis())));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -49,6 +49,9 @@ public class ManualChange {
|
||||
|
||||
public ManualChange withChange(String property, String value) {
|
||||
|
||||
if (value == null) {
|
||||
return this;
|
||||
}
|
||||
this.propertyChanges.put(property, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ public enum ManualRedactionType {
|
||||
FORCE,
|
||||
RECATEGORIZE,
|
||||
RECATEGORIZE_IN_DICTIONARY,
|
||||
LEGAL_BASIS_CHANGE,
|
||||
@Deprecated LEGAL_BASIS_CHANGE,
|
||||
RESIZE,
|
||||
RESIZE_IN_DICTIONARY
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ import lombok.NoArgsConstructor;
|
||||
public class AddRedactionRequest implements ManualRequestWithAddToDictionary {
|
||||
|
||||
private String user;
|
||||
private String dossierTemplateTypeId;
|
||||
private String dictionaryTypeId;
|
||||
private String value;
|
||||
private String reason;
|
||||
private String legalBasis;
|
||||
|
||||
@ -5,6 +5,7 @@ import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
package com.iqser.red.service.persistence.service.v1.api.shared.model.annotations;
|
||||
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry;
|
||||
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.model.annotations.entitymapped.BaseAnnotation;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
|
||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
|
||||
@UtilityClass
|
||||
public class ManualChangeFactory {
|
||||
|
||||
public List<ManualChange> toLocalManualChangeList(List<BaseAnnotation> manualChanges, boolean markAsProcessed) {
|
||||
|
||||
return manualChanges.stream()
|
||||
.map(ManualChangeFactory::toLocalManualChange)
|
||||
.peek(manualChange -> {
|
||||
if (markAsProcessed) {
|
||||
manualChange.setProcessedDate(OffsetDateTime.now());
|
||||
}
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
public ManualChange toLocalManualChange(BaseAnnotation baseAnnotation) {
|
||||
|
||||
if (!baseAnnotation.isLocal()) {
|
||||
throw new IllegalArgumentException(String.format("Manual change %s is not a local manual change", baseAnnotation));
|
||||
}
|
||||
|
||||
ManualChange manualChange = ManualChange.from(baseAnnotation);
|
||||
if (baseAnnotation instanceof ManualRecategorization recategorization) {
|
||||
manualChange.withManualRedactionType(ManualRedactionType.RECATEGORIZE)
|
||||
.withChange("type", recategorization.getType())
|
||||
.withChange("section", recategorization.getSection())
|
||||
.withChange("legalBasis", recategorization.getLegalBasis())
|
||||
.withChange("value", recategorization.getValue());
|
||||
} else if (baseAnnotation instanceof IdRemoval) {
|
||||
manualChange.withManualRedactionType(ManualRedactionType.REMOVE);
|
||||
} else if (baseAnnotation instanceof ManualForceRedaction manualForceRedaction) {
|
||||
manualChange.withManualRedactionType(ManualRedactionType.FORCE).withChange("legalBasis", manualForceRedaction.getLegalBasis());
|
||||
} else if (baseAnnotation instanceof ManualResizeRedaction manualResizeRedact) {
|
||||
manualChange.withManualRedactionType(ManualRedactionType.RESIZE).withChange("value", manualResizeRedact.getValue());
|
||||
} else if (baseAnnotation instanceof ManualRedactionEntry manualRedactionEntry) {
|
||||
manualChange.withManualRedactionType(ManualRedactionType.ADD).withChange("value", manualRedactionEntry.getValue());
|
||||
} else if (baseAnnotation instanceof ManualLegalBasisChange manualLegalBasisChange) {
|
||||
manualChange.withManualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE)
|
||||
.withChange("section", manualLegalBasisChange.getSection())
|
||||
.withChange("value", manualLegalBasisChange.getValue())
|
||||
.withChange("legalBasis", manualLegalBasisChange.getLegalBasis());
|
||||
}
|
||||
return manualChange;
|
||||
}
|
||||
|
||||
}
|
||||
@ -19,7 +19,7 @@ public interface ManualRequestWithAddToDictionary {
|
||||
boolean isForceAddToDictionary();
|
||||
|
||||
|
||||
String getDossierTemplateTypeId();
|
||||
String getDictionaryTypeId();
|
||||
|
||||
|
||||
DictionaryEntryType getDictionaryEntryType();
|
||||
|
||||
@ -22,7 +22,7 @@ public class RecategorizationRequest implements ManualRequestWithAddToDictionary
|
||||
String typeToRemove;
|
||||
String dossierTemplateId;
|
||||
String dossierId;
|
||||
String dossierTemplateTypeId;
|
||||
String dictionaryTypeId;
|
||||
String comment;
|
||||
int page;
|
||||
boolean addToDictionary;
|
||||
|
||||
@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Data
|
||||
@SuperBuilder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -6,6 +6,7 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.NonNull;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user