RED-10196: Backend adaptions for RM/DM unification

This commit is contained in:
Maverick Studer 2024-11-11 12:54:31 +01:00
parent b8710d57b3
commit 4d36a3d813
27 changed files with 360 additions and 261 deletions

View File

@ -7,7 +7,7 @@ plugins {
}
val redactionServiceVersion by rootProject.extra { "4.290.0" }
val pdftronRedactionServiceVersion by rootProject.extra { "4.87.0" }
val pdftronRedactionServiceVersion by rootProject.extra { "4.89.0-RED10196.0" }
val redactionReportServiceVersion by rootProject.extra { "4.81.0" }
val searchServiceVersion by rootProject.extra { "2.90.0" }

View File

@ -21,6 +21,7 @@ import com.iqser.red.persistence.service.v2.external.api.impl.mapper.ComponentMa
import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException;
import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService;
@ -34,6 +35,7 @@ import com.iqser.red.service.persistence.service.v2.api.external.model.FileCompo
import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponentsList;
import com.iqser.red.service.persistence.service.v2.api.external.resource.ComponentResource;
import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity;
import com.knecon.fforesight.tenantcommons.TenantProvider;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AccessLevel;
@ -50,11 +52,9 @@ public class ComponentControllerV2 implements ComponentResource {
private final StatusController statusController;
private final FileStatusService fileStatusService;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
private final CurrentApplicationTypeProvider currentApplicationTypeProvider;
private final ComponentMapper componentMapper = ComponentMapper.INSTANCE;
@Value("${application.type}")
private String applicationType;
@Override
public FileComponents getComponents(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId,
@ -154,7 +154,7 @@ public class ComponentControllerV2 implements ComponentResource {
private void checkApplicationType() {
if(!applicationType.equals("DocuMine")) {
if (!currentApplicationTypeProvider.isDocuMine()) {
throw new NotAllowedException("Components can only be accessed in DocuMine");
}
}

View File

@ -21,6 +21,7 @@ import com.iqser.red.persistence.service.v1.external.api.impl.controller.Downloa
import com.iqser.red.persistence.service.v1.external.api.impl.controller.StatusController;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierAttributesManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DownloadStatusPersistenceService;
@ -42,24 +43,25 @@ import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
@RestController
@RequiredArgsConstructor
@Tag(name = "2. Dossier endpoints", description = "Provides operations related to dossiers")
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class DossierControllerV2 implements DossierResource {
private final DossierTemplateController dossierTemplateController;
private final DossierController dossierController;
private final AccessControlService accessControlService;
private final DossierAttributesManagementService dossierAttributesManagementService;
private final AuditPersistenceService auditPersistenceService;
private final DownloadController downloadController;
private final StatusController statusController;
private final DownloadStatusPersistenceService downloadStatusPersistenceService;
@Value("${application.type}")
private String applicationType;
DossierTemplateController dossierTemplateController;
DossierController dossierController;
AccessControlService accessControlService;
DossierAttributesManagementService dossierAttributesManagementService;
AuditPersistenceService auditPersistenceService;
DownloadController downloadController;
StatusController statusController;
DownloadStatusPersistenceService downloadStatusPersistenceService;
CurrentApplicationTypeProvider currentApplicationTypeProvider;
public DossierList getDossiers(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId,
@ -191,7 +193,7 @@ public class DossierControllerV2 implements DossierResource {
.description(dossier.getDescription())
.ownerId(dossier.getOwnerId())
.memberIds(dossier.getMemberIds())
.approverIds(applicationType.equals("DocuMine") ? dossier.getMemberIds() : dossier.getApproverIds()) // for DocuMine, the members are always set as approvers
.approverIds(currentApplicationTypeProvider.isDocuMine() ? dossier.getMemberIds() : dossier.getApproverIds()) // for DocuMine, the members are always set as approvers
.downloadFileTypes(Set.of(DownloadFileType.ORIGINAL))
.reportTemplateIds(dossier.getReportTemplateIds())
.watermarkId(null)

View File

@ -30,10 +30,6 @@ dependencies {
exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1")
exclude(group = "com.iqser.red.service", module = "persistence-service-shared-api-v1")
}
api("com.knecon.fforesight:layoutparser-service-internal-api:0.181.0") {
exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1")
exclude(group = "com.iqser.red.service", module = "persistence-service-shared-api-v1")
}
api("com.iqser.red.service:search-service-api-v1:${rootProject.extra.get("searchServiceVersion")}") {
exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1")
exclude(group = "com.iqser.red.service", module = "persistence-service-shared-api-v1")
@ -42,10 +38,10 @@ dependencies {
implementation("com.knecon.fforesight:llm-service-api:1.20.0-RED10072.2")
api("com.knecon.fforesight:jobs-commons:0.10.0")
api("com.iqser.red.commons:storage-commons:2.50.0")
api("com.knecon.fforesight:tenant-commons:0.31.0") {
api("com.knecon.fforesight:tenant-commons:0.31.0-RED10196.0") {
exclude(group = "com.iqser.red.commons", module = "storage-commons")
}
api("com.knecon.fforesight:database-tenant-commons:0.28.0") {
api("com.knecon.fforesight:database-tenant-commons:0.28.0-RED10196.0") {
exclude(group = "com.knecon.fforesight", module = "tenant-commons")
}
api("com.knecon.fforesight:keycloak-commons:0.30.0") {

View File

@ -19,10 +19,14 @@ import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ComponentMappingImportModel;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.EntityTypeImportModel;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ImportTemplateResult;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.TemplateImportInfo;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.zipreaders.DossierTemplateArchiveReader;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.zipreaders.ZipEntryIterator;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
@ -33,14 +37,11 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ComponentMappingImportModel;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ImportTemplateResult;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.TemplateImportInfo;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.zipreaders.DossierTemplateArchiveReader;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.zipreaders.ZipEntryIterator;
import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentMappingService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.DateFormatsValidationService;
import com.iqser.red.service.persistence.management.v1.processor.service.LayoutParsingTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.DefaultDateFormatsProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.ReportTemplateService;
import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService;
@ -72,43 +73,44 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp
import com.iqser.red.service.redaction.v1.model.DroolsValidation;
import com.iqser.red.storage.commons.service.StorageService;
import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
import com.knecon.fforesight.tenantcommons.TenantContext;
import io.micrometer.observation.annotation.Observed;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class DossierTemplateImportService {
@Value("${application.type}")
private String applicationType;
private final DossierTemplateRepository dossierTemplateRepository;
private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
private final RulesPersistenceService rulesPersistenceService;
private final DateFormatsPersistenceService dateFormatsPersistenceService;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService;
private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService;
private final ColorsService colorsService;
private final DossierStatusPersistenceService dossierStatusPersistenceService;
private final WatermarkService watermarkService;
private final ReportTemplateService reportTemplateService;
private final ReportTemplatePersistenceService reportTemplatePersistenceService;
private final RulesValidationService rulesValidationService;
private final DateFormatsValidationService dateFormatsValidationService;
private final StorageService storageService;
private final FileManagementServiceSettings settings;
private final ComponentMappingService componentMappingService;
private final ComponentDefinitionPersistenceService componentDefinitionPersistenceService;
private final EntityTypeImportService entityTypeImportService;
private final SystemManagedTypesImport systemManagedTypesImport;
private final DefaultDateFormatsProvider defaultDateFormatsProvider;
DossierTemplateRepository dossierTemplateRepository;
LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
RulesPersistenceService rulesPersistenceService;
DateFormatsPersistenceService dateFormatsPersistenceService;
DossierTemplatePersistenceService dossierTemplatePersistenceService;
DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService;
FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService;
ColorsService colorsService;
DossierStatusPersistenceService dossierStatusPersistenceService;
WatermarkService watermarkService;
ReportTemplateService reportTemplateService;
ReportTemplatePersistenceService reportTemplatePersistenceService;
RulesValidationService rulesValidationService;
DateFormatsValidationService dateFormatsValidationService;
StorageService storageService;
FileManagementServiceSettings settings;
ComponentMappingService componentMappingService;
ComponentDefinitionPersistenceService componentDefinitionPersistenceService;
EntityTypeImportService entityTypeImportService;
SystemManagedTypesImport systemManagedTypesImport;
LayoutParsingTypeProvider layoutParsingTypeProvider;
CurrentApplicationTypeProvider currentApplicationTypeProvider;
DefaultDateFormatsProvider defaultDateFormatsProvider;
public String importDossierTemplate(ImportDossierTemplateRequest request) {
@ -147,6 +149,10 @@ public class DossierTemplateImportService {
int importStep = 1;
var dossierTemplateMeta = request.getDossierTemplate();
if (dossierTemplateMeta.getLayoutParsingType() == null) {
dossierTemplateMeta.setLayoutParsingType(layoutParsingTypeProvider.deferFromCurrentApplicationType());
}
TemplateImportInfo templateImportInfo = TemplateImportInfo.builder().build();
DossierTemplateEntity existingDossierTemplate = null;
@ -302,7 +308,6 @@ public class DossierTemplateImportService {
dossierTemplateEntity.setId(UUID.randomUUID().toString());
dossierTemplateEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierTemplateEntity.setCreatedBy(request.getUserId());
dossierTemplateEntity.setLayoutParsingType(deferFromApplicationType());
var loadedDossierTemplate = dossierTemplateRepository.save(dossierTemplateEntity);
loadedDossierTemplate.setDossierTemplateStatus(dossierTemplatePersistenceService.computeDossierTemplateStatus(loadedDossierTemplate));
@ -496,7 +501,7 @@ public class DossierTemplateImportService {
private void setDataFormats(ImportTemplateResult request, String dossierTemplateId) {
String dateFormats = request.getDateFormats();
if (dateFormats == null && applicationType.equals("DocuMine")) {
if (dateFormats == null && currentApplicationTypeProvider.isDocuMine()) {
dateFormats = defaultDateFormatsProvider.getDateFormats();
}
if (dateFormats != null) {
@ -523,7 +528,7 @@ public class DossierTemplateImportService {
dossierTemplateEntity.setModifiedBy(userId);
dossierTemplateEntity.setValidFrom(dossierTemplate.getValidFrom() == null ? dossierTemplateEntity.getValidFrom() : dossierTemplate.getValidFrom());
dossierTemplateEntity.setValidTo(dossierTemplate.getValidTo() == null ? dossierTemplateEntity.getValidTo() : dossierTemplate.getValidTo());
dossierTemplateEntity.setLayoutParsingType(deferFromApplicationType());
dossierTemplateEntity.setLayoutParsingType(layoutParsingTypeProvider.deferFromCurrentApplicationType());
dossierTemplateEntity.setDownloadFileTypes(dossierTemplate.getDownloadFileTypes() == null || dossierTemplate.getDownloadFileTypes()
.isEmpty() ? dossierTemplateEntity.getDownloadFileTypes() : dossierTemplate.getDownloadFileTypes());
@ -531,12 +536,6 @@ public class DossierTemplateImportService {
}
private LayoutParsingType deferFromApplicationType() {
return Objects.equals(applicationType, "DocuMine") ? LayoutParsingType.DOCUMINE_OLD : LayoutParsingType.REDACT_MANAGER_WITHOUT_DUPLICATE_PARAGRAPH;
}
private void setColors(String dossierTemplateId, Colors requestedColors) {
// set colors
if (requestedColors != null) {

View File

@ -2,7 +2,6 @@ package com.iqser.red.service.persistence.management.v1.processor.migration;
import static com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration.MIGRATION_REQUEST_QUEUE;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -27,7 +26,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings;
import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils;
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.migration.MigratedIds;
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.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.dossier.file.SaasMigrationStatus;
@ -123,7 +121,7 @@ public class SaasMigrationService implements TenantSyncService {
// delete NER_ENTITIES since offsets depend on old document structure.
storageService.deleteObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(file.getDossierId(), file.getFileId(), FileType.NER_ENTITIES));
var layoutParsingRequest = layoutParsingRequestFactory.build(file.getDossierId(), file.getFileId(), false);
var layoutParsingRequest = layoutParsingRequestFactory.build(dossier.getDossierTemplate().getId(), file.getDossierId(), file.getFileId(), false);
rabbitTemplate.convertAndSend(LayoutParsingQueueNames.LAYOUT_PARSING_REQUEST_EXCHANGE, TenantContext.getTenantId(), layoutParsingRequest);
@ -159,7 +157,7 @@ public class SaasMigrationService implements TenantSyncService {
log.info("Starting Migration for dossierId {} and fileId {}", dossierId, fileId);
saasMigrationStatusPersistenceService.createMigrationRequiredStatus(dossierId, fileId);
var layoutParsingRequest = layoutParsingRequestFactory.build(dossierId, fileId, false);
var layoutParsingRequest = layoutParsingRequestFactory.build(dossier.getDossierTemplate().getId(), dossierId, fileId, false);
rabbitTemplate.convertAndSend(LayoutParsingQueueNames.LAYOUT_PARSING_REQUEST_EXCHANGE, TenantContext.getTenantId(), layoutParsingRequest);
}

View File

@ -1,20 +1,14 @@
package com.iqser.red.service.persistence.management.v1.processor.migration.migrations;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.migration.Migration;
import com.iqser.red.service.persistence.management.v1.processor.service.DefaultDateFormatsProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DateFormatsPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
@ -31,14 +25,13 @@ public class AddDateFormatsToTemplatesMigration25 extends Migration {
private static final long VERSION = 25;
@Autowired
DateFormatsPersistenceService dateFormatsPersistenceService;
private DateFormatsPersistenceService dateFormatsPersistenceService;
@Autowired
DossierTemplatePersistenceService dossierTemplatePersistenceService;
private DossierTemplatePersistenceService dossierTemplatePersistenceService;
@Autowired
DefaultDateFormatsProvider defaultDateFormatsProvider;
@Value("${application.type}")
private String applicationType;
private DefaultDateFormatsProvider defaultDateFormatsProvider;
@Autowired
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
public AddDateFormatsToTemplatesMigration25() {
@ -51,7 +44,7 @@ public class AddDateFormatsToTemplatesMigration25 extends Migration {
@SneakyThrows
protected void migrate() {
if (!applicationType.equalsIgnoreCase("DocuMine")) {
if (!currentApplicationTypeProvider.isDocuMine()) {
log.info("Skipping AddDateFormatsToTemplatesMigration25 as application type is not DocuMine!!!");
return;
}

View File

@ -3,18 +3,16 @@ package com.iqser.red.service.persistence.management.v1.processor.migration.migr
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.iqser.red.service.pdftron.redaction.v1.api.model.ApplicationType;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.migration.Migration;
import com.iqser.red.service.persistence.management.v1.processor.migration.StorageToMongoCopyService;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentDefinitionService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionAddRequest;
import lombok.experimental.NonFinal;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@ -116,16 +114,14 @@ public class ComponentOverridesMigration21 extends Migration {
"Certificate of analysis batch identification",
"Certificate of analysis batch identification"));
@NonFinal
@Value("${application.type}")
String applicationType;
@Autowired
ComponentDefinitionService componentDefinitionService;
@Autowired
DossierTemplatePersistenceService dossierTemplatePersistenceService;
@Autowired
StorageToMongoCopyService storageToMongoCopyService;
@Autowired
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
public ComponentOverridesMigration21() {
@ -137,7 +133,7 @@ public class ComponentOverridesMigration21 extends Migration {
@Override
protected void migrate() {
if (!applicationType.equals("DocuMine")) {
if (!currentApplicationTypeProvider.isDocuMine()) {
log.info("Skipping component migration, due to application type not being equal to DOCUMINE!");
}

View File

@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.migration.Migration;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
@ -16,7 +17,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
@Setter
@Service
public class DocumineLayoutRewriteMigration20 extends Migration {
public class DocumineLayoutRewriteMigration20 extends Migration {
private static final String NAME = "Reanalyse layout for not approved Documine files";
private static final long VERSION = 20;
@ -30,10 +31,8 @@ public class DocumineLayoutRewriteMigration20 extends Migration {
@Autowired
private FileStatusPersistenceService fileStatusPersistenceService;
@Value("${application.type}")
private String applicationType;
@Autowired
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
public DocumineLayoutRewriteMigration20() {
@ -45,7 +44,7 @@ public class DocumineLayoutRewriteMigration20 extends Migration {
@Override
protected void migrate() {
if(!applicationType.equalsIgnoreCase("DocuMine")){
if (!currentApplicationTypeProvider.isDocuMine()) {
log.info("Skipping DocumineLayoutRewriteMigration20 as application type is not DocuMine!!!");
return;
}

View File

@ -0,0 +1,44 @@
package com.iqser.red.service.persistence.management.v1.processor.service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.stereotype.Service;
import com.knecon.fforesight.tenantcommons.TenantApplicationType;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantProvider;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
@Service
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class CurrentApplicationTypeProvider {
TenantProvider tenantProvider;
Map<String, TenantApplicationType> cache = new ConcurrentHashMap<>();
public TenantApplicationType get() {
return cache.computeIfAbsent(TenantContext.getTenantId(), tenantProvider::getTenantApplicationType);
}
public boolean isDocuMine() {
return get().equals(TenantApplicationType.DocuMine);
}
public boolean isRedactManager() {
return get().equals(TenantApplicationType.RedactManager);
}
}

View File

@ -14,11 +14,9 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.google.common.collect.Sets;
import com.iqser.red.service.pdftron.redaction.v1.api.model.ApplicationType;
import com.iqser.red.service.pdftron.redaction.v1.api.model.ProcessUntouchedDocumentRequest;
import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
@ -89,7 +87,6 @@ import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@ -98,10 +95,6 @@ import lombok.extern.slf4j.Slf4j;
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class FileStatusService {
@NonFinal
@Value("${application.type}")
String applicationType;
FileStatusPersistenceService fileStatusPersistenceService;
DossierPersistenceService dossierPersistenceService;
DossierTemplatePersistenceService dossierTemplatePersistenceService;
@ -125,6 +118,7 @@ public class FileStatusService {
ComponentDefinitionPersistenceService componentDefinitionPersistenceService;
EntityLogMongoService entityLogMongoService;
ComponentLogMongoService componentLogMongoService;
CurrentApplicationTypeProvider currentApplicationTypeProvider;
DictionaryPersistenceService dictionaryPersistenceService;
WebsocketService websocketService;
@ -332,7 +326,7 @@ public class FileStatusService {
FileType.DOCUMENT_TEXT.name(),
FileType.DOCUMENT_TEXT_OLD.getExtension())) {
var layoutParsingRequest = layoutParsingRequestFactory.build(dossierId, fileId, priority);
var layoutParsingRequest = layoutParsingRequestFactory.build(dossierTemplate.getId(), dossierId, fileId, priority);
setStatusFullProcessing(fileId);
log.info("Add file: {} from dossier {} to layout parsing request queue", fileId, dossierId);
rabbitTemplate.convertAndSend(LayoutParsingQueueNames.LAYOUT_PARSING_REQUEST_EXCHANGE, TenantContext.getTenantId(), layoutParsingRequest);
@ -495,12 +489,12 @@ public class FileStatusService {
@SneakyThrows
public void addToPreprocessingQueue(String dossierId, String fileId, String filename) {
ApplicationType type = ApplicationType.REDACT_MANAGER;
if (applicationType.equals("DocuMine")) {
type = ApplicationType.DOCUMINE;
}
var processUntouchedDocumentRequest = ProcessUntouchedDocumentRequest.builder().applicationType(type).dossierId(dossierId).fileId(fileId).fileName(filename).build();
var processUntouchedDocumentRequest = ProcessUntouchedDocumentRequest.builder()
.highlightExtractionEnabled(currentApplicationTypeProvider.isRedactManager())
.dossierId(dossierId)
.fileId(fileId)
.fileName(filename)
.build();
setStatusPreProcessingQueued(fileId);
@ -772,7 +766,7 @@ public class FileStatusService {
if (removeWatermark) {
features.add(AzureOcrFeature.REMOVE_WATERMARKS);
}
if (applicationType.equals("DocuMine")) {
if (currentApplicationTypeProvider.isDocuMine()) {
features.add(AzureOcrFeature.ROTATION_CORRECTION);
features.add(AzureOcrFeature.FONT_STYLE_DETECTION);
}

View File

@ -0,0 +1,27 @@
package com.iqser.red.service.persistence.management.v1.processor.service;
import org.springframework.stereotype.Service;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
@Service
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class LayoutParsingTypeProvider {
CurrentApplicationTypeProvider currentApplicationTypeProvider;
public LayoutParsingType deferFromCurrentApplicationType() {
return switch (currentApplicationTypeProvider.get()) {
case DocuMine -> LayoutParsingType.DOCUMINE_OLD;
case Clarifynd -> LayoutParsingType.CLARIFYND;
default -> LayoutParsingType.REDACT_MANAGER_WITHOUT_DUPLICATE_PARAGRAPH;
};
}
}

View File

@ -2,10 +2,10 @@ package com.iqser.red.service.persistence.management.v1.processor.service.layout
import java.util.Optional;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings;
import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;
@ -18,21 +18,17 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class LayoutParsingRequestFactory {
@Value("${application.type}")
private String applicationType;
private final FileManagementStorageService fileManagementStorageService;
private final FileManagementServiceSettings fileManagementServiceSettings;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
public LayoutParsingRequest build(String dossierId, String fileId, boolean priority) {
LayoutParsingType type = switch (applicationType) {
case "DocuMine" -> LayoutParsingType.DOCUMINE;
case "TAAS" -> LayoutParsingType.CLARIFYND;
default -> LayoutParsingType.REDACT_MANAGER;
};
public LayoutParsingRequest build(String dossierTemplateId, String dossierId, String fileId, boolean priority) {
LayoutParsingType layoutParsingType = dossierTemplatePersistenceService.getDossierTemplate(
dossierTemplateId).getLayoutParsingType();
Optional<String> optionalImageFileId = fileManagementStorageService.objectExists(dossierId, fileId, FileType.IMAGE_INFO) //
? Optional.of(StorageIdUtils.getStorageId(dossierId, fileId, FileType.IMAGE_INFO)) : Optional.empty();
@ -44,7 +40,7 @@ public class LayoutParsingRequestFactory {
? Optional.of(StorageIdUtils.getStorageId(dossierId, fileId, FileType.VISUAL_LAYOUT)) : Optional.empty();
return LayoutParsingRequest.builder()
.layoutParsingType(type)
.layoutParsingType(layoutParsingType)
.identifier(QueueMessageIdentifierService.buildIdentifier(dossierId, fileId, priority))
.originFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.ORIGIN))
.imagesFileStorageId(optionalImageFileId)

View File

@ -3,14 +3,12 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
@ -18,6 +16,8 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.LayoutParsingTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository;
import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType;
@ -32,16 +32,14 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class DossierTemplatePersistenceService {
@Value("${application.type}")
private String applicationType;
public static final String DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE = "DossierTemplate with Id %s not found.";
private final DossierTemplateRepository dossierTemplateRepository;
private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService;
private final RulesPersistenceService rulesPersistenceService;
private final DictionaryPersistenceService dictionaryPersistenceService;
private final CurrentApplicationTypeProvider currentApplicationTypeProvider;
private final LayoutParsingTypeProvider layoutParsingTypeProvider;
private final TypeRepository typeRepository;
private final static int MAX_NAME_LENGTH = 255;
@ -51,6 +49,10 @@ public class DossierTemplatePersistenceService {
@Transactional
public DossierTemplateEntity createOrUpdateDossierTemplate(CreateOrUpdateDossierTemplateRequest createOrUpdateDossierRequest) {
if (createOrUpdateDossierRequest.getLayoutParsingType() == null) {
createOrUpdateDossierRequest.setLayoutParsingType(layoutParsingTypeProvider.deferFromCurrentApplicationType());
}
if (createOrUpdateDossierRequest.getDossierTemplateId() != null) {
validateDossierTemplateDates(createOrUpdateDossierRequest.getValidFrom(), createOrUpdateDossierRequest.getValidTo());
validateDossierTemplate(createOrUpdateDossierRequest.getName(), createOrUpdateDossierRequest.getDescription());
@ -66,7 +68,7 @@ public class DossierTemplatePersistenceService {
dossierTemplate.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierTemplate.get().setModifiedBy(createOrUpdateDossierRequest.getRequestingUser());
dossierTemplate.get().setDossierTemplateStatus(computeDossierTemplateStatus(dossierTemplate.get()));
dossierTemplate.get().setLayoutParsingType(deferFromApplicationType());
dossierTemplate.get().setLayoutParsingType(createOrUpdateDossierRequest.getLayoutParsingType());
return dossierTemplate.get();
} else {
throw new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, createOrUpdateDossierRequest.getDossierTemplateId()));
@ -83,7 +85,7 @@ public class DossierTemplatePersistenceService {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossierTemplate);
dossierTemplate.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossierTemplate.setCreatedBy(createOrUpdateDossierRequest.getRequestingUser());
dossierTemplate.setLayoutParsingType(deferFromApplicationType());
dossierTemplate.setLayoutParsingType(createOrUpdateDossierRequest.getLayoutParsingType());
rulesPersistenceService.setRules(RulesPersistenceService.DEFAULT_RULES, dossierTemplate.getId(), RuleFileType.ENTITY);
var loadedDossierTemplate = dossierTemplateRepository.save(dossierTemplate);
loadedDossierTemplate.setDossierTemplateStatus(computeDossierTemplateStatus(loadedDossierTemplate));
@ -94,12 +96,6 @@ public class DossierTemplatePersistenceService {
}
private LayoutParsingType deferFromApplicationType() {
return Objects.equals(applicationType, "DocuMine") ? LayoutParsingType.DOCUMINE_OLD : LayoutParsingType.REDACT_MANAGER_WITHOUT_DUPLICATE_PARAGRAPH;
}
private void validateDossierTemplateDates(OffsetDateTime validFrom, OffsetDateTime validTo) {
if (validFrom != null && validTo != null && validFrom.isAfter(validTo)) {
@ -155,7 +151,7 @@ public class DossierTemplatePersistenceService {
if (rulesOptional.isEmpty()) {
return DossierTemplateStatus.INCOMPLETE;
}
if (applicationType.equals("DocuMine")) {
if (currentApplicationTypeProvider.isDocuMine()) {
var componentRulesOptional = rulesPersistenceService.getRules(dossierTemplate.getId(), RuleFileType.COMPONENT);
if (componentRulesOptional.isEmpty()) {
return DossierTemplateStatus.INCOMPLETE;
@ -194,6 +190,14 @@ public class DossierTemplatePersistenceService {
}
@Transactional
public LayoutParsingType getDossierTemplateLayoutParsingType(String dossierTemplateId) {
return dossierTemplateRepository.findLayoutParsingTypeByIdAndNotDeleted(dossierTemplateId)
.orElseThrow(() -> new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, dossierTemplateId)));
}
public void checkDossierTemplateExistsOrElseThrow404(String dossierTemplateId) {
if (!dossierTemplateRepository.existsByIdAndNotDeleted(dossierTemplateId)) {

View File

@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
public interface DossierTemplateRepository extends JpaRepository<DossierTemplateEntity, String> {
@ -28,4 +29,8 @@ public interface DossierTemplateRepository extends JpaRepository<DossierTemplate
boolean existsByNameAndIdNot(String name, String id);
@Query("select d.layoutParsingType from DossierTemplateEntity d where d.id = :dossierTemplateId and d.softDeleteTime is null")
Optional<LayoutParsingType> findLayoutParsingTypeByIdAndNotDeleted(@Param("dossierTemplateId") String dossierTemplateId);
}

View File

@ -15,7 +15,6 @@ kubernetes.namespace: ${NAMESPACE:default}
project.version: 1.0-SNAPSHOT
application:
type: "RedactManager"
rss.component-log.enabled: false
server:

View File

@ -23,6 +23,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.configur
import com.iqser.red.service.persistence.management.v1.processor.migration.migrations.AddDateFormatsToTemplatesMigration25;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DateFormatsPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest;
import com.knecon.fforesight.tenantcommons.TenantApplicationType;
import lombok.SneakyThrows;
@ -41,6 +42,13 @@ public class AddDateFormatsToTemplatesMigration25Test extends AbstractPersistenc
private DateFormatsPersistenceService dateFormatsPersistenceService;
@Override
protected TenantApplicationType getTenantApplicationType() {
return TenantApplicationType.DocuMine;
}
@Test
@SneakyThrows
public void testAddDateFormatsMigration() {

View File

@ -15,12 +15,12 @@ import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.springframework.test.util.ReflectionTestUtils;
import com.iqser.red.persistence.service.v1.external.api.impl.controller.StatusController;
import com.iqser.red.persistence.service.v2.external.api.impl.controller.ComponentControllerV2;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService;
@ -57,6 +57,8 @@ public class ComponentControllerV2Test {
private StatusController statusController;
@Mock
private ComponentLog mockComponentLog;
@Mock
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
@BeforeEach
@ -64,8 +66,7 @@ public class ComponentControllerV2Test {
void setUp() {
openMocks(this);
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "DocuMine");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(true);
}
@ -109,7 +110,7 @@ public class ComponentControllerV2Test {
@Test
void shouldThrowNotAllowedExceptionIfApplicationTypeIsRM_getComponents() {
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "RedactManager");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(false);
when(userService.getUserById(USER_ID)).thenReturn(Optional.of(new User()));
@ -120,7 +121,7 @@ public class ComponentControllerV2Test {
@Test
void shouldThrowNotAllowedExceptionIfApplicationTypeIsRM_getComponentsOfDossier() {
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "RedactManager");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(false);
assertThrows(NotAllowedException.class, () -> componentControllerV2.getComponentsOfDossier(DOSSIER_TEMPLATE_ID, DOSSIER_ID, false));
}
@ -143,7 +144,7 @@ public class ComponentControllerV2Test {
@Test
void shouldThrowNotAllowedExceptionIfApplicationTypeIsRM_addOverride() {
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "RedactManager");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(false);
Component component = Component.builder().name("dummy").componentValues(Collections.emptyList()).build();
@ -163,7 +164,7 @@ public class ComponentControllerV2Test {
@Test
void shouldThrowNotAllowedExceptionIfApplicationTypeIsRM_getOverrides() {
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "RedactManager");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(false);
assertThrows(NotAllowedException.class, () -> componentControllerV2.getOverrides(DOSSIER_TEMPLATE_ID, DOSSIER_ID, FILE_ID));
}
@ -190,7 +191,7 @@ public class ComponentControllerV2Test {
@Test
void shouldThrowNotAllowedExceptionIfApplicationTypeIsRM_revertOverrides() {
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "RedactManager");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(false);
RevertOverrideRequest revertOverrideRequest = new RevertOverrideRequest();

View File

@ -4,19 +4,15 @@ 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.assertTrue;
import static org.mockito.MockitoAnnotations.openMocks;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Set;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.util.ReflectionTestUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.persistence.service.v2.external.api.impl.controller.ComponentControllerV2;
@ -31,6 +27,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.component.R
import com.iqser.red.service.persistence.service.v2.api.external.model.Component;
import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentValue;
import com.iqser.red.service.persistence.service.v2.api.external.model.EntityReference;
import com.knecon.fforesight.tenantcommons.TenantApplicationType;
import feign.FeignException;
import lombok.SneakyThrows;
@ -59,11 +56,10 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest
private ComponentControllerV2 componentControllerV2;
@BeforeEach
@SneakyThrows
void setUp() {
@Override
protected TenantApplicationType getTenantApplicationType() {
ReflectionTestUtils.setField(componentControllerV2, "applicationType", "DocuMine");
return TenantApplicationType.DocuMine;
}

View File

@ -30,11 +30,13 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.BadRe
import com.iqser.red.service.persistence.management.v1.processor.migration.RankDeDuplicationService;
import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentMappingService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateCloneService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateImportService;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService;
import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService;
import com.iqser.red.service.persistence.management.v1.processor.service.LayoutParsingTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.service.DossierTemplateExportService;
@ -56,6 +58,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp
import com.iqser.red.service.persistence.management.v1.processor.dataexchange.models.ExportDownloadRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.TypeRankSummary;
import com.iqser.red.storage.commons.service.StorageService;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
import lombok.SneakyThrows;
@ -114,6 +117,11 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest {
@MockBean
private SystemManagedTypesImport systemManagedTypesImport;
@MockBean
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
@MockBean
private LayoutParsingTypeProvider layoutParsingTypeProvider;
ObjectMapper mapper;
private DossierTemplateManagementService dossierTemplateManagementService;
@ -134,6 +142,8 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest {
legalBasisMappingPersistenceService,
rulesPersistenceService,
dictionaryPersistenceService,
currentApplicationTypeProvider,
layoutParsingTypeProvider,
typeRepository);
dossierTemplateCloneService = new DossierTemplateCloneService(dossierTemplateRepository,
legalBasisMappingPersistenceService,
@ -189,6 +199,9 @@ public class DossierTemplateCloneAndExportWithDuplicateRanksTest {
typesValues.add(typeRank2);
when(dictionaryPersistenceService.getTypeRankSummaryList(dossierTemplateId)).thenReturn(typesValues);
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(false);
when(layoutParsingTypeProvider.deferFromCurrentApplicationType()).thenReturn(LayoutParsingType.REDACT_MANAGER_WITHOUT_DUPLICATE_PARAGRAPH);
}

View File

@ -20,7 +20,6 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.util.ReflectionTestUtils;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity;
@ -29,8 +28,10 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.configur
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.ColorsService;
import com.iqser.red.service.persistence.management.v1.processor.service.ComponentMappingService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateCloneService;
import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService;
import com.iqser.red.service.persistence.management.v1.processor.service.LayoutParsingTypeProvider;
import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DateFormatsPersistenceService;
@ -48,6 +49,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus;
import com.iqser.red.storage.commons.service.StorageService;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
import lombok.SneakyThrows;
@ -103,6 +105,12 @@ public class DossierTemplateCloneServiceTest {
@MockBean
private ComponentDefinitionPersistenceService componentDefinitionPersistenceService;
@MockBean
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
@MockBean
private LayoutParsingTypeProvider layoutParsingTypeProvider;
private DossierTemplateCloneService dossierTemplateCloneService;
private DossierTemplatePersistenceService dossierTemplatePersistenceService;
@ -118,9 +126,12 @@ public class DossierTemplateCloneServiceTest {
legalBasisMappingPersistenceService,
rulesPersistenceService,
dictionaryPersistenceService,
currentApplicationTypeProvider,
layoutParsingTypeProvider,
typeRepository);
ReflectionTestUtils.setField(dossierTemplatePersistenceService, "applicationType", "RedactManager");
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(true);
when(layoutParsingTypeProvider.deferFromCurrentApplicationType()).thenReturn(LayoutParsingType.DOCUMINE_OLD);
dossierTemplateCloneService = new DossierTemplateCloneService(dossierTemplateRepository,
legalBasisMappingPersistenceService,
@ -152,6 +163,7 @@ public class DossierTemplateCloneServiceTest {
dummyTemplate.setValidFrom(OffsetDateTime.now().minusYears(6));
dummyTemplate.setValidTo(OffsetDateTime.now().plusYears(2));
dummyTemplate.setDossierTemplateStatus(DossierTemplateStatus.INACTIVE);
dummyTemplate.setLayoutParsingType(LayoutParsingType.REDACT_MANAGER_WITHOUT_DUPLICATE_PARAGRAPH);
when(dossierTemplateRepository.findById(anyString())).thenReturn(Optional.of(dummyTemplate));
}

View File

@ -64,6 +64,7 @@ import com.iqser.red.service.persistence.management.v1.processor.dataexchange.se
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ApplicationConfigurationEntity;
import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles;
import com.iqser.red.service.persistence.management.v1.processor.service.ApplicationConfigService;
import com.iqser.red.service.persistence.management.v1.processor.service.CurrentApplicationTypeProvider;
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;
@ -116,6 +117,7 @@ import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverte
import com.knecon.fforesight.keycloakcommons.security.TenantAuthenticationManagerResolver;
import com.knecon.fforesight.mongo.database.commons.liquibase.TenantCreatedMongoEventHandler;
import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService;
import com.knecon.fforesight.tenantcommons.TenantApplicationType;
import com.knecon.fforesight.tenantcommons.TenantContext;
import com.knecon.fforesight.tenantcommons.TenantsClient;
import com.knecon.fforesight.tenantcommons.model.AuthDetails;
@ -129,8 +131,10 @@ import com.mongodb.MongoCommandException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.bson.BsonArray;
import org.bson.BsonDocument;
@ -146,8 +150,7 @@ import org.quartz.Scheduler;
@EnableFeignClients(basePackageClasses = FileClient.class)
@Import(AbstractPersistenceServerServiceTest.TestConfiguration.class)
@ContextConfiguration(initializers = {AbstractPersistenceServerServiceTest.Initializer.class})
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
properties = "spring-hibernate-query-utils.n-plus-one-queries-detection.error-level=INFO")
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = "spring-hibernate-query-utils.n-plus-one-queries-detection.error-level=INFO")
public abstract class AbstractPersistenceServerServiceTest {
public static final String TENANT_1 = "redaction";
@ -279,6 +282,8 @@ public abstract class AbstractPersistenceServerServiceTest {
private SystemManagedTypesImport systemManagedTypesImport;
@Autowired
private DictionaryManagementService dictionaryManagementService;
@MockBean
private CurrentApplicationTypeProvider currentApplicationTypeProvider;
private static String[] getAllRoles() {
@ -299,6 +304,15 @@ public abstract class AbstractPersistenceServerServiceTest {
public void setupTenantContext() {
TenantContext.setTenantId(TENANT_1);
when(currentApplicationTypeProvider.get()).thenReturn(getTenantApplicationType());
when(currentApplicationTypeProvider.isDocuMine()).thenReturn(getTenantApplicationType().equals(TenantApplicationType.DocuMine));
when(currentApplicationTypeProvider.isRedactManager()).thenReturn(getTenantApplicationType().equals(TenantApplicationType.RedactManager));
}
protected TenantApplicationType getTenantApplicationType() {
return TenantApplicationType.RedactManager;
}
@ -328,33 +342,33 @@ public abstract class AbstractPersistenceServerServiceTest {
var allUsers = new ArrayList<com.iqser.red.service.persistence.management.v1.processor.service.users.model.User>();
allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder()
.userId("manageradmin1@test.com")
.email("manageradmin1@test.com")
.isActive(true)
.roles(Set.of(getAllRoles()))
.build());
.userId("manageradmin1@test.com")
.email("manageradmin1@test.com")
.isActive(true)
.roles(Set.of(getAllRoles()))
.build());
allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder()
.userId("manageradmin2@test.com")
.email("manageradmin2@test.com")
.isActive(true)
.roles(Set.of(getAllRoles()))
.build());
.userId("manageradmin2@test.com")
.email("manageradmin2@test.com")
.isActive(true)
.roles(Set.of(getAllRoles()))
.build());
allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder()
.userId("manageradmin3@test.com")
.email("manageradmin3@test.com")
.isActive(true)
.roles(Set.of(getAllRoles()))
.build());
.userId("manageradmin3@test.com")
.email("manageradmin3@test.com")
.isActive(true)
.roles(Set.of(getAllRoles()))
.build());
Set<String> allRolesWithoutValid = Arrays.stream(getAllRoles())
.collect(Collectors.toSet());
allRolesWithoutValid.remove("RED_USER");
allRolesWithoutValid.remove("RED_MANAGER");
allUsers.add(com.iqser.red.service.persistence.management.v1.processor.service.users.model.User.builder()
.userId("manageradmin4@test.com")
.email("manageradmin4@test.com")
.isActive(true)
.roles(allRolesWithoutValid)
.build());
.userId("manageradmin4@test.com")
.email("manageradmin4@test.com")
.isActive(true)
.roles(allRolesWithoutValid)
.build());
when(usersClient.getAllUsers(false)).thenReturn(allUsers);
when(usersClient.getAllUsers(true)).thenReturn(allUsers);
// doNothing().when(pdfTronRedactionClient).testDigitalCurrentSignature(Mockito.any());
@ -362,18 +376,11 @@ public abstract class AbstractPersistenceServerServiceTest {
when(rabbitAdmin.getQueueInfo(any())).thenReturn(null);
when(entityLogService.getEntityLog(any(), any())).thenReturn(new EntityLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0));
when(entityLogService.getEntityLog(any(), any(), any(), Mockito.anyBoolean())).thenReturn(new EntityLog(1,
1,
Lists.newArrayList(),
null,
0,
0,
0,
0));
when(entityLogService.getEntityLog(any(), any(), any(), Mockito.anyBoolean())).thenReturn(new EntityLog(1, 1, Lists.newArrayList(), null, 0, 0, 0, 0));
when(redactionClient.testRules(any())).thenReturn(DroolsValidation.builder()
.syntaxErrorMessages(Collections.emptyList())
.deprecatedWarnings(Collections.emptyList())
.build());
.syntaxErrorMessages(Collections.emptyList())
.deprecatedWarnings(Collections.emptyList())
.build());
}
@ -392,41 +399,41 @@ public abstract class AbstractPersistenceServerServiceTest {
redactionTenant.setDisplayName(TENANT_1);
redactionTenant.setAuthDetails(new AuthDetails());
redactionTenant.setDatabaseConnection(DatabaseConnection.builder()
.driver("postgresql")
.host(postgreSQLContainerMaster.getHost())
.port(port)
.database("integration-tests-db-master")
.schema("public")
.username("sa")
.password(encryptionDecryptionService.encrypt("sa"))
.build());
.driver("postgresql")
.host(postgreSQLContainerMaster.getHost())
.port(port)
.database("integration-tests-db-master")
.schema("public")
.username("sa")
.password(encryptionDecryptionService.encrypt("sa"))
.build());
redactionTenant.setSearchConnection(SearchConnection.builder()
.hosts(Set.of("elasticsearchHost"))
.port(9200)
.scheme("https")
.username("elastic")
.numberOfShards("1")
.numberOfReplicas("5")
.build());
.hosts(Set.of("elasticsearchHost"))
.port(9200)
.scheme("https")
.username("elastic")
.numberOfShards("1")
.numberOfReplicas("5")
.build());
redactionTenant.setS3StorageConnection(S3StorageConnection.builder()
.key("key")
.secret("secret")
.signerType("signerType")
.bucketName("bucketName")
.region("eu")
.endpoint("endpoint")
.build());
.key("key")
.secret("secret")
.signerType("signerType")
.bucketName("bucketName")
.region("eu")
.endpoint("endpoint")
.build());
redactionTenant.setMongoDBConnection(MongoDBConnection.builder()
.prefix("mongodb")
.username(MONGO_USERNAME)
.password(encryptionDecryptionService.encrypt(MONGO_PASSWORD))
.address(mongoDbContainer.getHost() + ":" + mongoDbContainer.getFirstMappedPort())
.database(MONGO_DATABASE)
.options("")
.build());
.prefix("mongodb")
.username(MONGO_USERNAME)
.password(encryptionDecryptionService.encrypt(MONGO_PASSWORD))
.address(mongoDbContainer.getHost() + ":" + mongoDbContainer.getFirstMappedPort())
.database(MONGO_DATABASE)
.options("")
.build());
var redactionTenant2 = new TenantResponse();
redactionTenant2.setTenantId(TENANT_2);
@ -434,41 +441,41 @@ public abstract class AbstractPersistenceServerServiceTest {
redactionTenant2.setDisplayName(TENANT_2);
redactionTenant2.setAuthDetails(new AuthDetails());
redactionTenant2.setDatabaseConnection(DatabaseConnection.builder()
.driver("postgresql")
.host(postgreSQLContainerMaster.getHost())
.port(port)
.database("integration-tests-db-master")
.schema("public")
.username("sa")
.password(encryptionDecryptionService.encrypt("sa"))
.build());
.driver("postgresql")
.host(postgreSQLContainerMaster.getHost())
.port(port)
.database("integration-tests-db-master")
.schema("public")
.username("sa")
.password(encryptionDecryptionService.encrypt("sa"))
.build());
redactionTenant2.setSearchConnection(SearchConnection.builder()
.hosts(Set.of("elasticsearchHost"))
.port(9200)
.scheme("https")
.username("elastic")
.numberOfShards("1")
.numberOfReplicas("5")
.build());
.hosts(Set.of("elasticsearchHost"))
.port(9200)
.scheme("https")
.username("elastic")
.numberOfShards("1")
.numberOfReplicas("5")
.build());
redactionTenant2.setS3StorageConnection(S3StorageConnection.builder()
.key("key")
.secret("secret")
.signerType("signerType")
.bucketName("bucketName")
.region("eu")
.endpoint("endpoint")
.build());
.key("key")
.secret("secret")
.signerType("signerType")
.bucketName("bucketName")
.region("eu")
.endpoint("endpoint")
.build());
redactionTenant2.setMongoDBConnection(MongoDBConnection.builder()
.prefix("mongodb")
.username(MONGO_USERNAME)
.password(encryptionDecryptionService.encrypt(MONGO_PASSWORD))
.address(mongoDbContainer.getHost() + ":" + mongoDbContainer.getFirstMappedPort())
.database(TENANT_2)
.options("")
.build());
.prefix("mongodb")
.username(MONGO_USERNAME)
.password(encryptionDecryptionService.encrypt(MONGO_PASSWORD))
.address(mongoDbContainer.getHost() + ":" + mongoDbContainer.getFirstMappedPort())
.database(TENANT_2)
.options("")
.build());
when(tenantsClient.getTenant(TENANT_1)).thenReturn(redactionTenant);
when(tenantsClient.getTenant(TENANT_2)).thenReturn(redactionTenant2);
@ -593,14 +600,14 @@ public abstract class AbstractPersistenceServerServiceTest {
log.info("Hosts are - Redis: {}, Postgres: {}, MongoDB: {}", redisContainer.getHost(), postgreSQLContainerMaster.getHost(), mongoInstance.getHost());
TestPropertyValues.of("REDIS_PORT=" + redisContainer.getFirstMappedPort(),
"REDIS_HOST=" + redisContainer.getHost(),
"MONGODB_HOST=" + mongoInstance.getHost(),
"MONGODB_PORT=" + mongoInstance.getFirstMappedPort(),
"MONGODB_USER=" + MONGO_USERNAME,
"MONGODB_PASSWORD=" + MONGO_PASSWORD,
"fforesight.jobs.enabled=false",
"fforesight.keycloak.enabled=false",
"POD_NAME=persistence-service").applyTo(configurableApplicationContext.getEnvironment());
"REDIS_HOST=" + redisContainer.getHost(),
"MONGODB_HOST=" + mongoInstance.getHost(),
"MONGODB_PORT=" + mongoInstance.getFirstMappedPort(),
"MONGODB_USER=" + MONGO_USERNAME,
"MONGODB_PASSWORD=" + MONGO_PASSWORD,
"fforesight.jobs.enabled=false",
"fforesight.keycloak.enabled=false",
"POD_NAME=persistence-service").applyTo(configurableApplicationContext.getEnvironment());
}
@ -608,10 +615,10 @@ public abstract class AbstractPersistenceServerServiceTest {
private static void createMongoDBDatabase(MongoDBTestContainer mongoDBTestContainer, String databaseName) {
try (MongoClient mongoClient = MongoClients.create(String.format("mongodb://%s:%s@%s:%s/",
MONGO_USERNAME,
MONGO_PASSWORD,
mongoDBTestContainer.getHost(),
mongoDBTestContainer.getFirstMappedPort()))) {
MONGO_USERNAME,
MONGO_PASSWORD,
mongoDBTestContainer.getHost(),
mongoDBTestContainer.getFirstMappedPort()))) {
MongoDatabase database = mongoClient.getDatabase(databaseName);
BsonDocument createUserCommand = new BsonDocument();
createUserCommand.append("createUser", new BsonString(MONGO_USERNAME));
@ -651,6 +658,7 @@ public abstract class AbstractPersistenceServerServiceTest {
return mock;
}
@Bean
public InMemoryUserDetailsManager userDetailsService(PasswordEncoder passwordEncoder) {

View File

@ -1,7 +1,5 @@
monitoring.enabled: true
application:
type: "RedactManager"
spring:
main:

View File

@ -6,6 +6,11 @@ plugins {
val springBootStarterVersion = "3.1.5"
dependencies {
api("com.knecon.fforesight:layoutparser-service-internal-api:0.188.0") {
exclude(group = "com.iqser.red.service", module = "persistence-service-internal-api-v1")
exclude(group = "com.iqser.red.service", module = "persistence-service-shared-api-v1")
}
api("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.2")
api("com.google.guava:guava:31.1-jre")
api("org.springframework.boot:spring-boot-starter-validation:3.1.3")

View File

@ -4,6 +4,8 @@ import java.time.OffsetDateTime;
import java.util.HashSet;
import java.util.Set;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -41,4 +43,6 @@ public class CreateOrUpdateDossierTemplateRequest {
private boolean removeWatermark;
private LayoutParsingType layoutParsingType;
}

View File

@ -5,6 +5,7 @@ import java.util.HashSet;
import java.util.Set;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -36,5 +37,6 @@ public class DossierTemplate {
private boolean applyDictionaryUpdatesToAllDossiersByDefault;
private boolean ocrByDefault;
private boolean removeWatermark;
private LayoutParsingType layoutParsingType;
}

View File

@ -12,7 +12,7 @@ dependencies {
api("com.knecon.fforesight:mongo-database-commons:0.16.0") {
exclude(group = "com.knecon.fforesight", module = "tenant-commons")
}
api("com.knecon.fforesight:tenant-commons:0.31.0")
api("com.knecon.fforesight:tenant-commons:0.31.0-RED10196.0")
api("org.springframework.boot:spring-boot-starter-data-mongodb:${springBootStarterVersion}")
api("org.springframework.boot:spring-boot-starter-validation:3.1.3")
testImplementation("com.iqser.red.commons:test-commons:2.1.0")