Merge branch 'RED-9749' into 'master'

RED-9749 - Fix various issues with component definitions

Closes RED-9749

See merge request redactmanager/persistence-service!621
This commit is contained in:
Andrei Isvoran 2024-07-26 10:42:28 +02:00
commit 6e2c2dfbdc
10 changed files with 155 additions and 129 deletions

View File

@ -388,7 +388,7 @@ public class DossierTemplateControllerV2 implements DossierTemplateResource {
return Collections.emptyList(); return Collections.emptyList();
} }
List<ComponentDefinition> componentDefinitions = componentDefinitionService.createComponents(componentDefinitionAddRequests); List<ComponentDefinition> componentDefinitions = componentDefinitionService.createComponents(dossierTemplateId, componentDefinitionAddRequests);
auditPersistenceService.audit(AuditRequest.builder() auditPersistenceService.audit(AuditRequest.builder()
.userId(KeycloakSecurity.getUserId()) .userId(KeycloakSecurity.getUserId())
.objectId(dossierTemplateId) .objectId(dossierTemplateId)

View File

@ -3477,15 +3477,11 @@ components:
The ComponentDefinitionAddRequest object represents a request to create a component definition within a dossier template. The ComponentDefinitionAddRequest object represents a request to create a component definition within a dossier template.
The rank will be automatically generated and does not need to be provided at creation. The rank will be automatically generated and does not need to be provided at creation.
example: example:
dossierTemplateId: 8cd4b482-fb49-4315-9b51-789b4ae46c57
technicalName: study_conclusion technicalName: study_conclusion
displayName: Study conclusion displayName: Study conclusion
description: The conclusion of the study description: The conclusion of the study
type: object type: object
properties: properties:
dossierTemplateId:
description: The ID of the dossier template to which this component belongs.
type: string
technicalName: technicalName:
description: The technical name of the component. description: The technical name of the component.
type: string type: string
@ -3496,7 +3492,6 @@ components:
description: A brief description of the component. description: A brief description of the component.
type: string type: string
required: required:
- dossierTemplateId
- technicalName - technicalName
- displayName - displayName
ComponentDefinitionUpdateRequest: ComponentDefinitionUpdateRequest:

View File

@ -314,12 +314,11 @@ public class DossierTemplateImportService {
if (CollectionUtils.isNotEmpty(request.getComponentDefinitions())) { if (CollectionUtils.isNotEmpty(request.getComponentDefinitions())) {
for (ComponentDefinition componentDefinition : request.getComponentDefinitions()) { for (ComponentDefinition componentDefinition : request.getComponentDefinitions()) {
ComponentDefinitionAddRequest componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() ComponentDefinitionAddRequest componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplateId)
.displayName(componentDefinition.getDisplayName()) .displayName(componentDefinition.getDisplayName())
.description(componentDefinition.getDescription()) .description(componentDefinition.getDescription())
.technicalName(componentDefinition.getTechnicalName()) .technicalName(componentDefinition.getTechnicalName())
.build(); .build();
componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinition.getRank()); componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinition.getRank(), dossierTemplateId);
} }
} }

View File

