This commit is contained in:
Timo Bejan 2021-10-08 14:42:39 +03:00
parent dbc6063e8c
commit c8f81d5e52
6 changed files with 89 additions and 70 deletions

View File

@ -1,10 +1,12 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
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.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
import lombok.RequiredArgsConstructor;
@ -14,7 +16,9 @@ import javax.transaction.Transactional;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Service
@ -23,7 +27,9 @@ public class FileStatusPersistenceService {
private final FileRepository fileRepository;
private final DossierRepository dossierRepository;
private final FileAttributesRepository fileAttributesRepository;
private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService;
private final DossierPersistenceService dossierService;
public void createStatus(String dossierId, String fileId, String filename, String uploader) {
@ -181,14 +187,18 @@ public class FileStatusPersistenceService {
}
@Transactional
public void setFileAttributes(String fileId, List<FileAttributeEntity> fileAttributes) {
public void setFileAttributes(String dossierId, String fileId, Map<String, String> fileAttributes) {
fileAttributesRepository.deleteByFileId(fileId);
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes);
file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setFileAttributes(fileAttributes);
file.setFileAttributes(fileAttributeEntities);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
@Transactional
@ -327,8 +337,21 @@ public class FileStatusPersistenceService {
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
});
}
private List<FileAttributeEntity> convertFileAttributes(String dossierId, FileEntity file, Map<String, String> fileAttributesMap) {
var dossier = dossierService.getAndValidateDossier(dossierId);
List<FileAttributeConfigEntity> configuration = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId());
return fileAttributesMap.entrySet().stream().map(entry -> {
var fa = new FileAttributeEntity();
fa.setFileAttributeId(new FileAttributeEntity.FileAttributeEntityId());
fa.setFile(file);
fa.setFileAttributeConfig(configuration.stream().filter(c -> c.getId().equals(entry.getKey())).findAny().orElseThrow(() ->
new BadRequestException("Invalid File Attribute Id")));
fa.setValue(entry.getValue());
return fa;
}).collect(Collectors.toList());
}

View File

@ -11,4 +11,7 @@ public interface FileAttributesRepository extends JpaRepository<FileAttributeEnt
@Query("DELETE FROM FileAttributeEntity f where f.fileAttributeId.fileAttributeConfigId = :fileAttributeConfigId")
void deleteByFileAttributeConfigId(String fileAttributeConfigId);
@Modifying
@Query("DELETE FROM FileAttributeEntity f where f.fileAttributeId.fileId = :fileId")
void deleteByFileId(String fileId);
}

View File

@ -6,7 +6,6 @@ import com.iqser.red.service.peristence.v1.server.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService;
@ -111,7 +110,7 @@ public class FileAttributesController implements FileAttributesResource {
String fileId = fileStatusByFilename.get(fileStatusMappingColumn.trim()).getId();
fileStatusPersistenceService.setFileAttributes(fileId, convertFileAttributes(dossierId, fileId, attributeIdToValue));
fileStatusPersistenceService.setFileAttributes(dossierId, fileId, attributeIdToValue);
affectedFileIds.add(fileId);
}
@ -123,23 +122,7 @@ public class FileAttributesController implements FileAttributesResource {
public void setFileAttributes(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@PathVariable(FILE_ID) String fileId, @RequestBody Map<String, String> fileAttributesMap) {
fileStatusPersistenceService.setFileAttributes(fileId, convertFileAttributes(dossierId, fileId, fileAttributesMap));
}
private List<FileAttributeEntity> convertFileAttributes(String dossierId, String fileId, Map<String, String> fileAttributesMap) {
var dossier = dossierService.getDossierById(dossierId);
var file = fileStatusService.getStatus(fileId);
List<FileAttributeConfigEntity> configuration = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId());
return fileAttributesMap.entrySet().stream().map(entry -> {
var fa = new FileAttributeEntity();
fa.setFileAttributeId(new FileAttributeEntity.FileAttributeEntityId());
fa.setFile(file);
fa.setFileAttributeConfig(configuration.stream().filter(c -> c.getId().equals(entry.getKey())).findAny().orElseThrow(() ->
new BadRequestException("Invalid File Attribute Id")));
fa.setValue(entry.getValue());
return fa;
}).collect(Collectors.toList());
fileStatusPersistenceService.setFileAttributes(dossierId, fileId, fileAttributesMap);
}

View File

