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); }
public async Task AddAsync(DeliveryStatusEvent deliveryStatusEvent) { //FC: log with scope and timing await RedisCache <DeliveryStatusEvent> .CreateItemAsync(deliveryStatusEvent).ConfigureAwait(continueOnCapturedContext: false); }