@ -6,6 +6,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -16,12 +17,15 @@ import org.springframework.transaction.annotation.Transactional;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ComponentDefinitionEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinition; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinition;
import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionAddRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionAddRequest;
import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionUpdateRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionUpdateRequest;
import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter;
import io.micrometer.common.util.StringUtils;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
@ -32,28 +36,30 @@ import lombok.experimental.FieldDefaults;
public class ComponentDefinitionService { public class ComponentDefinitionService {
ComponentDefinitionPersistenceService componentDefinitionPersistenceService; ComponentDefinitionPersistenceService componentDefinitionPersistenceService;
DossierTemplateRepository dossierTemplateRepository;
@PreAuthorize("hasAuthority('" + ADD_UPDATE_DICTIONARY_TYPE + "')") @PreAuthorize("hasAuthority('" + ADD_UPDATE_DICTIONARY_TYPE + "')")
@Transactional @Transactional
public List<ComponentDefinition> createComponents(List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) { public List<ComponentDefinition> createComponents(String dossierTemplateId, List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) {
validateDossierTemplateExists(dossierTemplateId);
validateAddRequest(componentDefinitionAddRequests);
validateComponentRequest(componentDefinitionAddRequests);
List<ComponentDefinitionEntity> componentEntities = new ArrayList<>(); List<ComponentDefinitionEntity> componentEntities = new ArrayList<>();
componentDefinitionAddRequests.forEach(componentDefinitionAddRequest -> componentEntities.add(componentDefinitionPersistenceService.insert(componentDefinitionAddRequest))); componentDefinitionAddRequests.forEach(componentDefinitionAddRequest -> componentEntities.add(componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, dossierTemplateId)));
return componentEntities.stream() return componentEntities.stream()
.map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class))
.sorted(Comparator.comparing(ComponentDefinition::getRank))
.toList(); .toList();
} }
private void validateComponentRequest(List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) { private void validateAddRequest(List<ComponentDefinitionAddRequest> componentDefinitionAddRequests) {
String firstDossierTemplateId = componentDefinitionAddRequests.get(0).getDossierTemplateId(); long nrOfComponentsWithEmptyTechnicalName = componentDefinitionAddRequests.stream().filter(c -> StringUtils.isEmpty(c.getTechnicalName())).count();
boolean allMatch = componentDefinitionAddRequests.stream() if (nrOfComponentsWithEmptyTechnicalName != 0) {
.allMatch(request -> request.getDossierTemplateId().equals(firstDossierTemplateId)); throw new BadRequestException("Technical name can not be empty for a component.");
if (!allMatch) {
throw new BadRequestException("All components must have the same dossierTemplateId.");
} }
} }
@ -61,6 +67,8 @@ public class ComponentDefinitionService {
@PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')") @PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')")
public ComponentDefinition getComponentByDossierTemplateIdAndComponentId(String dossierTemplateId, String componentId) { public ComponentDefinition getComponentByDossierTemplateIdAndComponentId(String dossierTemplateId, String componentId) {
validateDossierTemplateExists(dossierTemplateId);
return MagicConverter.convert(componentDefinitionPersistenceService.findComponentByDossierTemplateIdAndComponentId(dossierTemplateId, componentId), return MagicConverter.convert(componentDefinitionPersistenceService.findComponentByDossierTemplateIdAndComponentId(dossierTemplateId, componentId),
ComponentDefinition.class); ComponentDefinition.class);
} }
@ -69,16 +77,19 @@ public class ComponentDefinitionService {
@PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')") @PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')")
public List<ComponentDefinition> getComponentsByDossierTemplateId(String dossierTemplateId, boolean includeSoftDeleted) { public List<ComponentDefinition> getComponentsByDossierTemplateId(String dossierTemplateId, boolean includeSoftDeleted) {
List<ComponentDefinitionEntity> entities; validateDossierTemplateExists(dossierTemplateId);
List<ComponentDefinitionEntity> componentDefinitionEntities;
if (includeSoftDeleted) { if (includeSoftDeleted) {
entities = componentDefinitionPersistenceService.findComponentsByDossierTemplateId(dossierTemplateId); componentDefinitionEntities = componentDefinitionPersistenceService.findComponentsByDossierTemplateId(dossierTemplateId);
} else { } else {
entities = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId); componentDefinitionEntities = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId);
} }
return entities.stream() return componentDefinitionEntities.stream()
.map(entity -> MagicConverter.convert(entity, ComponentDefinition.class)) .map(entity -> MagicConverter.convert(entity, ComponentDefinition.class))
.sorted(Comparator.comparingInt(ComponentDefinition::getRank))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -87,6 +98,15 @@ public class ComponentDefinitionService {
@Transactional @Transactional
public List<ComponentDefinition> updateComponents(String dossierTemplateId, List<ComponentDefinitionUpdateRequest> componentDefinitionUpdateRequests) { public List<ComponentDefinition> updateComponents(String dossierTemplateId, List<ComponentDefinitionUpdateRequest> componentDefinitionUpdateRequests) {
validateDossierTemplateExists(dossierTemplateId);
long nrOfComponentUpdateRequestsWithEmptyDisplayName = componentDefinitionUpdateRequests.stream()
.filter(componentDefinitionUpdateRequest -> StringUtils.isEmpty(componentDefinitionUpdateRequest.getDisplayName()))
.count();
if (nrOfComponentUpdateRequestsWithEmptyDisplayName != 0) {
throw new BadRequestException("Component display name can not be empty");
}
List<ComponentDefinitionEntity> componentEntities = new ArrayList<>(); List<ComponentDefinitionEntity> componentEntities = new ArrayList<>();
componentDefinitionUpdateRequests.forEach(componentDefinitionUpdateRequest -> { componentDefinitionUpdateRequests.forEach(componentDefinitionUpdateRequest -> {
ComponentDefinitionEntity componentDefinitionEntity = componentDefinitionPersistenceService.findComponent(dossierTemplateId, componentDefinitionUpdateRequest.getId()); ComponentDefinitionEntity componentDefinitionEntity = componentDefinitionPersistenceService.findComponent(dossierTemplateId, componentDefinitionUpdateRequest.getId());
@ -96,6 +116,7 @@ public class ComponentDefinitionService {
}); });
return componentEntities.stream() return componentEntities.stream()
.map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class))
.sorted(Comparator.comparing(ComponentDefinition::getRank))
.toList(); .toList();
} }
@ -104,8 +125,8 @@ public class ComponentDefinitionService {
@Transactional @Transactional
public List<ComponentDefinitionEntity> deleteComponents(String dossierTemplateId, List<String> componentIds) { public List<ComponentDefinitionEntity> deleteComponents(String dossierTemplateId, List<String> componentIds) {
OffsetDateTime now = OffsetDateTime.now(); validateDossierTemplateExists(dossierTemplateId);
return componentDefinitionPersistenceService.softDeleteComponents(dossierTemplateId, componentIds, now); return componentDefinitionPersistenceService.softDeleteComponents(dossierTemplateId, componentIds, OffsetDateTime.now());
} }
@ -113,6 +134,7 @@ public class ComponentDefinitionService {
@Transactional @Transactional
public List<ComponentDefinition> restoreComponents(String dossierTemplateId, List<String> componentIds) { public List<ComponentDefinition> restoreComponents(String dossierTemplateId, List<String> componentIds) {
validateDossierTemplateExists(dossierTemplateId);
List<ComponentDefinitionEntity> componentDefinitionEntities = componentDefinitionPersistenceService.restoreComponents(dossierTemplateId, componentIds); List<ComponentDefinitionEntity> componentDefinitionEntities = componentDefinitionPersistenceService.restoreComponents(dossierTemplateId, componentIds);
int rank = componentDefinitionPersistenceService.countByDossierTemplateId(dossierTemplateId); int rank = componentDefinitionPersistenceService.countByDossierTemplateId(dossierTemplateId);
@ -122,6 +144,7 @@ public class ComponentDefinitionService {
} }
return componentDefinitionEntities.stream() return componentDefinitionEntities.stream()
.map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class))
.sorted(Comparator.comparing(ComponentDefinition::getRank))
.toList(); .toList();
} }
@ -130,12 +153,16 @@ public class ComponentDefinitionService {
@Transactional @Transactional
public List<ComponentDefinition> reorderComponents(String dossierTemplateId, List<String> componentIds) { public List<ComponentDefinition> reorderComponents(String dossierTemplateId, List<String> componentIds) {
validateDossierTemplateExists(dossierTemplateId);
List<ComponentDefinition> orderedComponents = new ArrayList<>(); List<ComponentDefinition> orderedComponents = new ArrayList<>();
List<ComponentDefinitionEntity> existingComponents = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId); List<ComponentDefinitionEntity> existingComponents = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId);
Map<String, ComponentDefinitionEntity> componentMap = existingComponents.stream() Map<String, ComponentDefinitionEntity> componentMap = existingComponents.stream()
.collect(Collectors.toMap(ComponentDefinitionEntity::getId, component -> component)); .collect(Collectors.toMap(ComponentDefinitionEntity::getId, component -> component));
List<ComponentDefinitionEntity> remainingComponents = new ArrayList<>(existingComponents);
int rank = 1; int rank = 1;
for (String componentId : componentIds) { for (String componentId : componentIds) {
ComponentDefinitionEntity component = componentMap.get(componentId); ComponentDefinitionEntity component = componentMap.get(componentId);
@ -143,10 +170,27 @@ public class ComponentDefinitionService {
component.setRank(rank++); component.setRank(rank++);
componentDefinitionPersistenceService.update(component); componentDefinitionPersistenceService.update(component);
orderedComponents.add(MagicConverter.convert(component, ComponentDefinition.class)); orderedComponents.add(MagicConverter.convert(component, ComponentDefinition.class));
remainingComponents.remove(component);
} }
} }
// Continue updating ranks for remaining components
for (ComponentDefinitionEntity component : remainingComponents) {
component.setRank(rank++);
componentDefinitionPersistenceService.update(component);
orderedComponents.add(MagicConverter.convert(component, ComponentDefinition.class));
}
orderedComponents.sort(Comparator.comparing(ComponentDefinition::getRank));
return orderedComponents; return orderedComponents;
} }
private void validateDossierTemplateExists(String dossierTemplateId) {
if (!dossierTemplateRepository.existsByIdAndNotDeleted(dossierTemplateId)) {
throw new NotFoundException(String.format("DossierTemplate with Id %s not found.", dossierTemplateId));
}
}
} }

