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 746597822ff7c915da2337bf58d52cd52a92e340..60b5182926540c7de0c3101d617ce2f6c23e3a33 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 d7214c4134e38adee1fbce93d8b92e3100e1f5d8..808b1ab69070889f7ca4269584ef18b63d2b8f9b 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 3af3d05b4e6b3c43bd2581ad06ea9c66931a3f67..305d454c0c3391b3f454e05b56e7a0d72d6e45b0 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