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()); }
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); }