View File

@ -2,7 +2,9 @@ package com.iqser.red.service.persistence.management.v1.processor.service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -15,6 +17,7 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotAl
import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ComponentDefinitionPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService;
import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User;
import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory;
@ -28,9 +31,11 @@ import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class ComponentLogService { public class ComponentLogService {
private final FileManagementStorageService fileManagementStorageService; private final FileManagementStorageService fileManagementStorageService;
@ -38,11 +43,16 @@ public class ComponentLogService {
private final AuditPersistenceService auditPersistenceService; private final AuditPersistenceService auditPersistenceService;
private final ComponentDefinitionPersistenceService componentDefinitionPersistenceService; private final ComponentDefinitionPersistenceService componentDefinitionPersistenceService;
private final UserService userService; private final UserService userService;
private final DossierRepository dossierRepository;
public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) { public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) {
List<ComponentDefinitionEntity> orderedEntities = componentDefinitionPersistenceService.findByDossierTemplateIdAndNotSoftDeleted(dossierId); List<ComponentDefinitionEntity> orderedEntities = componentDefinitionPersistenceService.findByDossierTemplateIdAndNotSoftDeleted(dossierRepository.findDossierTemplateId(dossierId))
.stream()
.sorted(Comparator.comparing(ComponentDefinitionEntity::getRank))
.toList();
orderedEntities.forEach(o -> log.info("Name: {} Rank: {}", o.getTechnicalName(), o.getRank()));
List<String> orderedNames = orderedEntities.stream() List<String> orderedNames = orderedEntities.stream()
.map(ComponentDefinitionEntity::getTechnicalName) .map(ComponentDefinitionEntity::getTechnicalName)
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -81,17 +91,22 @@ public class ComponentLogService {
List<ComponentLogEntry> componentLogEntries = componentLog.getComponentLogEntries(); List<ComponentLogEntry> componentLogEntries = componentLog.getComponentLogEntries();
List<ComponentLogEntry> sortedLogEntries = new ArrayList<>(); Map<String, ComponentLogEntry> entryMap = new HashMap<>();
List<ComponentLogEntry> nonOrderedLogEntries = new ArrayList<>();
for (ComponentLogEntry entry : componentLogEntries) { for (ComponentLogEntry entry : componentLogEntries) {
if (orderedNames.contains(entry.getName())) { entryMap.put(entry.getName().toLowerCase(Locale.getDefault()), entry);
sortedLogEntries.add(entry);
} else {
nonOrderedLogEntries.add(entry);
}
} }
List<ComponentLogEntry> sortedLogEntries = new ArrayList<>();
orderedNames.forEach(name -> {
ComponentLogEntry entry = entryMap.get(name);
if (entry != null) {
entryMap.remove(name);
sortedLogEntries.add(entry);
}
});
List<ComponentLogEntry> nonOrderedLogEntries = new ArrayList<>(entryMap.values());
nonOrderedLogEntries.sort(new ComponentOrderComparator(orderedNames)); nonOrderedLogEntries.sort(new ComponentOrderComparator(orderedNames));
sortedLogEntries.addAll(nonOrderedLogEntries); sortedLogEntries.addAll(nonOrderedLogEntries);

View File

@ -159,9 +159,8 @@ public class DossierTemplateCloneService {
.description(componentDefinitionEntity.getDescription()) .description(componentDefinitionEntity.getDescription())
.technicalName(componentDefinitionEntity.getTechnicalName()) .technicalName(componentDefinitionEntity.getTechnicalName())
.displayName(componentDefinitionEntity.getDisplayName()) .displayName(componentDefinitionEntity.getDisplayName())
.dossierTemplateId(clonedDossierTemplateId)
.build(); .build();
componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinitionEntity.getRank()); componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinitionEntity.getRank(), clonedDossierTemplateId);
} }
} }

