Merge branch 'RED-8432' into 'master'

RED-8432: Return 400 if invalid input for attributes is given

Closes RED-8432

See merge request redactmanager/persistence-service!343
This commit is contained in:
Maverick Studer 2024-02-07 14:01:07 +01:00
commit bf66fdf4b7
10 changed files with 266 additions and 12 deletions

View File

@ -34,6 +34,7 @@ public class DossierAttributeConfigEntity {
@Column
@Enumerated(EnumType.STRING)
@Builder.Default
private DossierAttributeType type = DossierAttributeType.TEXT;
@ManyToOne

View File

@ -42,6 +42,7 @@ public class FileAttributeConfigEntity {
private String placeholder;
@Column
@Enumerated(EnumType.STRING)
@Builder.Default
private FileAttributeType type = FileAttributeType.TEXT;
@ManyToOne

View File

@ -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<DossierAttribute> getDossierAttributes(String dossierId) {
return MagicConverter.convert(dossierAttributePersistenceService.getDossierAttributes(dossierId), DossierAttribute.class);

View File

@ -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<String, String> 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<String, FileAttributeType> 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");
}
}
}

View File

@ -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<DossierAttribute> 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<DossierAttribute> 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<DossierAttribute> 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<DossierAttribute> 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());
}
}

View File

@ -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<FileAttributeConfig> 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<FileAttributeConfig> loadedConfigs = fileAttributeConfigClient.getFileAttributesConfiguration(dossier.getDossierTemplateId()).getFileAttributeConfigs();
assertThat(loadedConfigs.size()).isEqualTo(3);
Map<String, String> 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<String, String> 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());
}
}

View File

@ -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;

View File

@ -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]*";
}

View File

@ -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;

View File

@ -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]*";
}