From af68d2f74f82e7c160f3e6f3a83cedd9bd7b7089 Mon Sep 17 00:00:00 2001 From: deiflaender Date: Mon, 6 Dec 2021 14:41:38 +0100 Subject: [PATCH] RED-2808: Check if dossier template name is unique in code, as uniqueConstraint on name and nullable soft_delete_time column is not working --- .../entity/dossier/DossierTemplateEntity.java | 2 +- .../DossierTemplatePersistenceService.java | 14 ++++++++++++++ .../db/changelog/1-initial-schema.changelog.yaml | 8 -------- .../integration/tests/DossierTemplateTest.java | 9 +++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java index 6eb1e7905..64ebe4936 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierTemplateEntity.java @@ -21,7 +21,7 @@ import java.util.Set; @Builder @AllArgsConstructor @NoArgsConstructor -@Table(name = "dossier_template", uniqueConstraints={@UniqueConstraint(columnNames = {"name", "soft_delete_time"})}) +@Table(name = "dossier_template") public class DossierTemplateEntity { @Id 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 2166145ab..718fda87a 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 @@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity; 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.persistence.repository.DossierTemplateRepository; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; @@ -31,6 +32,11 @@ public class DossierTemplatePersistenceService { if (createOrUpdateDossierRequest.getDossierTemplateId() != null) { Optional dossierTemplate = dossierTemplateRepository.findById(createOrUpdateDossierRequest.getDossierTemplateId()); if (dossierTemplate.isPresent()) { + + if(!dossierTemplate.get().getName().equals(createOrUpdateDossierRequest.getName())){ + validateDossierTemplateNameIsUnique(createOrUpdateDossierRequest.getName()); + } + // order is important BeanUtils.copyProperties(createOrUpdateDossierRequest, dossierTemplate.get()); dossierTemplate.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); @@ -40,6 +46,7 @@ public class DossierTemplatePersistenceService { throw new NotFoundException(String.format(DOSSIER_TEMPLATE_NOT_FOUND_MESSAGE, createOrUpdateDossierRequest.getDossierTemplateId())); } } else { + validateDossierTemplateNameIsUnique(createOrUpdateDossierRequest.getName()); DossierTemplateEntity dossierTemplate = new DossierTemplateEntity(); dossierTemplate.setId(UUID.randomUUID().toString()); // order is important @@ -51,6 +58,13 @@ public class DossierTemplatePersistenceService { } + public void validateDossierTemplateNameIsUnique(String templateName){ + getAllDossierTemplates().forEach(existing -> { + if(existing.getName().equals(templateName)){ + throw new ConflictException("DossierTemplate name must be unique"); + } + }); + } public List getAllDossierTemplates() { return dossierTemplateRepository.findAllWhereDeletedIsFalse(); diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/1-initial-schema.changelog.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/1-initial-schema.changelog.yaml index 9ab65641e..49170329f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/1-initial-schema.changelog.yaml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/1-initial-schema.changelog.yaml @@ -1431,14 +1431,6 @@ databaseChangeLog: referencedColumnNames: id referencedTableName: dossier_template validate: true - - changeSet: - id: 1637073006104-55 - author: generated - changes: - - addUniqueConstraint: - columnNames: name, soft_delete_time - constraintName: uknuk7ickn8wqo3d7tlht6t54rn - tableName: dossier_template - changeSet: id: 1637073006104-56 author: generated diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java index 3c0963bcd..e36e85240 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierTemplateTest.java @@ -74,4 +74,13 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest { assertThat(dossierTemplateClient.getAllDossierTemplates().isEmpty()).isTrue(); } + + @Test(expected = FeignException.class) + public void testDossierTemplateUniqueNameConflict(){ + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossierTemplate2 = dossierTemplateTesterAndProvider.provideTestTemplate(); + } + + + }