public IActionResult Post([FromBody] Order order) { if (order == null) { return(BadRequest()); } try { // Create a tentative order. order.Status = Order.OrderStatus.tentative; var newOrder = repository.Add(order); // Publish OrderStatusChangedMessage. messagePublisher.PublishOrderCreatedMessage( newOrder.customerId, newOrder.Id, newOrder.OrderLines); // Wait until order status is "completed" bool completed = false; while (!completed) { var tentativeOrder = repository.Get(newOrder.Id); if (tentativeOrder.Status == Order.OrderStatus.completed) { completed = true; } Thread.Sleep(100); } return(CreatedAtRoute("GetOrder", new { id = newOrder.Id }, newOrder)); } catch { return(StatusCode(500, "An error happened. Try again.")); } }