diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java index d8a0ff87c..3a5519650 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java @@ -388,7 +388,7 @@ public class DossierTemplateControllerV2 implements DossierTemplateResource { return Collections.emptyList(); } - List componentDefinitions = componentDefinitionService.createComponents(componentDefinitionAddRequests); + List componentDefinitions = componentDefinitionService.createComponents(dossierTemplateId, componentDefinitionAddRequests); auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) .objectId(dossierTemplateId) diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml index 06502a1fd..c8f397a26 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/documine.yaml @@ -3477,15 +3477,11 @@ components: 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. example: - dossierTemplateId: 8cd4b482-fb49-4315-9b51-789b4ae46c57 technicalName: study_conclusion displayName: Study conclusion description: The conclusion of the study type: object properties: - dossierTemplateId: - description: The ID of the dossier template to which this component belongs. - type: string technicalName: description: The technical name of the component. type: string @@ -3496,7 +3492,6 @@ components: description: A brief description of the component. type: string required: - - dossierTemplateId - technicalName - displayName ComponentDefinitionUpdateRequest: diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java index 9999af4fc..26900e99c 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/dataexchange/service/DossierTemplateImportService.java @@ -314,12 +314,11 @@ public class DossierTemplateImportService { if (CollectionUtils.isNotEmpty(request.getComponentDefinitions())) { for (ComponentDefinition componentDefinition : request.getComponentDefinitions()) { ComponentDefinitionAddRequest componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplateId) .displayName(componentDefinition.getDisplayName()) .description(componentDefinition.getDescription()) .technicalName(componentDefinition.getTechnicalName()) .build(); - componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinition.getRank()); + componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinition.getRank(), dossierTemplateId); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentDefinitionService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentDefinitionService.java index 57f442da6..67eb41640 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentDefinitionService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentDefinitionService.java @@ -6,17 +6,21 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac import java.time.OffsetDateTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; 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.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.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.ComponentDefinitionAddRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentDefinitionUpdateRequest; @@ -32,28 +36,33 @@ import lombok.experimental.FieldDefaults; public class ComponentDefinitionService { ComponentDefinitionPersistenceService componentDefinitionPersistenceService; + DossierTemplateRepository dossierTemplateRepository; @PreAuthorize("hasAuthority('" + ADD_UPDATE_DICTIONARY_TYPE + "')") @Transactional - public List createComponents(List componentDefinitionAddRequests) { + public List createComponents(String dossierTemplateId, List componentDefinitionAddRequests) { + + validateDossierTemplateExists(dossierTemplateId); + validateAddRequest(componentDefinitionAddRequests); - validateComponentRequest(componentDefinitionAddRequests); List componentEntities = new ArrayList<>(); - componentDefinitionAddRequests.forEach(componentDefinitionAddRequest -> componentEntities.add(componentDefinitionPersistenceService.insert(componentDefinitionAddRequest))); + componentDefinitionAddRequests.forEach(componentDefinitionAddRequest -> componentEntities.add(componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, + dossierTemplateId))); return componentEntities.stream() .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) + .sorted(Comparator.comparing(ComponentDefinition::getRank)) .toList(); } - private void validateComponentRequest(List componentDefinitionAddRequests) { + private void validateAddRequest(List componentDefinitionAddRequests) { - String firstDossierTemplateId = componentDefinitionAddRequests.get(0).getDossierTemplateId(); - boolean allMatch = componentDefinitionAddRequests.stream() - .allMatch(request -> request.getDossierTemplateId().equals(firstDossierTemplateId)); - if (!allMatch) { - throw new BadRequestException("All components must have the same dossierTemplateId."); + long nrOfComponentsWithEmptyTechnicalName = componentDefinitionAddRequests.stream() + .filter(c -> StringUtils.isEmpty(c.getTechnicalName())) + .count(); + if (nrOfComponentsWithEmptyTechnicalName != 0) { + throw new BadRequestException("Technical name can not be empty for a component."); } } @@ -61,6 +70,7 @@ public class ComponentDefinitionService { @PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')") public ComponentDefinition getComponentByDossierTemplateIdAndComponentId(String dossierTemplateId, String componentId) { + validateDossierTemplateExists(dossierTemplateId); return MagicConverter.convert(componentDefinitionPersistenceService.findComponentByDossierTemplateIdAndComponentId(dossierTemplateId, componentId), ComponentDefinition.class); } @@ -69,17 +79,20 @@ public class ComponentDefinitionService { @PreAuthorize("hasAuthority('" + READ_DICTIONARY_TYPES + "')") public List getComponentsByDossierTemplateId(String dossierTemplateId, boolean includeSoftDeleted) { - List entities; + validateDossierTemplateExists(dossierTemplateId); + List componentDefinitionEntities; if (includeSoftDeleted) { - entities = componentDefinitionPersistenceService.findComponentsByDossierTemplateId(dossierTemplateId); + componentDefinitionEntities = componentDefinitionPersistenceService.findComponentsByDossierTemplateId(dossierTemplateId); } else { - entities = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId); + componentDefinitionEntities = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId); } - return entities.stream() + return componentDefinitionEntities.stream() .map(entity -> MagicConverter.convert(entity, ComponentDefinition.class)) + .sorted(Comparator.comparingInt(ComponentDefinition::getRank)) .collect(Collectors.toList()); + } @@ -87,6 +100,15 @@ public class ComponentDefinitionService { @Transactional public List updateComponents(String dossierTemplateId, List 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 componentEntities = new ArrayList<>(); componentDefinitionUpdateRequests.forEach(componentDefinitionUpdateRequest -> { ComponentDefinitionEntity componentDefinitionEntity = componentDefinitionPersistenceService.findComponent(dossierTemplateId, componentDefinitionUpdateRequest.getId()); @@ -96,6 +118,7 @@ public class ComponentDefinitionService { }); return componentEntities.stream() .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) + .sorted(Comparator.comparing(ComponentDefinition::getRank)) .toList(); } @@ -104,8 +127,8 @@ public class ComponentDefinitionService { @Transactional public List deleteComponents(String dossierTemplateId, List componentIds) { - OffsetDateTime now = OffsetDateTime.now(); - return componentDefinitionPersistenceService.softDeleteComponents(dossierTemplateId, componentIds, now); + validateDossierTemplateExists(dossierTemplateId); + return componentDefinitionPersistenceService.softDeleteComponents(dossierTemplateId, componentIds, OffsetDateTime.now()); } @@ -113,6 +136,7 @@ public class ComponentDefinitionService { @Transactional public List restoreComponents(String dossierTemplateId, List componentIds) { + validateDossierTemplateExists(dossierTemplateId); List componentDefinitionEntities = componentDefinitionPersistenceService.restoreComponents(dossierTemplateId, componentIds); int rank = componentDefinitionPersistenceService.countByDossierTemplateId(dossierTemplateId); @@ -122,20 +146,24 @@ public class ComponentDefinitionService { } return componentDefinitionEntities.stream() .map(componentDefinitionEntity -> MagicConverter.convert(componentDefinitionEntity, ComponentDefinition.class)) + .sorted(Comparator.comparing(ComponentDefinition::getRank)) .toList(); } @PreAuthorize("hasAuthority('" + ADD_UPDATE_DICTIONARY_TYPE + "')") - @Transactional public List reorderComponents(String dossierTemplateId, List componentIds) { + validateDossierTemplateExists(dossierTemplateId); + List orderedComponents = new ArrayList<>(); List existingComponents = componentDefinitionPersistenceService.findComponentsByDossierTemplateIdExcludeSoftDeleted(dossierTemplateId); Map componentMap = existingComponents.stream() .collect(Collectors.toMap(ComponentDefinitionEntity::getId, component -> component)); + List remainingComponents = new ArrayList<>(existingComponents); + int rank = 1; for (String componentId : componentIds) { ComponentDefinitionEntity component = componentMap.get(componentId); @@ -143,10 +171,28 @@ public class ComponentDefinitionService { component.setRank(rank++); componentDefinitionPersistenceService.update(component); 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; } + + private void validateDossierTemplateExists(String dossierTemplateId) { + + if (!dossierTemplateRepository.existsByIdAndNotDeleted(dossierTemplateId)) { + throw new NotFoundException(String.format("DossierTemplate with Id %s not found.", dossierTemplateId)); + } + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index 696caab9d..8bd0db3b4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -2,7 +2,9 @@ package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; 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.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.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.model.User; 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.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor +@Slf4j public class ComponentLogService { private final FileManagementStorageService fileManagementStorageService; @@ -38,11 +43,16 @@ public class ComponentLogService { private final AuditPersistenceService auditPersistenceService; private final ComponentDefinitionPersistenceService componentDefinitionPersistenceService; private final UserService userService; + private final DossierRepository dossierRepository; public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) { - List orderedEntities = componentDefinitionPersistenceService.findByDossierTemplateIdAndNotSoftDeleted(dossierId); + List 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 orderedNames = orderedEntities.stream() .map(ComponentDefinitionEntity::getTechnicalName) .collect(Collectors.toList()); @@ -81,17 +91,22 @@ public class ComponentLogService { List componentLogEntries = componentLog.getComponentLogEntries(); - List sortedLogEntries = new ArrayList<>(); - List nonOrderedLogEntries = new ArrayList<>(); - + Map entryMap = new HashMap<>(); for (ComponentLogEntry entry : componentLogEntries) { - if (orderedNames.contains(entry.getName())) { - sortedLogEntries.add(entry); - } else { - nonOrderedLogEntries.add(entry); - } + entryMap.put(entry.getName().toLowerCase(Locale.getDefault()), entry); } + List sortedLogEntries = new ArrayList<>(); + + orderedNames.forEach(name -> { + ComponentLogEntry entry = entryMap.get(name); + if (entry != null) { + entryMap.remove(name); + sortedLogEntries.add(entry); + } + }); + + List nonOrderedLogEntries = new ArrayList<>(entryMap.values()); nonOrderedLogEntries.sort(new ComponentOrderComparator(orderedNames)); sortedLogEntries.addAll(nonOrderedLogEntries); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java index 96c6871ef..6d56e875e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierTemplateCloneService.java @@ -159,9 +159,8 @@ public class DossierTemplateCloneService { .description(componentDefinitionEntity.getDescription()) .technicalName(componentDefinitionEntity.getTechnicalName()) .displayName(componentDefinitionEntity.getDisplayName()) - .dossierTemplateId(clonedDossierTemplateId) .build(); - componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinitionEntity.getRank()); + componentDefinitionPersistenceService.insert(componentDefinitionAddRequest, componentDefinitionEntity.getRank(), clonedDossierTemplateId); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java index 2f99c21c2..6d3f25fe6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/ComponentDefinitionPersistenceService.java @@ -24,9 +24,9 @@ public class ComponentDefinitionPersistenceService { 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,15 @@ public class ComponentDefinitionPersistenceService { 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.setId(UUID.randomUUID().toString()); - componentDefinitionEntity.setDossierTemplateId(component.getDossierTemplateId()); + componentDefinitionEntity.setDossierTemplateId(dossierTemplateId); componentDefinitionEntity.setTechnicalName(SnakeCaseUtils.toSnakeCase(component.getTechnicalName())); - componentDefinitionEntity.setDisplayName(component.getDisplayName()); + componentDefinitionEntity.setDisplayName(component.getDisplayName().isEmpty() ? component.getTechnicalName() : component.getDisplayName()); + componentDefinitionEntity.setDescription(component.getDescription()); componentDefinitionEntity.setRank(rank); return componentDefinitionRepository.saveAndFlush(componentDefinitionEntity); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java index 63b29ed65..899c713c2 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentDefinitionTests.java @@ -43,17 +43,20 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe assertEquals(response.get(0).getDisplayName(), componentDefinitionAddRequest.getDisplayName()); assertEquals(response.get(0).getTechnicalName(), componentDefinitionAddRequest.getTechnicalName()); 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) { - return ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .technicalName("component_1") - .displayName("Component 1") - .description("Description") - .build(); + return ComponentDefinitionAddRequest.builder().technicalName("component_1").displayName("Component 1").description("Description").build(); } @@ -73,12 +76,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe assertEquals(component.getTechnicalName(), componentDefinitionAddRequest.getTechnicalName()); assertNull(component.getSoftDeleteTime()); - var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .technicalName("component_2") - .displayName("Component 2") - .description("Description") - .build(); + var componentDefinitionAddRequest2 = ComponentDefinitionAddRequest.builder().technicalName("component_2").displayName("Component 2").description("Description").build(); response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest2)); assertEquals(response.size(), 1); @@ -93,6 +91,12 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe components = dossierTemplateExternalClient.getComponents(dossierTemplate.getId(), false); 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).getTechnicalName(), componentDefinitionAddRequest.getTechnicalName()); 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()); 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() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); - var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .technicalName("Component 1") - .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 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)); @@ -173,21 +168,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe assertEquals(restoredComponents.get(0).getId(), response.get(0).getId()); assertEquals(restoredComponents.get(0).getRank(), 4); assertNull(restoredComponents.get(0).getSoftDeleteTime()); - } - - @Test - 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.")); + var unknownDossierError = assertThrows(FeignException.class, () -> dossierTemplateExternalClient.restoreComponents("123", List.of(response.get(0).getId()))); + assertTrue(unknownDossierError.getMessage().contains("DossierTemplate with Id 123 not found.")); } @@ -195,12 +178,7 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe public void testSnakeCaseTechnicalName() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1"); - var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .technicalName("Component 1") - .displayName("Component 1") - .description("Description") - .build(); + var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder().technicalName("Component 1").displayName("Component 1").description("Description").build(); var response = dossierTemplateExternalClient.createComponents(dossierTemplate.getId(), List.of(componentDefinitionAddRequest)); assertEquals(response.size(), 1); @@ -212,24 +190,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe public void testGetAllComponentsForADossierTemplate() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1"); - var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .technicalName("Component 1") - .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 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)); @@ -250,24 +213,9 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe public void testReorderComponentDefinitions() { var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate("dossier1"); - var componentDefinitionAddRequest = ComponentDefinitionAddRequest.builder() - .dossierTemplateId(dossierTemplate.getId()) - .technicalName("Component 1") - .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 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)); @@ -284,6 +232,35 @@ public class ComponentDefinitionTests extends AbstractPersistenceServerServiceTe assertEquals(newOrder.get(1).getRank(), 2); assertEquals(newOrder.get(2).getId(), firstComponentId); 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); } } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentDefinitionAddRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentDefinitionAddRequest.java index aff76eda2..059c0b3a9 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentDefinitionAddRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentDefinitionAddRequest.java @@ -14,10 +14,6 @@ import lombok.NonNull; @Schema(description = "Object containing information about a component.") public class ComponentDefinitionAddRequest { - @NonNull - @Schema(description = "The dossierTemplateId for this component.") - private String dossierTemplateId; - @NonNull @Schema(description = "The technical name of the component in snake case. Must be unique within the same dossier template.") private String technicalName;