@ -2,13 +2,10 @@ package com.iqser.red.service.peristence.v1.server.service;
import com.google.common.collect.Sets;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
import java.util.Set;
@Service
@ -18,22 +15,12 @@ public class ExcludeFromAnalysisService {
private final static Set<FileStatus> VALID_STATES_FOR_EXCLUSION = Sets.newHashSet(FileStatus.UNASSIGNED, FileStatus.UNDER_REVIEW, FileStatus.UNDER_APPROVAL);
private final FileStatusService fileStatusService;
private final FileManagementStorageService fileManagementStorageService;
private final LegalBasisChangePersistenceService legalBasisChangePersistenceService;
private final ImageRecategorizationPersistenceService imageRecategorizationPersistenceService;
private final CommentPersistenceService commentPersistenceService;
private final ForceRedactionPersistenceService forceRedactionPersistenceService;
private final RemoveRedactionPersistenceService removeRedactionPersistenceService;
private final AddRedactionPersistenceService addRedactionPersistenceService;
private final FileStatusPersistenceService fileStatusPersistenceService;
public void toggleExclusion(String dossierId, String fileId, boolean excluded) {
var status = fileStatusService.getStatus(fileId);
OffsetDateTime now = OffsetDateTime.now();
if (!VALID_STATES_FOR_EXCLUSION.contains(status.getStatus())) {
throw new BadRequestException("Files in status " + status.getStatus() + " cannot be excluded/included");
}
@ -45,39 +32,9 @@ public class ExcludeFromAnalysisService {
// if file has been re-enabled - process it
fileStatusService.setStatusFullReprocess(dossierId, fileId, 2);
} else {
// remove everything related to redaction
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG);
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT);
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.SECTION_GRID);
// wipe comments
var comments = commentPersistenceService.findCommentsByFileID(fileId, false);
comments.forEach((key, value) -> value.forEach(comment ->
commentPersistenceService.softDelete(comment.getId(), now)));
// wipe force redactions
var forceRedactions = forceRedactionPersistenceService.findForceRedactions(fileId, false);
forceRedactions.forEach(f -> forceRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe add manual redactions
var addRedactions = addRedactionPersistenceService.findAddRedactions(fileId, false);
addRedactions.forEach(f -> addRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe removeRedactions
var removeRedactions = removeRedactionPersistenceService.findRemoveRedactions(fileId, false);
removeRedactions.forEach(f -> removeRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe image recat
var imageRecategorizations = imageRecategorizationPersistenceService.findRecategorizations(fileId, false);
imageRecategorizations.forEach(f -> imageRecategorizationPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe legal basis changes
var legalBasisChanges = legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false);
legalBasisChanges.forEach(f -> legalBasisChangePersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
fileStatusPersistenceService.updateHasComments(fileId, false);
fileStatusService.wipeFileData(dossierId, fileId);
}
}
}

View File

@ -9,9 +9,9 @@ import com.iqser.red.service.peristence.v1.server.controller.RulesController;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.UserNotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.redaction.v1.model.AnalyzeRequest;
import com.iqser.red.service.redaction.v1.model.AnalyzeResult;
import lombok.RequiredArgsConstructor;
@ -38,6 +38,15 @@ public class FileStatusService {
private final RulesController rulesController;
private final ManualRedactionProviderService manualRedactionProviderService;
private final FileManagementStorageService fileManagementStorageService;
private final LegalBasisChangePersistenceService legalBasisChangePersistenceService;
private final ImageRecategorizationPersistenceService imageRecategorizationPersistenceService;
private final CommentPersistenceService commentPersistenceService;
private final ForceRedactionPersistenceService forceRedactionPersistenceService;
private final RemoveRedactionPersistenceService removeRedactionPersistenceService;
private final AddRedactionPersistenceService addRedactionPersistenceService;
public List<FileEntity> getDossierStatus(String dossierId) {
@ -265,6 +274,7 @@ public class FileStatusService {
public void overwriteFile(String dossierId, String fileId, String uploader, String filename, int length) {
fileStatusPersistenceService.overwriteFile(fileId, uploader, filename);
wipeFileData(dossierId,fileId);
setStatusFullReprocess(dossierId, fileId, length);
}
@ -275,6 +285,43 @@ public class FileStatusService {
}
public void wipeFileData(String dossierId, String fileId){
OffsetDateTime now = OffsetDateTime.now();
// remove everything related to redaction
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.REDACTION_LOG);
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.TEXT);
fileManagementStorageService.deleteObject(dossierId, fileId, FileType.SECTION_GRID);
// wipe comments
var comments = commentPersistenceService.findCommentsByFileID(fileId, false);
comments.forEach((key, value) -> value.forEach(comment ->
commentPersistenceService.softDelete(comment.getId(), now)));
// wipe force redactions
var forceRedactions = forceRedactionPersistenceService.findForceRedactions(fileId, false);
forceRedactions.forEach(f -> forceRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe add manual redactions
var addRedactions = addRedactionPersistenceService.findAddRedactions(fileId, false);
addRedactions.forEach(f -> addRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe removeRedactions
var removeRedactions = removeRedactionPersistenceService.findRemoveRedactions(fileId, false);
removeRedactions.forEach(f -> removeRedactionPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe image recat
var imageRecategorizations = imageRecategorizationPersistenceService.findRecategorizations(fileId, false);
imageRecategorizations.forEach(f -> imageRecategorizationPersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
// wipe legal basis changes
var legalBasisChanges = legalBasisChangePersistenceService.findLegalBasisChanges(fileId, false);
legalBasisChanges.forEach(f -> legalBasisChangePersistenceService.softDelete(fileId, f.getId().getAnnotationId(), now));
fileStatusPersistenceService.updateHasComments(fileId, false);
}
private List<com.iqser.red.service.redaction.v1.model.FileAttribute> convert(
List<FileAttributeEntity> fileAttributes) {

View File

@ -121,7 +121,13 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest {
fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes();
assertThat(fileAttributes.size()).isEqualTo(3);
assertThat(fileAttributes.size()).isEqualTo(2);
fileAttributes.put(fileAttributes.keySet().iterator().next(), "changed");
fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), fileAttributes);
fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes();
assertThat(fileAttributes.size()).isEqualTo(2);
fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), Lists.newArrayList());