View File

@ -24,9 +24,9 @@ public class ComponentDefinitionPersistenceService {
private final ComponentDefinitionRepository componentDefinitionRepository; private final ComponentDefinitionRepository componentDefinitionRepository;
public ComponentDefinitionEntity insert(ComponentDefinitionAddRequest component) { public ComponentDefinitionEntity insert(ComponentDefinitionAddRequest component, String dossierTemplateId) {
return insert(component, countByDossierTemplateId(component.getDossierTemplateId()) + 1); return insert(component, countByDossierTemplateId(dossierTemplateId) + 1, dossierTemplateId);
} }
@ -35,13 +35,13 @@ public class ComponentDefinitionPersistenceService {
return componentDefinitionRepository.saveAndFlush(componentDefinition); return componentDefinitionRepository.saveAndFlush(componentDefinition);
} }
public ComponentDefinitionEntity insert(ComponentDefinitionAddRequest component, int rank) { public ComponentDefinitionEntity insert(ComponentDefinitionAddRequest component, int rank, String dossierTemplateId) {
ComponentDefinitionEntity componentDefinitionEntity = new ComponentDefinitionEntity(); ComponentDefinitionEntity componentDefinitionEntity = new ComponentDefinitionEntity();
componentDefinitionEntity.setId(UUID.randomUUID().toString()); componentDefinitionEntity.setId(UUID.randomUUID().toString());
componentDefinitionEntity.setDossierTemplateId(component.getDossierTemplateId()); componentDefinitionEntity.setDossierTemplateId(dossierTemplateId);
componentDefinitionEntity.setTechnicalName(SnakeCaseUtils.toSnakeCase(component.getTechnicalName())); componentDefinitionEntity.setTechnicalName(SnakeCaseUtils.toSnakeCase(component.getTechnicalName()));
componentDefinitionEntity.setDisplayName(component.getDisplayName()); componentDefinitionEntity.setDisplayName(component.getDisplayName().isEmpty() ? component.getTechnicalName() : component.getDisplayName());
componentDefinitionEntity.setDescription(component.getDescription()); componentDefinitionEntity.setDescription(component.getDescription());
componentDefinitionEntity.setRank(rank); componentDefinitionEntity.setRank(rank);
return componentDefinitionRepository.saveAndFlush(componentDefinitionEntity); return componentDefinitionRepository.saveAndFlush(componentDefinitionEntity);

View File

@ -43,17 +43,20 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
assertEquals(response.get(0).getDisplayName(), componentDefinitionAddRequest.getDisplayName()); assertEquals(response.get(0).getDisplayName(), componentDefinitionAddRequest.getDisplayName());
assertEquals(response.get(0).getTechnicalName(), componentDefinitionAddRequest.getTechnicalName()); assertEquals(response.get(0).getTechnicalName(), componentDefinitionAddRequest.getTechnicalName());
assertNull(response.get(0).getSoftDeleteTime()); assertNull(response.get(0).getSoftDeleteTime());
var noDisplayNameComponent = ComponentDefinitionAddRequest.builder().displayName("").technicalName("component_2").description("Description").build();
var result1 = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(noDisplayNameComponent));
assertTrue(result1.get(0).getDisplayName().equals("component_2"));
var noTechnicalNameComponent = ComponentDefinitionAddRequest.builder().technicalName("").displayName("Component 1").description("Description").build();
var result = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(noTechnicalNameComponent)));
assertTrue(result.getMessage().contains("Technical name can not be empty for a component."));
} }
private ComponentDefinitionAddRequest buildComponentDefinitionAddRequest(DossierTemplateModel dossierTemplate) { private ComponentDefinitionAddRequest buildComponentDefinitionAddRequest(DossierTemplateModel dossierTemplate) {
return ComponentDefinitionAddRequest.builder() return ComponentDefinitionAddRequest.builder().technicalName("component_1").displayName("Component 1").description("Description").build();
.dossierTemplateId(dossierTemplate.getId())
.technicalName("component_1")
.displayName("Component 1")
.description("Description")
.build();
} }
@ -73,12 +76,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
assertEquals(component.getTechnicalName(), componentDefinitionAddRequest.getTechnicalName()); assertEquals(component.getTechnicalName(), componentDefinitionAddRequest.getTechnicalName());
assertNull(component.getSoftDeleteTime()); assertNull(component.getSoftDeleteTime());
var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder() var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder().technicalName("component_2").displayName("Component 2").description("Description").build();
.dossierTemplateId(dossierTemplate.getId())
.technicalName("component_2")
.displayName("Component 2")
.description("Description")
.build();
response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest2)); response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest2));
assertEquals(response.size(), 1); assertEquals(response.size(), 1);
@ -93,6 +91,12 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
components = dossierTemplateExternalClient.getComponents(dossierTemplate.getId(), false); components = dossierTemplateExternalClient.getComponents(dossierTemplate.getId(), false);
assertEquals(components.size(), 1); assertEquals(components.size(), 1);
var componentsError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.getComponents("123", false));
assertTrue(componentsError.getMessage().contains("DossierTemplate with Id 123 not found."));
var componentError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.getComponent("123", "321"));
assertTrue(componentError.getMessage().contains("DossierTemplate with Id 123 not found."));
} }
@ -117,6 +121,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
assertEquals(updatedComponents.get(0).getDisplayName(), componentDefinitionUpdateRequest.getDisplayName()); assertEquals(updatedComponents.get(0).getDisplayName(), componentDefinitionUpdateRequest.getDisplayName());
assertEquals(updatedComponents.get(0).getTechnicalName(), componentDefinitionAddRequest.getTechnicalName()); assertEquals(updatedComponents.get(0).getTechnicalName(), componentDefinitionAddRequest.getTechnicalName());
assertNull(updatedComponents.get(0).getSoftDeleteTime()); assertNull(updatedComponents.get(0).getSoftDeleteTime());
var unknownDossierError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.updateComponents("123", List.of(componentDefinitionUpdateRequest)));
assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found."));
} }
@ -133,6 +140,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
var softDeletedComponent = dossierTemplateExternalClient.getComponent(dossierTemplate.getId(), response.get(0).getId()); var softDeletedComponent = dossierTemplateExternalClient.getComponent(dossierTemplate.getId(), response.get(0).getId());
assertNotNull(softDeletedComponent.getSoftDeleteTime()); assertNotNull(softDeletedComponent.getSoftDeleteTime());
var unknownDossierError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.deleteComponents("123", List.of(response.get(0).getId())));
assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found."));
} }
@ -140,24 +150,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
public void testRestoreDeletedComponentDefinitions() { public void testRestoreDeletedComponentDefinitions() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder().technicalName("Component 1").displayName("Component 1").description("Description").build();
.dossierTemplateId(dossierTemplate.getId()) var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder().technicalName("Component 2").displayName("Component 2").description("Description").build();
.technicalName("Component 1") var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder().technicalName("Component 3").displayName("Component 3").description("Description").build();
.displayName("Component 1")
.description("Description")
.build();
var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 2")
.displayName("Component 2")
.description("Description")
.build();
var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 3")
.displayName("Component 3")
.description("Description")
.build();
var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(),
List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3)); List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3));
@ -173,21 +168,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
assertEquals(restoredComponents.get(0).getId(), response.get(0).getId()); assertEquals(restoredComponents.get(0).getId(), response.get(0).getId());
assertEquals(restoredComponents.get(0).getRank(), 4); assertEquals(restoredComponents.get(0).getRank(), 4);
assertNull(restoredComponents.get(0).getSoftDeleteTime()); assertNull(restoredComponents.get(0).getSoftDeleteTime());
}
var unknownDossierError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.restoreComponents("123", List.of(response.get(0).getId())));
@Test assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found."));
public void createComponentDefinitionsWithDifferentDossierTemplateIds() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1");
var dossierTemplate2 = dossierTemplateTesterAndProvider.provideTestTemplate("dossier2");
var componentDefinitionAddRequest = buildComponentDefinitionAddRequest(dossierTemplate);
var componentDefinitionAddRequest2 = buildComponentDefinitionAddRequest(dossierTemplate2);
var error = assertThrows(FeignException.class,
() -> dossierTemplateExternalClient.createComponents(dossierTemplate.getId(),
List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2)));
assertTrue(error.getMessage().contains("All components must have the same dossierTemplateId."));
} }
@ -195,12 +178,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
public void testSnakeCaseTechnicalName() { public void testSnakeCaseTechnicalName() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1"); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1");
var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder().technicalName("Component 1").displayName("Component 1").description("Description").build();
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 1")
.displayName("Component 1")
.description("Description")
.build();
var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest)); var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest));
assertEquals(response.size(), 1); assertEquals(response.size(), 1);
@ -212,24 +190,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
public void testGetAllComponentsForADossierTemplate() { public void testGetAllComponentsForADossierTemplate() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1"); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1");
var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder().technicalName("Component 1").displayName("Component 1").description("Description").build();
.dossierTemplateId(dossierTemplate.getId()) var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder().technicalName("Component 2").displayName("Component 2").description("Description").build();
.technicalName("Component 1") var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder().technicalName("Component 3").displayName("Component 3").description("Description").build();
.displayName("Component 1")
.description("Description")
.build();
var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 2")
.displayName("Component 2")
.description("Description")
.build();
var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 3")
.displayName("Component 3")
.description("Description")
.build();
var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(),
List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3)); List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3));
@ -250,24 +213,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
public void testReorderComponentDefinitions() { public void testReorderComponentDefinitions() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1"); var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1");
var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder().technicalName("Component 1").displayName("Component 1").description("Description").build();
.dossierTemplateId(dossierTemplate.getId()) var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder().technicalName("Component 2").displayName("Component 2").description("Description").build();
.technicalName("Component 1") var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder().technicalName("Component 3").displayName("Component 3").description("Description").build();
.displayName("Component 1")
.description("Description")
.build();
var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 2")
.displayName("Component 2")
.description("Description")
.build();
var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder()
.dossierTemplateId(dossierTemplate.getId())
.technicalName("Component 3")
.displayName("Component 3")
.description("Description")
.build();
var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(),
List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3)); List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3));
@ -284,6 +232,35 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe
assertEquals(newOrder.get(1).getRank(), 2); assertEquals(newOrder.get(1).getRank(), 2);
assertEquals(newOrder.get(2).getId(), firstComponentId); assertEquals(newOrder.get(2).getId(), firstComponentId);
assertEquals(newOrder.get(2).getRank(), 3); assertEquals(newOrder.get(2).getRank(), 3);
var unknownDossierError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.reorderComponents("123", List.of(secondComponentId, thirdComponentId, firstComponentId)));
assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found."));
}
@Test
public void testReorderComponentDefinitionsWithShiftingRanks() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1");
var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder().technicalName("Component 1").displayName("Component 1").description("Description").build();
var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder().technicalName("Component 2").displayName("Component 2").description("Description").build();
var componentDefinitionAddRequest3 = ComponentDefinitionAddRequest.builder().technicalName("Component 3").displayName("Component 3").description("Description").build();
var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(),
List.of(componentDefinitionAddRequest, componentDefinitionAddRequest2, componentDefinitionAddRequest3));
assertEquals(response.size(), 3);
String firstComponentId = response.get(0).getId();
String secondComponentId = response.get(1).getId();
String thirdComponentId = response.get(2).getId();
var newOrder = dossierTemplateExternalClient.reorderComponents(dossierTemplate.getId(), List.of(secondComponentId));
assertEquals(newOrder.size(), 3);
assertEquals(newOrder.get(0).getId(), secondComponentId);
assertEquals(newOrder.get(0).getRank(), 1);
assertEquals(newOrder.get(1).getId(), firstComponentId);
assertEquals(newOrder.get(1).getRank(), 2);
assertEquals(newOrder.get(2).getId(), thirdComponentId);
assertEquals(newOrder.get(2).getRank(), 3);
} }
} }

View File

@ -12,6 +12,7 @@ import com.iqser.red.service.peristence.v1.server.integration.service.DossierTes
import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.peristence.v1.server.integration.utils.TokenService; import com.iqser.red.service.peristence.v1.server.integration.utils.TokenService;
import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionAddRequest;
import feign.FeignException; import feign.FeignException;

View File

@ -14,10 +14,6 @@ import lombok.NonNull;
@Schema(description = "Object containing information about a component.") @Schema(description = "Object containing information about a component.")
public class ComponentDefinitionAddRequest { public class ComponentDefinitionAddRequest {
@NonNull
@Schema(description = "The dossierTemplateId for this component.")
private String dossierTemplateId;
@NonNull @NonNull
@Schema(description = "The technical name of the component in snake case. Must be unique within the same dossier template.") @Schema(description = "The technical name of the component in snake case. Must be unique within the same dossier template.")
private String technicalName; private String technicalName;