From 97cc851de11c3f0a1915e234f569e3170ad85679 Mon Sep 17 00:00:00 2001 From: Maverick Studer Date: Wed, 7 Feb 2024 14:01:06 +0100 Subject: [PATCH] RED-8432: Return 400 if invalid input for attributes is given --- .../dossier/DossierAttributeConfigEntity.java | 1 + .../dossier/FileAttributeConfigEntity.java | 1 + .../DossierAttributesManagementService.java | 41 ++++++- .../FileAttributesManagementService.java | 51 ++++++++- .../tests/DossierAttributeTest.java | 101 +++++++++++++++++- .../integration/tests/FileAttributeTest.java | 59 ++++++++++ .../DossierAttributeConfig.java | 1 + .../dossier/DossierAttributeTypeFormats.java | 10 ++ .../dossier/file/FileAttributeConfig.java | 5 +- .../file/FileAttributeTypeFormats.java | 8 ++ 10 files changed, 266 insertions(+), 12 deletions(-) create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttributeTypeFormats.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeTypeFormats.java diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java index 68f6c7e11..d32875d31 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierAttributeConfigEntity.java @@ -34,6 +34,7 @@ public class DossierAttributeConfigEntity { @Column @Enumerated(EnumType.STRING) + @Builder.Default private DossierAttributeType type = DossierAttributeType.TEXT; @ManyToOne diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java index 21830d49d..4a182c0b8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/FileAttributeConfigEntity.java @@ -42,6 +42,7 @@ public class FileAttributeConfigEntity { private String placeholder; @Column @Enumerated(EnumType.STRING) + @Builder.Default private FileAttributeType type = FileAttributeType.TEXT; @ManyToOne diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java index bcb589bdb..a94fc7b4e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierAttributesManagementService.java @@ -1,9 +1,14 @@ package com.iqser.red.service.persistence.management.v1.processor.service; +import static com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeTypeFormats.DOSSIER_ATTRIBUTE_TYPE_DATE_FORMAT; +import static com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeTypeFormats.DOSSIER_ATTRIBUTE_TYPE_IMAGE_REGEX; +import static com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeTypeFormats.DOSSIER_ATTRIBUTE_TYPE_NUMBER_REGEX; + import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.apache.commons.validator.routines.DateValidator; import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; @@ -31,7 +36,7 @@ public class DossierAttributesManagementService { var dossier = dossierService.getDossierById(dossierId); var config = dossierAttributeConfigPersistenceService.getDossierAttributes(dossier.getDossierTemplateId()); - var typeById = config.stream().collect(Collectors.toMap(entry -> entry.getId(), entry -> entry.getType())); + var typeById = config.stream().collect(Collectors.toMap(DossierAttributeConfigEntity::getId, DossierAttributeConfigEntity::getType)); for (DossierAttribute dossierAttribute : dossierAttributes) { validateDossierAttribute(typeById, dossierAttribute); } @@ -53,14 +58,42 @@ public class DossierAttributesManagementService { } DossierAttributeType type = typeById.get(dossierAttribute.getDossierAttributeConfigId()); - if (type.equals(DossierAttributeType.IMAGE) && dossierAttribute.getValue() != null && !(dossierAttribute.getValue() - .startsWith("data:image/png;base64") || dossierAttribute.getValue().startsWith("data:image/jpg;base64") || dossierAttribute.getValue() - .startsWith("data:image/jpeg;base64"))) { + String value = dossierAttribute.getValue(); + if (value != null) { + switch (type) { + case IMAGE -> validateImageString(value); + case DATE -> validateDateString(value); + case NUMBER -> validateNumberString(value); + } + } + } + + + private void validateImageString(String imageString) { + + if (!imageString.matches(DOSSIER_ATTRIBUTE_TYPE_IMAGE_REGEX)) { throw new BadRequestException("Only png, jpg and jpeg files are allowed for image dossier attributes"); } } + private void validateDateString(String dateString) { + + DateValidator validator = DateValidator.getInstance(); + if (!validator.isValid(dateString, DOSSIER_ATTRIBUTE_TYPE_DATE_FORMAT)) { + throw new BadRequestException("Invalid date given for date dossier attributes"); + } + } + + + private void validateNumberString(String numberString) { + + if (!numberString.matches(DOSSIER_ATTRIBUTE_TYPE_NUMBER_REGEX)) { + throw new BadRequestException("Only numbers are allowed for number dossier attributes"); + } + } + + public List getDossierAttributes(String dossierId) { return MagicConverter.convert(dossierAttributePersistenceService.getDossierAttributes(dossierId), DossierAttribute.class); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java index 5fff0c65d..f693095de 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/FileAttributesManagementService.java @@ -1,5 +1,8 @@ package com.iqser.red.service.persistence.management.v1.processor.service; +import static com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeTypeFormats.FILE_ATTRIBUTE_TYPE_DATE_FORMAT; +import static com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeTypeFormats.FILE_ATTRIBUTE_TYPE_NUMBER_REGEX; + import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -19,6 +22,7 @@ import java.util.stream.Collectors; import jakarta.transaction.Transactional; +import org.apache.commons.validator.routines.DateValidator; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; @@ -26,13 +30,14 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.configur import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; 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.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; import com.iqser.red.service.search.v1.model.IndexMessageType; import com.opencsv.CSVParser; @@ -140,7 +145,7 @@ public class FileAttributesManagementService { try (CSVReader csvReader = new CSVReaderBuilder(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(csv), parseEncoding(encoding)))).withCSVParser(parser) .build()) { - records.addAll(csvReader.readAll().stream().map(Lists::newArrayList).collect(Collectors.toList())); + records.addAll(csvReader.readAll().stream().map(Lists::newArrayList).toList()); } catch (IOException | CsvException e) { log.error("Failed to process CSV", e); } @@ -166,10 +171,52 @@ public class FileAttributesManagementService { @Transactional public void setFileAttributes(String dossierId, String fileId, Map fileAttributesMap) { + var dossier = dossierPersistenceService.findByDossierId(dossierId); + var config = fileAttributeConfigPersistenceService.getFileAttributes(dossier.getDossierTemplateId()); + + var typeById = config.stream().collect(Collectors.toMap(FileAttributeConfigEntity::getId, FileAttributeConfigEntity::getType)); + + for (String fileAttributeConfigId : fileAttributesMap.keySet()) { + validateFileAttribute(typeById, fileAttributeConfigId, fileAttributesMap.get(fileAttributeConfigId)); + } + fileStatusPersistenceService.setFileAttributes(dossierId, fileId, fileAttributesMap); fileStatusService.setStatusReprocess(dossierId, fileId, true); indexingService.addToIndexingQueue(IndexMessageType.UPDATE, null, dossierId, fileId, 2); } + + private void validateFileAttribute(Map typeById, String fileAttributeConfigId, String value) { + + if (!typeById.containsKey(fileAttributeConfigId)) { + throw new ConflictException("File attribute configuration does not exist."); + } + + FileAttributeType type = typeById.get(fileAttributeConfigId); + if (value != null) { + switch (type) { + case DATE -> validateDateString(value); + case NUMBER -> validateNumberString(value); + } + } + } + + + private void validateDateString(String dateString) { + + DateValidator validator = DateValidator.getInstance(); + if (!validator.isValid(dateString, FILE_ATTRIBUTE_TYPE_DATE_FORMAT)) { + throw new BadRequestException("Invalid date given for date file attributes"); + } + } + + + private void validateNumberString(String numberString) { + + if (!numberString.matches(FILE_ATTRIBUTE_TYPE_NUMBER_REGEX)) { + throw new BadRequestException("Only numbers are allowed for number file attributes"); + } + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java index d16e628b3..9219827b3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierAttributeTest.java @@ -1,6 +1,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.List; @@ -20,6 +22,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttributeType; +import feign.FeignException; import lombok.SneakyThrows; public class DossierAttributeTest extends AbstractPersistenceServerServiceTest { @@ -53,8 +56,7 @@ public class DossierAttributeTest extends AbstractPersistenceServerServiceTest { assertThat(loadedAttributes.getDossierAttributeConfigs()).isNotEmpty(); attribute.setLabel("updated test"); - var updated = dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), attribute); - loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + var updated = dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), attribute); assertThat(updated.getLabel()).isEqualTo("updated test"); assertThat(updated.getPlaceholder()).isEqualTo("{{dossier.attribute.UpdatedTest}}"); @@ -118,4 +120,99 @@ public class DossierAttributeTest extends AbstractPersistenceServerServiceTest { } + + @SneakyThrows + @Test + public void testSetDossierAttributesInvalidAddsOrUpdates() { + + var dossier = dossierTesterAndProvider.provideTestDossier(); + + var loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs()).isEmpty(); + + dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), + DossierAttributeConfig.builder().label("Text").editable(true).type(DossierAttributeType.TEXT).build()); + dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), + DossierAttributeConfig.builder().label("Number").editable(true).type(DossierAttributeType.NUMBER).build()); + dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), + DossierAttributeConfig.builder().label("Date").editable(true).type(DossierAttributeType.DATE).build()); + dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), + DossierAttributeConfig.builder().label("Image1").editable(true).type(DossierAttributeType.IMAGE).build()); + dossierAttributeConfigClient.addOrUpdateDossierAttributeConfig(dossier.getDossierTemplateId(), + DossierAttributeConfig.builder().label("Image2").editable(true).type(DossierAttributeType.IMAGE).build()); + loadedAttributes = dossierAttributeConfigClient.getDossierAttributesConfig(dossier.getDossierTemplateId()); + assertThat(loadedAttributes.getDossierAttributeConfigs().size()).isEqualTo(5); + + var configIds = loadedAttributes.getDossierAttributeConfigs(); + + String valueConfig0 = "lorem ipsum 123"; + String valueConfig1 = "12345"; + String valueConfig2 = "2023-08-08"; + String valueConfig3 = "data:image/png;base64,w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==..."; + String valueConfig4 = "data:image/jpg;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4..."; + List dossierAttributes = new ArrayList<>(); + dossierAttributes.add(DossierAttribute.builder().dossierAttributeConfigId(configIds.get(0).getId()).dossierId(dossier.getId()).value(valueConfig0).build()); + dossierAttributes.add(DossierAttribute.builder().dossierAttributeConfigId(configIds.get(1).getId()).dossierId(dossier.getId()).value(valueConfig1).build()); + dossierAttributes.add(DossierAttribute.builder().dossierAttributeConfigId(configIds.get(2).getId()).dossierId(dossier.getId()).value(valueConfig2).build()); + dossierAttributes.add(DossierAttribute.builder().dossierAttributeConfigId(configIds.get(3).getId()).dossierId(dossier.getId()).value(valueConfig3).build()); + dossierAttributeClient.setDossierAttributes(dossier.getId(), new DossierAttributes(dossierAttributes)); + + DossierAttribute imageAttribute = DossierAttribute.builder().dossierAttributeConfigId(configIds.get(4).getId()).dossierId(dossier.getId()).value(valueConfig4).build(); + dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), imageAttribute); + + var loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); + assertThat(loadedAttributeValues.getDossierAttributeList().size()).isEqualTo(5); + assertThat(loadedAttributeValues.getDossierAttributeList().get(0).getValue()).isEqualTo(valueConfig0); + assertThat(loadedAttributeValues.getDossierAttributeList().get(1).getValue()).isEqualTo(valueConfig1); + assertThat(loadedAttributeValues.getDossierAttributeList().get(2).getValue()).isEqualTo(valueConfig2); + assertThat(loadedAttributeValues.getDossierAttributeList().get(3).getValue()).isEqualTo(valueConfig3); + assertThat(loadedAttributeValues.getDossierAttributeList().get(4).getValue()).isEqualTo(valueConfig4); + + String valueUpdate = "data:image/jpeg;base64,jkaf0000JJkasfaiiiiiHHHEkkkkki12Pd3Jaks222ggggB..."; + imageAttribute.setValue(valueUpdate); + dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), imageAttribute); + loadedAttributeValues = dossierAttributeClient.getDossierAttributes(dossier.getId()); + assertThat(loadedAttributeValues.getDossierAttributeList().get(4).getValue()).isEqualTo(valueUpdate); + + var e = assertThrows(FeignException.class, + () -> dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), + DossierAttribute.builder().dossierAttributeConfigId(configIds.get(1).getId()).dossierId(dossier.getId()).value("12345qwer").build())); + assertEquals(400, e.status()); + e = assertThrows(FeignException.class, + () -> dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), + DossierAttribute.builder().dossierAttributeConfigId(configIds.get(2).getId()).dossierId(dossier.getId()).value("07.02.2024").build())); + assertEquals(400, e.status()); + e = assertThrows(FeignException.class, + () -> dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), + DossierAttribute.builder().dossierAttributeConfigId(configIds.get(2).getId()).dossierId(dossier.getId()).value("2021-17-31").build())); + assertEquals(400, e.status()); + e = assertThrows(FeignException.class, + () -> dossierAttributeClient.addOrUpdateDossierAttribute(dossier.getId(), + DossierAttribute.builder().dossierAttributeConfigId(configIds.get(3).getId()).dossierId(dossier.getId()).value("data:image/gif;base64,test").build())); + assertEquals(400, e.status()); + + List invalidDossierAttributes1 = List.of(DossierAttribute.builder() + .dossierAttributeConfigId(configIds.get(0).getId()) + .dossierId(dossier.getId()) + .value(valueConfig0) + .build(), DossierAttribute.builder().dossierAttributeConfigId(configIds.get(1).getId()).dossierId(dossier.getId()).value("asdf12345").build()); + e = assertThrows(FeignException.class, () -> dossierAttributeClient.setDossierAttributes(dossier.getId(), new DossierAttributes(invalidDossierAttributes1))); + assertEquals(400, e.status()); + List invalidDossierAttributes2 = List.of(DossierAttribute.builder() + .dossierAttributeConfigId(configIds.get(1).getId()) + .dossierId(dossier.getId()) + .value(valueConfig1) + .build(), DossierAttribute.builder().dossierAttributeConfigId(configIds.get(2).getId()).dossierId(dossier.getId()).value("20140705").build()); + e = assertThrows(FeignException.class, () -> dossierAttributeClient.setDossierAttributes(dossier.getId(), new DossierAttributes(invalidDossierAttributes2))); + assertEquals(400, e.status()); + List invalidDossierAttributes3 = List.of(DossierAttribute.builder() + .dossierAttributeConfigId(configIds.get(1).getId()) + .dossierId(dossier.getId()) + .value(valueConfig1) + .build(), DossierAttribute.builder().dossierAttributeConfigId(configIds.get(3).getId()).dossierId(dossier.getId()).value("data:image/jpe;base64,test").build()); + e = assertThrows(FeignException.class, () -> dossierAttributeClient.setDossierAttributes(dossier.getId(), new DossierAttributes(invalidDossierAttributes3))); + assertEquals(400, e.status()); + + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java index 407998dd3..ac7d88cbf 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileAttributeTest.java @@ -3,6 +3,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.ASCII_ENCODING; import static com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService.UTF_ENCODING; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.HashMap; @@ -28,7 +30,9 @@ import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPers import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeType; +import feign.FeignException; import lombok.SneakyThrows; public class FileAttributeTest extends AbstractPersistenceServerServiceTest { @@ -221,4 +225,59 @@ public class FileAttributeTest extends AbstractPersistenceServerServiceTest { assertThat(loadedFile.getFileAttributes().getAttributeIdToValue()).isEmpty(); } + + + @SneakyThrows + @Test + public void testSetFileAttributesInvalidUpdates() { + // Create file with attributes + var dossier = dossierTesterAndProvider.provideTestDossier(); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + + var generalConfig = new FileAttributesConfig(); + generalConfig.setDelimiter(","); + generalConfig.setEncoding("UTF-8"); + generalConfig.setFilenameMappingColumnHeaderName("Name"); + + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), generalConfig); + var loadedConfig = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()); + assertThat(loadedConfig.getDelimiter()).isEqualTo(","); + + List configs = new ArrayList<>(); + configs.add(FileAttributeConfig.builder().csvColumnHeader("Date").primaryAttribute(true).label("Date").type(FileAttributeType.DATE).build()); + configs.add(FileAttributeConfig.builder().csvColumnHeader("Number").primaryAttribute(true).label("Number").type(FileAttributeType.NUMBER).build()); + configs.add(FileAttributeConfig.builder().csvColumnHeader("Text").primaryAttribute(true).label("Text").type(FileAttributeType.TEXT).build()); + + generalConfig.setFileAttributeConfigs(configs); + + fileAttributeConfigClient.setFileAttributesConfig(dossier.getDossierTemplateId(), generalConfig); + + List loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs(); + assertThat(loadedConfigs.size()).isEqualTo(3); + + Map fileAttributesMap = new HashMap<>(); + fileAttributesMap.put(loadedConfigs.get(0).getId(), "2023-12-31"); + fileAttributesMap.put(loadedConfigs.get(1).getId(), "12345"); + fileAttributesMap.put(loadedConfigs.get(2).getId(), "Free Text 123"); + fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(fileAttributesMap)); + + Map fileAttributes = fileClient.getFileStatus(dossier.getId(), file.getId()).getFileAttributes().getAttributeIdToValue(); + assertThat(fileAttributes.size()).isEqualTo(3); + assertThat(fileAttributes.get(loadedConfigs.get(0).getId())).isEqualTo("2023-12-31"); + assertThat(fileAttributes.get(loadedConfigs.get(1).getId())).isEqualTo("12345"); + assertThat(fileAttributes.get(loadedConfigs.get(2).getId())).isEqualTo("Free Text 123"); + + var e = assertThrows(FeignException.class, () -> fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfigs.get(0).getId(), "random/text")))); + assertEquals(400, e.status()); + assertThrows(FeignException.class, () -> fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfigs.get(0).getId(), "2023-12-32")))); + assertEquals(400, e.status()); + assertThrows(FeignException.class, () -> fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfigs.get(0).getId(), "2023-02-30")))); + assertEquals(400, e.status()); + assertThrows(FeignException.class, () -> fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfigs.get(1).getId(), "abc")))); + assertEquals(400, e.status()); + assertThrows(FeignException.class, () -> fileAttributeClient.setFileAttributes(dossier.getId(), file.getId(), new FileAttributes(Map.of(loadedConfigs.get(1).getId(), "1-2-3-4")))); + assertEquals(400, e.status()); + + } + } 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/DossierAttributeConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierAttributeConfig.java index d77113bbf..c0572ab5d 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierAttributeConfig.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/DossierAttributeConfig.java @@ -17,6 +17,7 @@ public class DossierAttributeConfig { private String label; private boolean editable; private String placeholder; + @Builder.Default private DossierAttributeType type = DossierAttributeType.TEXT; private String dossierTemplateId; 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/dossier/DossierAttributeTypeFormats.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttributeTypeFormats.java new file mode 100644 index 000000000..56cbaa854 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/DossierAttributeTypeFormats.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier; + +public class DossierAttributeTypeFormats { + + public static String DOSSIER_ATTRIBUTE_TYPE_DATE_FORMAT = "yyyy-MM-dd"; + + public static String DOSSIER_ATTRIBUTE_TYPE_IMAGE_REGEX = "data:image/(png|jpe?g);base64.*"; + + public static String DOSSIER_ATTRIBUTE_TYPE_NUMBER_REGEX = "[0-9]*"; +} 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/dossier/file/FileAttributeConfig.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeConfig.java index 99eb93ec1..a780284bf 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeConfig.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeConfig.java @@ -1,9 +1,5 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; -import javax.annotation.Nullable; - -import jakarta.validation.constraints.Max; -import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Builder; @@ -27,6 +23,7 @@ public class FileAttributeConfig { private boolean filterable; private boolean displayedInFileList; private String placeholder; + @Builder.Default private FileAttributeType type = FileAttributeType.TEXT; private String dossierTemplateId; 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/dossier/file/FileAttributeTypeFormats.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeTypeFormats.java new file mode 100644 index 000000000..c81a64ffe --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/dossiertemplate/dossier/file/FileAttributeTypeFormats.java @@ -0,0 +1,8 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file; + +public class FileAttributeTypeFormats { + + public static String FILE_ATTRIBUTE_TYPE_DATE_FORMAT = "yyyy-MM-dd"; + + public static String FILE_ATTRIBUTE_TYPE_NUMBER_REGEX = "[0-9]*"; +}