public async Task <IActionResult> Confirm(string id, [FromBody] Confirmation confirmation)
        {
            logger.LogInformation("In Confirm action with id: {Id} and confirmation: {@Confirmation}", id, confirmation.ToLogInfo());

            var delivery = await deliveryRepository.GetAsync(id);

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

            var confirmedDelivery = new InternalDelivery(delivery.Id,
                                                         delivery.Owner,
                                                         delivery.Pickup,
                                                         confirmation.GeoCoordinates,
                                                         delivery.Deadline,
                                                         delivery.Expedited,
                                                         delivery.ConfirmationRequired,
                                                         delivery.DroneId);

            var internalConfirmation = new InternalConfirmation
            {
                DateTime         = confirmation.DateTime,
                GeoCoordinates   = confirmation.GeoCoordinates,
                ConfirmationType = confirmation.ConfirmationType,
                ConfirmationBlob = confirmation.ConfirmationBlob
            };

            // Adds the delivery complete status event
            await deliveryStatusEventRepository.AddAsync(new DeliveryStatusEvent
            {
                DeliveryId = id,
                Stage      = DeliveryEventType.DeliveryComplete
            });

            // get all the milestones from cache
            var allEvents = await deliveryStatusEventRepository.GetByDeliveryIdAsync(id);

            // archives Delivery by sending it to the Delivery History + Confirmantion details as well as forwarding milestones to the Delivery History
            await deliveryHistoryService.CompleteAsync(confirmedDelivery, internalConfirmation, allEvents.ToArray());

            // sends notifications
            var notifyMeRequests = await notifyMeRequestRepository.GetAllByDeliveryIdAsync(id);

            IEnumerable <Task> notificationTasks = notifyMeRequests.Select(nR => notificationService.SendNotificationsAsync(nR));

            await Task.WhenAll(notificationTasks);

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

            return(Ok());
        }
コード例 #2
0
 public async Task CompleteAsync(InternalDelivery delivery, InternalConfirmation confirmation, params DeliveryTrackingEvent[] deliveryTrackingEvents)
 {
     //TODO: shallowing confirmation (TBD)
     await EventHubSender <DeliveryHistory> .SendMessageAsync(new DeliveryHistory(delivery.Id, delivery, deliveryTrackingEvents), nameof(DeliveryStage.Completed), delivery.Id.Substring(0, Constants.PartitionKeyLength)).ConfigureAwait(continueOnCapturedContext: false);
 }
        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);
        }