From b9e6e63c2ff3b33319511760ec974e96f72b4658 Mon Sep 17 00:00:00 2001 From: devplant Date: Wed, 31 May 2023 18:37:14 +0300 Subject: [PATCH] RED-6485 - Dossier-only entity setting in the dossier template - add to flag to type entity to indicate if it is dossier dictionary only - prevent update of that flag - return the added information to dictionary and type result - update junit tests --- .../v1/processor/entity/configuration/TypeEntity.java | 3 +++ .../migrations/ManualRedactionTypeMigration9.java | 3 ++- .../service/DictionaryManagementService.java | 3 ++- .../v1/processor/service/DictionaryService.java | 4 ++++ .../processor/service/DossierManagementService.java | 1 + .../service/DossierTemplateCloneService.java | 3 ++- .../persistence/DictionaryPersistenceService.java | 6 ++++-- .../resources/db/changelog/db.changelog-tenant.yaml | 2 ++ .../tenant/51-add-dossier-dictionary-only-flag.yaml | 11 +++++++++++ .../v1/server/integration/tests/DictionaryTest.java | 10 ++++++++-- .../v1/server/integration/tests/DossierTest.java | 9 +++++++++ .../service/v1/api/shared/model/CreateTypeValue.java | 3 +++ .../service/v1/api/shared/model/Dictionary.java | 3 +++ .../service/v1/api/shared/model/TypeValue.java | 3 +++ .../api/shared/model/dossiertemplate/type/Type.java | 1 + 15 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/51-add-dossier-dictionary-only-flag.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java index 01dd990c6..40756b5f1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/configuration/TypeEntity.java @@ -61,6 +61,9 @@ public class TypeEntity { @Column private OffsetDateTime softDeletedTime; + @Column + private boolean dossierDictionaryOnly; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dossier_template_id") private DossierTemplateEntity dossierTemplate; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java index 3052259ad..a5bbcad6f 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/migration/migrations/ManualRedactionTypeMigration9.java @@ -69,7 +69,8 @@ public class ManualRedactionTypeMigration9 extends Migration { null, false, true, - false); + false, + true); }); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java index 80d96ad1c..3b2296f39 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryManagementService.java @@ -92,7 +92,8 @@ public class DictionaryManagementService { typeRequest.getDossierId(), typeRequest.isHasDictionary(), typeRequest.isSystemManaged(), - typeRequest.isAutoHideSkipped()), Type.class, new TypeMapper()); + typeRequest.isAutoHideSkipped(), + typeRequest.isDossierDictionaryOnly()), Type.class, new TypeMapper()); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java index 50b540950..ed68893e1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DictionaryService.java @@ -92,6 +92,7 @@ public class DictionaryService { accessControlService.verifyUserHasAccessPermissions(dossierId); accessControlService.verifyUserIsMemberOrApprover(dossierId); + //TODO: check if dossier type exists and dossier template type exists deleteEntries(toTypeId(type, dossierTemplateId, dossierId), entries, dictionaryEntryType); } @@ -158,6 +159,7 @@ public class DictionaryService { .hasDictionary(typeValue.isHasDictionary()) .systemManaged(false) .autoHideSkipped(typeValue.isAutoHideSkipped()) + .dossierDictionaryOnly(dossierId != null && typeValue.isDossierDictionaryOnly()) .build()); } @@ -223,6 +225,7 @@ public class DictionaryService { .hasDictionary(typeResult.isHasDictionary()) .systemManaged(typeResult.isSystemManaged()) .autoHideSkipped(typeResult.isAutoHideSkipped()) + .dossierDictionaryOnly(typeResult.isDossierDictionaryOnly()) .build()) .collect(Collectors.toList()); return new TypeResponse(typeValues); @@ -271,6 +274,7 @@ public class DictionaryService { .hasDictionary(dictionaryForType.isHasDictionary()) .systemManaged(dictionaryForType.isSystemManaged()) .autoHideSkipped(dictionaryForType.isAutoHideSkipped()) + .dossierDictionaryOnly(dictionaryForType.isDossierDictionaryOnly()) .build(); } catch (AccessDeniedException e) { throw new NotFoundException("Object not found"); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java index 60378d67b..f2a5993ca 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierManagementService.java @@ -291,6 +291,7 @@ public class DossierManagementService { .dossierId(dossierId) .hasDictionary(true) .systemManaged(true) + .dossierDictionaryOnly(true) .build()); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index 5a9d00ee2..761fca60e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -157,7 +157,8 @@ public class DossierTemplateCloneService { null, t.isHasDictionary(), t.isSystemManaged(), - t.isAutoHideSkipped()); + t.isAutoHideSkipped(), + t.isDossierDictionaryOnly()); entryPersistenceService.cloneEntries(t.getId(), type.getId()); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java index 6dfd07bc2..dbe5215d6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DictionaryPersistenceService.java @@ -51,7 +51,7 @@ public class DictionaryPersistenceService { String dossierId, boolean hasDictionary, boolean systemManaged, - boolean autoHideSkipped) { + boolean autoHideSkipped, boolean dossierDictionaryOnly) { checkRankAlreadyExists(type, dossierTemplateId, rank, dossierId); @@ -75,6 +75,7 @@ public class DictionaryPersistenceService { .systemManaged(systemManaged) .autoHideSkipped(autoHideSkipped) .softDeletedTime(null) + .dossierDictionaryOnly(dossierDictionaryOnly) .build(); return typeRepository.saveAndFlush(t); @@ -128,7 +129,8 @@ public class DictionaryPersistenceService { "dossierTemplate", "dossier", "id", - "version"); + "version", + "dossierDictionaryOnly"); } typeRepository.save(type); }); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index 1a2cfd855..56693619d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -135,3 +135,5 @@ databaseChangeLog: file: db/changelog/tenant/sql/49-add-keep_overlapping_objects.sql - include: file: db/changelog/tenant/50-add-file-status-error-info.yaml + - include: + file: db/changelog/tenant/51-add-dossier-dictionary-only-flag.yaml diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/51-add-dossier-dictionary-only-flag.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/51-add-dossier-dictionary-only-flag.yaml new file mode 100644 index 000000000..6b40bc857 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/51-add-dossier-dictionary-only-flag.yaml @@ -0,0 +1,11 @@ +databaseChangeLog: + - changeSet: + id: add-dossier-dictionary-only-flag + author: corinaolariu + changes: + - addColumn: + columns: + - column: + name: dossier_dictionary_only + type: BOOLEAN + tableName: entity \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java index 9a263ddfc..7efb0e40e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java @@ -48,6 +48,7 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var type = typeProvider.testAndProvideType(dossierTemplate); assertThat(type.getRecommendationHexColor()).isEqualTo("#aaaaaa"); assertThat(type.getSkippedHexColor()).isEqualTo("#aaaaaa"); + assertThat(type.isDossierDictionaryOnly()).isFalse(); dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("word1", "word2"), false, null, DictionaryEntryType.ENTRY); dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("false_positive1", "false_positive"), false, null, DictionaryEntryType.FALSE_POSITIVE); @@ -181,6 +182,7 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { dictionary = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); assertThat(dictionary.getEntries()).hasSize(1); assertThat(dictionary.getEntries().iterator().next()).isEqualTo(word); + assertThat((dictionary.isDossierDictionaryOnly())).isFalse(); // Act & Assert: Delete word; Should have 'deleted' flag entries = new ArrayList<>(); @@ -246,7 +248,7 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); - dictionaryClient.addType(CreateTypeValue.builder() + var returnedtype1 = dictionaryClient.addType(CreateTypeValue.builder() .type("dossier_redaction_2") .label("Dossier Redactions") .hexColor("#fcba03") @@ -257,13 +259,15 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossier.getDossierTemplateId()) + .dossierDictionaryOnly(true) .build(), dossier.getId()); + assertThat(returnedtype1.isDossierDictionaryOnly()).isTrue(); var dossierTemplate = dossierTemplateClient.getDossierTemplate(dossier.getDossierTemplateId()); var dossier2 = dossierTesterAndProvider.provideTestDossier(dossierTemplate, "dossier2"); - dictionaryClient.addType(CreateTypeValue.builder() + var returnedType2 = dictionaryClient.addType(CreateTypeValue.builder() .type("dossier_redaction_2") .label("Dossier Redactions 2") .hexColor("#fcba03") @@ -273,7 +277,9 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { .description("Something") .addToDictionaryAction(false) .dossierTemplateId(dossier2.getDossierTemplateId()) + .dossierDictionaryOnly(true) .build(), dossier2.getId()); + assertThat(returnedType2.isDossierDictionaryOnly()).isTrue(); assertThat(dictionaryClient.getAllTypes(dossier.getDossierTemplateId(), null, false).getTypes()).isEmpty(); assertThat(dictionaryClient.getAllTypes(dossier.getDossierTemplateId(), dossier.getId(), false).getTypes().size()).isEqualTo(2); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java index 7746a17d3..5b265fce5 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTest.java @@ -1,6 +1,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.time.OffsetDateTime; @@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockMultipartFile; import com.google.common.collect.Sets; +import com.iqser.red.service.peristence.v1.server.integration.client.DictionaryClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatusClient; import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient; @@ -53,6 +55,9 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { @Autowired private DossierStatusClient dossierStatusClient; + @Autowired + private DictionaryClient dictionaryClient; + @Autowired private WatermarkClient watermarkClient; @@ -101,6 +106,10 @@ public class DossierTest extends AbstractPersistenceServerServiceTest { var dossier = dossierTesterAndProvider.provideTestDossier(); + var returnedTypes = dictionaryClient.getAllTypes(dossier.getDossierTemplateId(), dossier.getDossierId(), false); + assertThat(returnedTypes.getTypes().size()).isEqualTo(1); + assertThat(returnedTypes.getTypes().get(0).isDossierDictionaryOnly()).isTrue(); + var watermark = new WatermarkModel(); watermark.setName("watermark name"); watermark.setEnabled(true); diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java index 231915a05..988440e74 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/CreateTypeValue.java @@ -61,4 +61,7 @@ public class CreateTypeValue { @Schema(description = "If the ui should hide entries of this type by default if they are skipped") private boolean autoHideSkipped; + @Schema(description = "Flag to indicate the dictionary is on dossier level only") + private boolean dossierDictionaryOnly; + } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java index 9b5231499..b32db4bbe 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/Dictionary.java @@ -67,4 +67,7 @@ public class Dictionary { @Schema(description = "If the ui should hide entries of this type by default if they are skipped") private boolean autoHideSkipped; + @Schema(description = "Flag to indicate the dictionary is on dossier level only") + private boolean dossierDictionaryOnly; + } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java index 008be0dd2..c3fa1a03b 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/TypeValue.java @@ -62,4 +62,7 @@ public class TypeValue { @Schema(description = "If the ui should hide entries of this type by default if they are skipped") private boolean autoHideSkipped; + @Schema(description = "Flag to indicate the dictionary is on dossier level only") + private boolean dossierDictionaryOnly; + } 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/type/Type.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/Type.java index 6335ad51b..ee93e48d9 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/Type.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/type/Type.java @@ -30,6 +30,7 @@ public class Type { private String description; private long version; private boolean addToDictionaryAction; + private boolean dossierDictionaryOnly; private String dossierTemplateId; private String dossierId; private List entries = new ArrayList<>();