From 4d36a3d8137f5363427781a91e41147ef9031ac6 Mon Sep 17 00:00:00 2001 From: Maverick Studer Date: Mon, 11 Nov 2024 12:54:31 +0100 Subject: [PATCH] RED-10196: Backend adaptions for RM/DM unification --- ...er.red.service.java-conventions.gradle.kts | 2 +- .../controller/ComponentControllerV2.java | 8 +- .../impl/controller/DossierControllerV2.java | 26 ++- .../build.gradle.kts | 8 +- .../service/DossierTemplateImportService.java | 79 ++++--- .../migration/SaasMigrationService.java | 6 +- .../AddDateFormatsToTemplatesMigration25.java | 21 +- .../ComponentOverridesMigration21.java | 12 +- .../DocumineLayoutRewriteMigration20.java | 11 +- .../CurrentApplicationTypeProvider.java | 44 ++++ .../processor/service/FileStatusService.java | 24 +- .../service/LayoutParsingTypeProvider.java | 27 +++ .../LayoutParsingRequestFactory.java | 18 +- .../DossierTemplatePersistenceService.java | 34 +-- .../repository/DossierTemplateRepository.java | 5 + .../src/main/resources/application.yaml | 1 - ...DateFormatsToTemplatesMigration25Test.java | 8 + .../tests/ComponentControllerV2Test.java | 17 +- .../tests/ComponentOverrideTest.java | 12 +- ...eCloneAndExportWithDuplicateRanksTest.java | 13 ++ .../DossierTemplateCloneServiceTest.java | 16 +- .../AbstractPersistenceServerServiceTest.java | 214 +++++++++--------- .../src/test/resources/application.yml | 2 - .../build.gradle.kts | 5 + .../CreateOrUpdateDossierTemplateRequest.java | 4 + .../dossiertemplate/DossierTemplate.java | 2 + .../build.gradle.kts | 2 +- 27 files changed, 360 insertions(+), 261 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CurrentApplicationTypeProvider.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LayoutParsingTypeProvider.java diff --git a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts index d99698532..370f0c9d4 100644 --- a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts @@ -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" } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java index 9240293d8..050659512 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java @@ -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"); } } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierControllerV2.java index 195734201..0ef797520 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierControllerV2.java @@ -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) diff --git a/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts b/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts index c2565490f..95c416b4a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts +++ b/persistence-service-v1/persistence-service-processor-v1/build.gradle.kts @@ -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") { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java index 4985fb7a3..306dc4e7e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java @@ -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) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java index 0c288bc0f..e2459e576 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/SaasMigrationService.java @@ -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); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/AddDateFormatsToTemplatesMigration25.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/AddDateFormatsToTemplatesMigration25.java index e64576207..d71516072 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/AddDateFormatsToTemplatesMigration25.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/AddDateFormatsToTemplatesMigration25.java @@ -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; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ComponentOverridesMigration21.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ComponentOverridesMigration21.java index 35ce22187..1678a3e53 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ComponentOverridesMigration21.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ComponentOverridesMigration21.java @@ -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!"); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DocumineLayoutRewriteMigration20.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DocumineLayoutRewriteMigration20.java index 3e7f0db60..eb9777095 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DocumineLayoutRewriteMigration20.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/DocumineLayoutRewriteMigration20.java @@ -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; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CurrentApplicationTypeProvider.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CurrentApplicationTypeProvider.java new file mode 100644 index 000000000..6539711e4 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/CurrentApplicationTypeProvider.java @@ -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 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); + } + +} + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java index 2ded0e6b0..41f51d8bb 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileStatusService.java @@ -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); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LayoutParsingTypeProvider.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LayoutParsingTypeProvider.java new file mode 100644 index 000000000..f26b0f40c --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/LayoutParsingTypeProvider.java @@ -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; + }; + } + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/layoutparsing/LayoutParsingRequestFactory.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/layoutparsing/LayoutParsingRequestFactory.java index 43c923a49..fc2a5a94e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/layoutparsing/LayoutParsingRequestFactory.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/layoutparsing/LayoutParsingRequestFactory.java @@ -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 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) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java index 5964a48b3..bfb30761c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierTemplatePersistenceService.java @@ -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)) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierTemplateRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierTemplateRepository.java index faf834674..4052a8c8f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierTemplateRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierTemplateRepository.java @@ -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 { @@ -28,4 +29,8 @@ public interface DossierTemplateRepository extends JpaRepository findLayoutParsingTypeByIdAndNotDeleted(@Param("dossierTemplateId") String dossierTemplateId); + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml index c71ceb3e9..967a19f9e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/application.yaml @@ -15,7 +15,6 @@ kubernetes.namespace: ${NAMESPACE:default} project.version: 1.0-SNAPSHOT application: - type: "RedactManager" rss.component-log.enabled: false server: diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AddDateFormatsToTemplatesMigration25Test.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AddDateFormatsToTemplatesMigration25Test.java index e77086113..9d55b69d5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AddDateFormatsToTemplatesMigration25Test.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AddDateFormatsToTemplatesMigration25Test.java @@ -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() { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentControllerV2Test.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentControllerV2Test.java index 46e110a4e..bc7010fa1 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentControllerV2Test.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentControllerV2Test.java @@ -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(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java index 4fa633a7d..ef7542f32 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -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; } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java index b38784a2f..42d4df1a3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneAndExportWithDuplicateRanksTest.java @@ -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); + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java index 52049bf69..a1cd561e3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateCloneServiceTest.java @@ -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)); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index 81c1959bc..ecc744a57 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -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(); 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 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) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml index dc7e53456..ffc5e8753 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/application.yml @@ -1,7 +1,5 @@ monitoring.enabled: true -application: - type: "RedactManager" spring: main: diff --git a/persistence-service-v1/persistence-service-shared-api-v1/build.gradle.kts b/persistence-service-v1/persistence-service-shared-api-v1/build.gradle.kts index 4aa191137..cddbf678d 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/build.gradle.kts +++ b/persistence-service-v1/persistence-service-shared-api-v1/build.gradle.kts @@ -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") diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java index f7923d336..abbc175f9 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/CreateOrUpdateDossierTemplateRequest.java @@ -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; + } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java index 072b75dfa..dd2ead36a 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierTemplate.java @@ -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; } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/build.gradle.kts b/persistence-service-v1/persistence-service-shared-mongo-v1/build.gradle.kts index 81f45bd43..7feff854d 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/build.gradle.kts +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/build.gradle.kts @@ -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")