Resolve RED-9255

This commit is contained in:
Kilian Schüttler 2024-07-19 11:53:04 +02:00
parent 20f760b37c
commit 15ab5d4215
8 changed files with 55 additions and 34 deletions

View File

@ -1,5 +1,6 @@
package com.iqser.red.persistence.service.v1.external.api.impl.controller;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.IMPORT_FILES;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.USE_SUPPORT_CONTROLLER;
import java.io.IOException;
@ -134,6 +135,7 @@ public class SupportController implements SupportResource {
@Override
@PreAuthorize("hasAuthority('" + IMPORT_FILES + "')")
public ImportResponse importFiles(MultipartFile file) {
byte[] bytes;

View File

@ -8,6 +8,7 @@ import java.util.stream.Collectors;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.acls.domain.ObjectIdentityImpl;
import org.springframework.security.acls.domain.PrincipalSid;
import org.springframework.security.acls.model.MutableAcl;
import org.springframework.security.acls.model.MutableAclService;
import org.springframework.security.acls.model.NotFoundException;
import org.springframework.stereotype.Service;
@ -110,7 +111,7 @@ public class DossierACLService extends AbstractACLService<String> {
@Transactional
public void updateDossierACL(Set<String> members, Set<String> approvers, String owner, String dossierId) {
var acl = getOrCreateACL(dossierId);
MutableAcl acl = getOrCreateACL(dossierId);
// naive clear all ace's first
while (!acl.getEntries().isEmpty()) {

View File

@ -14,7 +14,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Dossier
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.annotation.Observed;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
@ -30,7 +29,6 @@ public class DossierImportService {
DossierCreatorService dossierCreatorService;
FileImportService fileImportService;
EntityTypeImportService entityTypeImportService;
ObservationRegistry registry;
@Observed(name = "DossierImportService", contextualName = "import-dossier")

View File

@ -24,18 +24,20 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class FileImportPersistenceService {
ManualChangesImportService manualChangesImportService;
FileRepository fileRepository;
@Transactional
@Observed(name = "FileImportPersistenceService", contextualName = "import-file-to-db")
public synchronized String saveFileToDb(String userId, FileExchangeImportModel.FileImport file, String dossierId, TemplateImportInfo templateImportInfo) { // synchronized as this is being called in an async block. Might lock up DB otherwise.
public synchronized String saveFileToDb(String userId,
FileExchangeImportModel.FileImport file,
String dossierId,
TemplateImportInfo templateImportInfo) { // synchronized as this is being called in an async block. Might lock up DB otherwise.
String fileId = createFile(dossierId, userId, file, templateImportInfo.getIdMapping());
manualChangesImportService.importManualChanges(file.getManualChanges(), fileId);
manualChangesImportService.importManualChanges(file.getManualChanges(), fileId, userId);
return fileId;
}
@ -49,6 +51,11 @@ public class FileImportPersistenceService {
FileEntity fileEntity = MagicConverter.convert(fileModel, FileEntity.class, new FileEntityMapper(fileAttributeConfigMap));
fileEntity.setAssignee(userid);
fileEntity.setLastReviewer(userid);
fileEntity.setLastApprover(userid);
fileEntity.setUploader(userid);
fileEntity.setDossierId(dossierId);
fileRepository.save(fileEntity);

View File

@ -38,38 +38,38 @@ public class ManualChangesImportService {
@Transactional
@Observed(name = "ManualChangesImportService", contextualName = "import-manual-changes")
public void importManualChanges(ManualChangesExportModel exportModel, String fileId) {
public void importManualChanges(ManualChangesExportModel exportModel, String fileId, String userId) {
FileEntity fileEntity = fileRepository.findById(fileId)
.orElseThrow();
exportModel.getManualAddExportModels()
.stream()
.map(model -> mapper.toEntity(model, fileEntity))
.map(model -> mapper.toEntity(model, fileEntity, userId))
.forEach(manualRedactionRepository::saveAndFlush);
exportModel.getManualForceExportModels()
.stream()
.map(model -> mapper.toEntity(model, fileEntity))
.map(model -> mapper.toEntity(model, fileEntity, userId))
.forEach(forceRedactionRepository::saveAndFlush);
exportModel.getManualRecategorizationExportModels()
.stream()
.map(model -> mapper.toEntity(model, fileEntity))
.map(model -> mapper.toEntity(model, fileEntity, userId))
.forEach(recategorizationRepository::saveAndFlush);
exportModel.getManualRemoveExportModels()
.stream()
.map(model -> mapper.toEntity(model, fileEntity))
.map(model -> mapper.toEntity(model, fileEntity, userId))
.forEach(removeRedactionRepository::saveAndFlush);
exportModel.getManualResizeExportModels()
.stream()
.map(model -> mapper.toEntity(model, fileEntity))
.map(model -> mapper.toEntity(model, fileEntity, userId))
.forEach(resizeRedactionRepository::saveAndFlush);
exportModel.getManualLegalBasisChangeExportModels()
.stream()
.map(model -> mapper.toEntity(model, fileEntity))
.map(model -> mapper.toEntity(model, fileEntity, userId))
.forEach(legalBasisChangeRepository::saveAndFlush);
}

View File

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

View File

@ -61,7 +61,7 @@ public final class ActionRoles {
// IMAGE SIMILIARITY SEARCH
public static final String GET_SIMILAR_IMAGES ="red-get-similiar-images";
public static final String GET_SIMILAR_IMAGES = "red-get-similiar-images";
// Preferences
public static final String MANAGE_USER_PREFERENCES = "red-manage-user-preferences";
@ -178,8 +178,7 @@ public final class ActionRoles {
public static final String DEPLOYMENT_INFO = "red-deployment-info";
public static final String USE_SUPPORT_CONTROLLER = "red-use-support-controller";
public static final String IMPORT_FILES = "red-import-files";
private ActionRoles() {}

View File

@ -33,6 +33,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_REPORT_TEMPLATES;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_TENANTS;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.IMPORT_FILES;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_ACL_PERMISSIONS;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_USER_PREFERENCES;
import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.MANAGE_VIEWED_PAGES;
@ -116,12 +117,19 @@ public final class ApplicationRoles {
public static final Set<String> UNMAPPED_ACTION_ROLES = Sets.newHashSet(UNARCHIVE_DOSSIER, UPDATE_LICENSE, GET_RSS, USE_SUPPORT_CONTROLLER);
public static final Set<String> KNECON_ADMIN_ACTION_ROLES = Sets.newHashSet(READ_LICENSE, UPDATE_LICENSE, GET_TENANTS, CREATE_TENANT, READ_USERS, READ_ALL_USERS, WRITE_USERS,
READ_SMTP_CONFIGURATION,
WRITE_SMTP_CONFIGURATION,
UNARCHIVE_DOSSIER,
USE_SUPPORT_CONTROLLER);
public static final Set<String> KNECON_SUPPORT_ACTION_ROLES = Sets.newHashSet(KNECON_ADMIN_ACTION_ROLES);
public static final Set<String> KNECON_SUPPORT_ACTION_ROLES = Sets.newHashSet(READ_LICENSE,
UPDATE_LICENSE,
GET_TENANTS,
CREATE_TENANT,
READ_USERS,
READ_ALL_USERS,
WRITE_USERS,
READ_SMTP_CONFIGURATION,
WRITE_SMTP_CONFIGURATION,
UNARCHIVE_DOSSIER,
USE_SUPPORT_CONTROLLER);
public static final Set<String> KNECON_ADMIN_ACTION_ROLES = Sets.union(KNECON_SUPPORT_ACTION_ROLES, Sets.newHashSet(IMPORT_FILES));
public static final Set<String> RED_USER_ACTION_ROLES = Sets.newHashSet(ADD_COMMENT,
READ_LICENSE,