From 25560732f1a63c390d59ae715edba10b46908dc9 Mon Sep 17 00:00:00 2001 From: Nikolaos Kyriakoulis Date: Fri, 19 Apr 2024 11:39:46 +0300 Subject: [PATCH] Implemented check for existence of Service Specifications for a Service Order --- .../so641/api/ServiceOrderApiController.java | 3 ++ .../reposervices/ServiceOrderRepoService.java | 49 +++++++++---------- .../so641/ServiceOrderApiControllerTest.java | 42 +++++++++++++++- 3 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java b/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java index 7465978..60b5182 100644 --- a/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java +++ b/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java @@ -143,6 +143,9 @@ public class ServiceOrderApiController implements ServiceOrderApi { return new ResponseEntity(c, HttpStatus.OK); + } catch (NotFoundException e) { + log.error("Couldn't create Service Order. ", e); + return new ResponseEntity(HttpStatus.BAD_REQUEST); } catch (Exception e) { log.error("Couldn't serialize response for content type application/json", e); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java b/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java index d7214c4..808b1ab 100644 --- a/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java +++ b/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java @@ -25,14 +25,7 @@ import java.nio.charset.StandardCharsets; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import com.fasterxml.jackson.core.JsonProcessingException; @@ -45,30 +38,16 @@ import org.apache.commons.logging.LogFactory; import org.etsi.osl.tmf.common.model.Any; import org.etsi.osl.tmf.common.model.EValueType; import org.etsi.osl.tmf.common.model.UserPartRoleType; -import org.etsi.osl.tmf.common.model.service.Characteristic; -import org.etsi.osl.tmf.common.model.service.Note; -import org.etsi.osl.tmf.common.model.service.ResourceRef; -import org.etsi.osl.tmf.common.model.service.ServiceRef; +import org.etsi.osl.tmf.common.model.service.*; import org.etsi.osl.tmf.prm669.model.RelatedParty; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService; import org.etsi.osl.tmf.sim638.service.ServiceRepoService; +import org.etsi.osl.tmf.so641.api.NotFoundException; import org.etsi.osl.tmf.so641.api.ServiceOrderApiRouteBuilderEvents; -import org.etsi.osl.tmf.so641.model.ServiceOrder; -import org.etsi.osl.tmf.so641.model.ServiceOrderActionType; -import org.etsi.osl.tmf.so641.model.ServiceOrderAttributeValueChangeEvent; -import org.etsi.osl.tmf.so641.model.ServiceOrderAttributeValueChangeNotification; -import org.etsi.osl.tmf.so641.model.ServiceOrderCreate; -import org.etsi.osl.tmf.so641.model.ServiceOrderCreateEvent; -import org.etsi.osl.tmf.so641.model.ServiceOrderCreateNotification; -import org.etsi.osl.tmf.so641.model.ServiceOrderItem; -import org.etsi.osl.tmf.so641.model.ServiceOrderRelationship; -import org.etsi.osl.tmf.so641.model.ServiceOrderStateChangeEvent; -import org.etsi.osl.tmf.so641.model.ServiceOrderStateChangeNotification; -import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; -import org.etsi.osl.tmf.so641.model.ServiceOrderUpdate; +import org.etsi.osl.tmf.so641.model.*; import org.etsi.osl.tmf.so641.repo.ServiceOrderRepository; import org.etsi.osl.tmf.util.KrokiClient; import org.hibernate.Hibernate; @@ -319,7 +298,20 @@ public class ServiceOrderRepoService { } @Transactional - public ServiceOrder addServiceOrder(@Valid ServiceOrderCreate serviceOrderCreate) { + public ServiceOrder addServiceOrder(@Valid ServiceOrderCreate serviceOrderCreate) throws NotFoundException { + // Ensure that all Services Specifications exist + List serviceOrderItemList = serviceOrderCreate.getOrderItem(); + for (ServiceOrderItem serviceOrderItem: serviceOrderItemList) { + ServiceRestriction serviceRestriction = serviceOrderItem.getService(); + ServiceSpecificationRef serviceSpecificationRef = serviceRestriction.getServiceSpecification(); + String serviceSpecificationId = serviceSpecificationRef.getId(); + + ServiceSpecification serviceSpecification = serviceSpecRepoService.findByUuid(serviceSpecificationId); + + if (serviceSpecification == null) + throw new NotFoundException(400, "There is no Service Specification with Id: " + serviceSpecificationId); + } + ServiceOrder so = new ServiceOrder(); so.setOrderDate(OffsetDateTime.now(ZoneOffset.UTC)); so.setCategory(serviceOrderCreate.getCategory()); @@ -827,12 +819,15 @@ public class ServiceOrderRepoService { } public String addServiceOrderReturnEager(@Valid ServiceOrderCreate serviceOrderCreate) { - ServiceOrder so = this.addServiceOrder(serviceOrderCreate); try { + ServiceOrder so = this.addServiceOrder(serviceOrderCreate); return this.getServiceOrderEagerAsString( so.getUuid()); } catch (JsonProcessingException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (NotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } return null; } diff --git a/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java b/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java index 3af3d05..305d454 100644 --- a/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java +++ b/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java @@ -89,6 +89,15 @@ public class ServiceOrderApiControllerTest { } + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) + @Test + public void testCreateServiceOrderWithNonExistingServiceSpecification() throws Exception { + + createServiceOrderWithNonExistingServiceSpecification(); + assertThat( serviceOrderRepoService.findAll().size() ).isEqualTo( FIXED_BOOTSTRAPS_SPECS ); + } + + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) @Test public void testDeleteServiceOrder() throws Exception { @@ -278,4 +287,35 @@ public class ServiceOrderApiControllerTest { return responsesSpec; } -} + + + private void createServiceOrderWithNonExistingServiceSpecification() throws Exception { + + assertThat( serviceOrderRepoService.findAll().size() ).isEqualTo( FIXED_BOOTSTRAPS_SPECS); + + ServiceOrderCreate serviceOrder = new ServiceOrderCreate(); + serviceOrder.setCategory("Test Category"); + serviceOrder.setDescription("A Test Service Order"); + serviceOrder.setRequestedStartDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + serviceOrder.setRequestedCompletionDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + + ServiceOrderItem soi = new ServiceOrderItem(); + serviceOrder.getOrderItem().add(soi); + soi.setState(ServiceOrderStateType.ACKNOWLEDGED); + + ServiceRestriction serviceRestriction = new ServiceRestriction(); + ServiceSpecificationRef aServiceSpecificationRef = new ServiceSpecificationRef(); + aServiceSpecificationRef.setId("A random non-existing Id"); + aServiceSpecificationRef.setName("A random non-existing name"); + + serviceRestriction.setServiceSpecification(aServiceSpecificationRef); + serviceRestriction.setName("aServiceRestriction"); + soi.setService(serviceRestriction); + + mvc + .perform(MockMvcRequestBuilders.post("/serviceOrdering/v4/serviceOrder") + .with( SecurityMockMvcRequestPostProcessors.csrf()) + .contentType(MediaType.APPLICATION_JSON).content(JsonUtils.toJson(serviceOrder))) + .andExpect(status().isBadRequest()).andReturn().getResponse().getContentAsString(); + } +} \ No newline at end of file -- GitLab