public async Task <IActionResult> Delete(string id)
        {
            logger.LogInformation("In Delete action with id: {Id}", id);

            var delivery = await deliveryRepository.GetAsync(id);

            if (delivery == null)
            {
                logger.LogDebug("Delivery id: {Id} not found", id);
                return(NotFound());
            }

            // Adds the delivery cancelled status event
            var deliveryStatusEvent = new DeliveryStatusEvent {
                DeliveryId = id, Stage = DeliveryEventType.Cancelled
            };
            await deliveryStatusEventRepository.AddAsync(deliveryStatusEvent);

            // forwards cancelled delivery to the Delivery History
            var allEvents = await deliveryStatusEventRepository.GetByDeliveryIdAsync(id);

            await deliveryHistoryService.CancelAsync(delivery, allEvents.ToArray());

            // logical delivery deletion
            await deliveryRepository.DeleteAsync(id, delivery);

            return(Ok());
        }
        public async Task <IActionResult> Put([FromBody] Delivery delivery, string id)
        {
            logger.LogInformation("In Put action with delivery {Id}: {@DeliveryInfo}", id, delivery.ToLogInfo());

            try
            {
                var internalDelivery = delivery.ToInternal();

                // Adds new inflight delivery
                await deliveryRepository.CreateAsync(internalDelivery);

                // Adds the delivery created status event
                var deliveryStatusEvent = new DeliveryStatusEvent {
                    DeliveryId = delivery.Id, Stage = DeliveryEventType.Created
                };
                await deliveryStatusEventRepository.AddAsync(deliveryStatusEvent);

                return(CreatedAtRoute("GetDelivery", new { id = delivery.Id }, delivery));
            }
            catch (DuplicateResourceException)
            {
                //This method is mainly used to create deliveries. If the delivery already exists then update
                logger.LogInformation("Updating resource with delivery id: {DeliveryId}", id);

                var internalDelivery = delivery.ToInternal();

                // Updates inflight delivery
                await deliveryRepository.UpdateAsync(id, internalDelivery);

                return(NoContent());
            }
        }
        public async Task <IActionResult> Patch(string id, [FromBody] RescheduledDelivery rescheduledDelivery)
        {
            logger.LogInformation("In Patch action with id: {Id} and rescheduledDelivery: {@RescheduledDelivery}", id, rescheduledDelivery.ToLogInfo());

            var delivery = await deliveryRepository.GetAsync(id);

            if (delivery == null)
            {
                logger.LogDebug("Delivery id: {Id} not found", id);
                return(NotFound());
            }

            var updatedDelivery = new InternalDelivery(delivery.Id,
                                                       delivery.Owner,
                                                       rescheduledDelivery.Pickup,
                                                       rescheduledDelivery.Dropoff,
                                                       rescheduledDelivery.Deadline,
                                                       delivery.Expedited,
                                                       delivery.ConfirmationRequired,
                                                       delivery.DroneId);

            // Adds the delivery rescheduled status event
            var deliveryStatusEvent = new DeliveryStatusEvent {
                DeliveryId = id, Stage = DeliveryEventType.Rescheduled
            };
            await deliveryStatusEventRepository.AddAsync(deliveryStatusEvent);

            // Updates the inflight delivery with updated information
            await deliveryRepository.UpdateAsync(id, updatedDelivery);

            return(Ok());
        }
        public async Task Put_AddsDeliveryStartedEvent()
        {
            // Arrange
            DeliveryStatusEvent startedEvent  = null;
            var deliveryStatusEventRepository = new Mock <IDeliveryStatusEventRepository>();

            deliveryStatusEventRepository.Setup(r => r.AddAsync(It.IsAny <DeliveryStatusEvent>()))
            .Returns(Task.CompletedTask)
            .Callback <DeliveryStatusEvent>(e => startedEvent = e);

            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(f => f.CreateLogger(It.IsAny <string>())).Returns(new Mock <ILogger>().Object);

            var target = new DeliveriesController(new Mock <IDeliveryRepository>().Object,
                                                  new Mock <INotifyMeRequestRepository>().Object,
                                                  new Mock <INotificationService>().Object,
                                                  new Mock <IDeliveryHistoryService>().Object,
                                                  deliveryStatusEventRepository.Object,
                                                  loggerFactory.Object);
            // Act
            var result = await target.Put(new Delivery("deliveryid", new UserAccount("user", "account"), new Location(0, 0, 0), new Location(2, 2, 2), "deadline", true, ConfirmationType.FingerPrint, "drone"), "deliveryid");

            var createdAtRouteResult = (CreatedAtRouteResult)result;

            // Assert
            Assert.AreEqual(201, createdAtRouteResult.StatusCode);
            Assert.IsNotNull(createdAtRouteResult.Value);
            Assert.IsNotNull(startedEvent);
            Assert.AreEqual(DeliveryEventType.Created, startedEvent.Stage);
            deliveryStatusEventRepository.VerifyAll();
        }
        public async Task Delete_SendsMessageWithCancelledEvent()
        {
            // Arrange
            InternalDelivery    cancelledDelivery = null;
            DeliveryStatusEvent cancelEvent       = null;

            DeliveryStatusEvent[] allEvents = null;

            var deliveryRepository = new Mock <IDeliveryRepository>();

            deliveryRepository.Setup(r => r.GetAsync("deliveryid")).ReturnsAsync(delivery);

            var deliveryHistoryService = new Mock <IDeliveryHistoryService>();

            deliveryHistoryService.Setup(r => r.CancelAsync(It.IsAny <InternalDelivery>(), It.IsAny <DeliveryStatusEvent[]>()))
            .Returns(Task.CompletedTask)
            .Callback <InternalDelivery, DeliveryStatusEvent[]>((d, es) =>
            {
                cancelledDelivery = d;
                allEvents         = es;
            });

            var deliveryStatusEventRepository = new Mock <IDeliveryStatusEventRepository>();

            deliveryStatusEventRepository.Setup(r => r.AddAsync(It.IsAny <DeliveryStatusEvent>()))
            .Returns(Task.CompletedTask)
            .Callback <DeliveryStatusEvent>(e => cancelEvent = e);

            deliveryStatusEventRepository.Setup(r => r.GetByDeliveryIdAsync("deliveryid"))
            .ReturnsAsync(new ReadOnlyCollection <DeliveryStatusEvent>(new List <DeliveryStatusEvent>()
            {
                cancelEvent
            }));

            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(f => f.CreateLogger(It.IsAny <string>())).Returns(new Mock <ILogger>().Object);

            var target = new DeliveriesController(deliveryRepository.Object,
                                                  new Mock <INotifyMeRequestRepository>().Object,
                                                  new Mock <INotificationService>().Object,
                                                  deliveryHistoryService.Object,
                                                  deliveryStatusEventRepository.Object,
                                                  loggerFactory.Object);
            // Act
            await target.Delete("deliveryid");

            // Assert
            Assert.IsNotNull(cancelEvent);
            Assert.AreEqual("deliveryid", cancelEvent.DeliveryId);
            Assert.AreEqual(DeliveryEventType.Cancelled, cancelEvent.Stage);
            deliveryRepository.VerifyAll();
            deliveryHistoryService.Verify(s => s.CancelAsync(delivery, allEvents), Times.Once);
        }
        public async Task Confirm_DeletesDeliveryLogically()
        {
            // Arrange
            InternalDelivery    confirmedDelivery = null;
            DeliveryStatusEvent completeEvent     = null;

            var deliveryRepository = new Mock <IDeliveryRepository>();

            deliveryRepository.Setup(r => r.GetAsync("deliveryid")).ReturnsAsync(delivery);
            deliveryRepository.Setup(r => r.DeleteAsync("deliveryid", It.IsAny <InternalDelivery>()))
            .Returns(Task.CompletedTask)
            .Callback <string, InternalDelivery>((i, d) => confirmedDelivery = d);

            var deliveryStatusEventRepository = new Mock <IDeliveryStatusEventRepository>();

            deliveryStatusEventRepository.Setup(r => r.AddAsync(It.IsAny <DeliveryStatusEvent>()))
            .Returns(Task.CompletedTask)
            .Callback <DeliveryStatusEvent>(e => completeEvent = e);

            deliveryStatusEventRepository.Setup(r => r.GetByDeliveryIdAsync("deliveryid"))
            .ReturnsAsync(new ReadOnlyCollection <DeliveryStatusEvent>(new List <DeliveryStatusEvent>()
            {
                completeEvent
            }));

            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(f => f.CreateLogger(It.IsAny <string>())).Returns(new Mock <ILogger>().Object);

            var target = new DeliveriesController(deliveryRepository.Object,
                                                  new Mock <INotifyMeRequestRepository>().Object,
                                                  new Mock <INotificationService>().Object,
                                                  new Mock <IDeliveryHistoryService>().Object,
                                                  deliveryStatusEventRepository.Object,
                                                  loggerFactory.Object);
            var location     = new Location(1, 2, 3);
            var confirmation = new Confirmation(new DateTimeStamp("datetimevalue"),
                                                location,
                                                ConfirmationType.Picture,
                                                "confirmationblob");

            // Act
            var result = await target.Confirm("deliveryid", confirmation) as OkResult;

            // Assert
            Assert.IsNotNull(result);
            deliveryRepository.Verify(r => r.DeleteAsync("deliveryid", confirmedDelivery));
            Assert.AreEqual(location, confirmedDelivery.Dropoff);
        }
        public async Task Patch_AddsRescheduledDeliveryEvent()
        {
            // Arrange
            DeliveryStatusEvent rescheduledEvent = null;

            var rescheduledDelivery = new RescheduledDelivery(new Location(2, 2, 2),
                                                              new Location(3, 3, 3),
                                                              "newdeadline");

            var deliveryRepository = new Mock <IDeliveryRepository>();

            deliveryRepository.Setup(r => r.GetAsync("deliveryid")).ReturnsAsync(delivery);

            var deliveryStatusEventRepository = new Mock <IDeliveryStatusEventRepository>();

            deliveryStatusEventRepository.Setup(r => r.AddAsync(It.IsAny <DeliveryStatusEvent>()))
            .Returns(Task.CompletedTask)
            .Callback <DeliveryStatusEvent>(e => rescheduledEvent = e);

            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(f => f.CreateLogger(It.IsAny <string>())).Returns(new Mock <ILogger>().Object);

            var target = new DeliveriesController(deliveryRepository.Object,
                                                  new Mock <INotifyMeRequestRepository>().Object,
                                                  new Mock <INotificationService>().Object,
                                                  new Mock <IDeliveryHistoryService>().Object,
                                                  deliveryStatusEventRepository.Object,
                                                  loggerFactory.Object);

            // Act
            var result = await target.Patch("deliveryid", rescheduledDelivery) as OkResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.IsNotNull(rescheduledEvent);
            Assert.AreEqual(DeliveryEventType.Rescheduled, rescheduledEvent.Stage);
            deliveryStatusEventRepository.VerifyAll();
        }
        public async Task Confirm_SendsMessageCompleteToDeliveryHistory()
        {
            // Arrange
            InternalDelivery     confirmedDelivery = null;
            InternalConfirmation sentConfirmation  = null;
            DeliveryStatusEvent  completeEvent     = null;

            DeliveryStatusEvent[] allEvents = null;

            var deliveryRepository = new Mock <IDeliveryRepository>();

            deliveryRepository.Setup(r => r.GetAsync("deliveryid")).ReturnsAsync(delivery);

            var notifyMeRequestRepository = new Mock <INotifyMeRequestRepository>();

            notifyMeRequestRepository.Setup(r => r.GetAllByDeliveryIdAsync("deliveryid"))
            .ReturnsAsync(new List <InternalNotifyMeRequest>());

            var deliveryStatusEventRepository = new Mock <IDeliveryStatusEventRepository>();

            deliveryStatusEventRepository.Setup(r => r.AddAsync(It.IsAny <DeliveryStatusEvent>()))
            .Returns(Task.CompletedTask)
            .Callback <DeliveryStatusEvent>(e => completeEvent = e);

            deliveryStatusEventRepository.Setup(r => r.GetByDeliveryIdAsync("deliveryid"))
            .ReturnsAsync(new ReadOnlyCollection <DeliveryStatusEvent>(new List <DeliveryStatusEvent>()
            {
                completeEvent
            }));

            var deliveryHistoryService = new Mock <IDeliveryHistoryService>();

            deliveryHistoryService.Setup(r => r.CompleteAsync(It.IsAny <InternalDelivery>(), It.IsAny <InternalConfirmation>(), It.IsAny <DeliveryStatusEvent[]>()))
            .Returns(Task.CompletedTask)
            .Callback <InternalDelivery, InternalConfirmation, DeliveryStatusEvent[]>((d, c, es) =>
            {
                confirmedDelivery = d;
                sentConfirmation  = c;
                allEvents         = es;
            });

            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(f => f.CreateLogger(It.IsAny <string>())).Returns(new Mock <ILogger>().Object);

            var target = new DeliveriesController(deliveryRepository.Object,
                                                  notifyMeRequestRepository.Object,
                                                  new Mock <INotificationService>().Object,
                                                  deliveryHistoryService.Object,
                                                  deliveryStatusEventRepository.Object,
                                                  loggerFactory.Object);

            var confirmation = new Confirmation(new DateTimeStamp("datetimevalue"),
                                                new Location(1, 2, 3),
                                                ConfirmationType.Picture,
                                                "confirmationblob");

            // Act
            var result = await target.Confirm("deliveryid", confirmation) as OkResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("datetimevalue", sentConfirmation.DateTime.DateTimeValue);
            Assert.AreEqual(1, sentConfirmation.GeoCoordinates.Altitude);
            Assert.AreEqual(2, sentConfirmation.GeoCoordinates.Latitude);
            Assert.AreEqual(3, sentConfirmation.GeoCoordinates.Longitude);
            Assert.AreEqual(ConfirmationType.Picture, sentConfirmation.ConfirmationType);
            Assert.AreEqual("confirmationblob", sentConfirmation.ConfirmationBlob);
            deliveryHistoryService.Verify(s => s.CompleteAsync(confirmedDelivery, It.IsAny <InternalConfirmation>(), allEvents), Times.Once);
        }
        public async Task Confirm_SendsNotifications()
        {
            // Arrange
            DeliveryStatusEvent completeEvent = null;

            var deliveryRepository = new Mock <IDeliveryRepository>();

            deliveryRepository.Setup(r => r.GetAsync("deliveryid")).ReturnsAsync(delivery);

            var notifyMeRequests = new List <InternalNotifyMeRequest>();

            notifyMeRequests.Add(new InternalNotifyMeRequest
            {
                DeliveryId = "deliveryid", EmailAddress = "*****@*****.**", SMS = "1111111"
            });
            notifyMeRequests.Add(new InternalNotifyMeRequest
            {
                DeliveryId = "deliveryid", EmailAddress = "*****@*****.**", SMS = "2222222"
            });
            var notifyMeRequestRepository = new Mock <INotifyMeRequestRepository>();

            notifyMeRequestRepository.Setup(r => r.GetAllByDeliveryIdAsync("deliveryid"))
            .ReturnsAsync(notifyMeRequests);

            int notificationServiceCalled = 0;
            var notificationService       = new Mock <INotificationService>();

            notificationService.Setup(s => s.SendNotificationsAsync(It.IsAny <InternalNotifyMeRequest>()))
            .Returns(Task.CompletedTask)
            .Callback(() => notificationServiceCalled++);


            var deliveryStatusEventRepository = new Mock <IDeliveryStatusEventRepository>();

            deliveryStatusEventRepository.Setup(r => r.GetByDeliveryIdAsync("deliveryid"))
            .ReturnsAsync(new ReadOnlyCollection <DeliveryStatusEvent>(new List <DeliveryStatusEvent>()
            {
                completeEvent
            }));

            var deliveryHistoryService = new Mock <IDeliveryHistoryService>();

            deliveryHistoryService.Setup(r => r.CompleteAsync(delivery, It.IsAny <InternalConfirmation>(), It.IsAny <DeliveryStatusEvent[]>())).Returns(Task.CompletedTask);

            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(f => f.CreateLogger(It.IsAny <string>())).Returns(new Mock <ILogger>().Object);

            var target = new DeliveriesController(deliveryRepository.Object,
                                                  notifyMeRequestRepository.Object,
                                                  notificationService.Object,
                                                  new Mock <IDeliveryHistoryService>().Object,
                                                  deliveryStatusEventRepository.Object,
                                                  loggerFactory.Object);

            var confirmation = new Confirmation(new DateTimeStamp("datetimevalue"),
                                                new Location(1, 2, 3),
                                                ConfirmationType.Picture,
                                                "confirmationblob");
            // Acts
            var result = await target.Confirm("deliveryid", confirmation) as OkResult;

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(2, notificationServiceCalled);
        }
Esempio n. 10
0
 public async Task AddAsync(DeliveryStatusEvent deliveryStatusEvent)
 {
     //FC: log with scope and timing
     await RedisCache <DeliveryStatusEvent> .CreateItemAsync(deliveryStatusEvent).ConfigureAwait(continueOnCapturedContext: false);
 }