using System.Threading.Tasks; using Dapr.Workflow; using DurableTask.Core.Exceptions; using WorkflowConsoleApp.Activities; using WorkflowConsoleApp.Models; namespace WorkflowConsoleApp.Workflows { class OrderProcessingWorkflow : Workflow { public override async Task RunAsync(WorkflowContext context, OrderPayload order) { string orderId = context.InstanceId; // Notify the user that an order has come through await context.CallActivityAsync( nameof(NotifyActivity), new Notification($"Received order {orderId} for {order.Quantity} {order.Name} at ${order.TotalCost}")); // Determine if there is enough of the item available for purchase by checking the inventory InventoryResult result = await context.CallActivityAsync( nameof(ReserveInventoryActivity), new InventoryRequest(RequestId: orderId, order.Name, order.Quantity)); // If there is insufficient inventory, fail and let the user know if (!result.Success) { // End the workflow here since we don't have sufficient inventory await context.CallActivityAsync( nameof(NotifyActivity), new Notification($"Insufficient inventory for {order.Name}")); return new OrderResult(Processed: false); } // There is enough inventory available so the user can purchase the item(s). Process their payment await context.CallActivityAsync( nameof(ProcessPaymentActivity), new PaymentRequest(RequestId: orderId, order.Name, order.Quantity, order.TotalCost)); try { // There is enough inventory available so the user can purchase the item(s). Process their payment await context.CallActivityAsync( nameof(UpdateInventoryActivity), new PaymentRequest(RequestId: orderId, order.Name, order.Quantity, order.TotalCost)); } catch (TaskFailedException) { // Let them know their payment was processed await context.CallActivityAsync( nameof(NotifyActivity), new Notification($"Order {orderId} Failed! You are now getting a refund")); return new OrderResult(Processed: false); } // Let them know their payment was processed await context.CallActivityAsync( nameof(NotifyActivity), new Notification($"Order {orderId} has completed!")); // End the workflow with a success result return new OrderResult(Processed: true); } } }