diff --git a/Cleipnir.ResilientFunctions b/Cleipnir.ResilientFunctions index 34b24b2..ee98fba 160000 --- a/Cleipnir.ResilientFunctions +++ b/Cleipnir.ResilientFunctions @@ -1 +1 @@ -Subproject commit 34b24b252a9e367e43946a0c243d4696ee8dc481 +Subproject commit ee98fba993e55161b46a96c9303df26552076c6e diff --git a/Cleipnir.Tests/Flows/CorrelationIdFlowTests.cs b/Cleipnir.Tests/Flows/CorrelationIdFlowTests.cs deleted file mode 100644 index a1c43db..0000000 --- a/Cleipnir.Tests/Flows/CorrelationIdFlowTests.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Cleipnir.ResilientFunctions.Helpers; -using Cleipnir.ResilientFunctions.Storage; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; - -namespace Cleipnir.Flows.Tests.Flows; - -[TestClass] -public class CorrelationIdFlowTests -{ - [TestMethod] - public async Task MessageIsRoutedToFlowUsingCorrelationId() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - - var flowStore = new InMemoryFunctionStore(); - var flowsContainer = new FlowsContainer( - flowStore, - serviceCollection.BuildServiceProvider(), - Options.Default - ); - - var flows = new RouteUsingCorrelationParamlessFlows(flowsContainer); - await flows.Schedule("SomeInstanceId"); - - await BusyWait.Until(() => RouteUsingCorrelationParamlessFlow.CorrelationRegistered); - - var msg = new Message("SomeCorrelationId", "SomeValue"); - await flows.RouteMessage(msg, msg.Route); - - await BusyWait.Until(() => RouteUsingCorrelationParamlessFlow.ReceivedMessage != null); - RouteUsingCorrelationParamlessFlow.ReceivedMessage.ShouldBe(msg); - } - - public class RouteUsingCorrelationParamlessFlows(FlowsContainer flowsContainer) - : Flows(nameof(RouteUsingCorrelationParamlessFlow), flowsContainer); - - public class RouteUsingCorrelationParamlessFlow : Flow - { - public static volatile bool CorrelationRegistered; - public static Message? ReceivedMessage { get; set; } - - public override async Task Run() - { - await Workflow.RegisterCorrelation("SomeCorrelationId"); - CorrelationRegistered = true; - - ReceivedMessage = await Message(); - } - } - - public record Message(string Route, string Value); -} \ No newline at end of file diff --git a/Cleipnir/Flow.cs b/Cleipnir/Flow.cs index 7d2da79..9d57c6e 100644 --- a/Cleipnir/Flow.cs +++ b/Cleipnir/Flow.cs @@ -8,7 +8,6 @@ namespace Cleipnir.Flows; public abstract class BaseFlow { public Workflow Workflow { get; init; } = null!; - public Utilities Utilities => Workflow.Utilities; public Effect Effect => Workflow.Effect; #region Capture explicit id with ResiliencyLevel @@ -63,18 +62,18 @@ public Task Capture(Action work, ResiliencyLevel resiliencyLevel = ResiliencyLev #endregion - public Task Message(TimeSpan? maxWait = null) where TMessage : class - => Workflow.Message(maxWait); - public Task Message(DateTime waitUntil, TimeSpan? maxWait = null) where TMessage : class - => Workflow.Message(waitUntil, maxWait); - public Task Message(TimeSpan waitFor, TimeSpan? maxWait = null) where TMessage : class - => Workflow.Message(waitFor, maxWait); - public Task Message(Func filter, TimeSpan? maxWait = null) where TMessage : class - => Workflow.Message(filter, maxWait); - public Task Message(Func filter, DateTime waitUntil, TimeSpan? maxWait = null) where TMessage : class - => Workflow.Message(filter, waitUntil, maxWait); - public Task Message(Func filter, TimeSpan waitFor, TimeSpan? maxWait = null) where TMessage : class - => Workflow.Message(filter, waitFor, maxWait); + public Task Message() where TMessage : class + => Workflow.Message(); + public Task Message(DateTime waitUntil) where TMessage : class + => Workflow.Message(waitUntil); + public Task Message(TimeSpan waitFor) where TMessage : class + => Workflow.Message(waitFor); + public Task Message(Func filter) where TMessage : class + => Workflow.Message(filter); + public Task Message(Func filter, DateTime waitUntil) where TMessage : class + => Workflow.Message(filter, waitUntil); + public Task Message(Func filter, TimeSpan waitFor) where TMessage : class + => Workflow.Message(filter, waitFor); public Task Delay(TimeSpan @for, bool suspend = true) => Workflow.Delay(@for, suspend); public Task Delay(DateTime until, bool suspend = true) => Workflow.Delay(until, suspend); diff --git a/Cleipnir/Flows.cs b/Cleipnir/Flows.cs index 1be5756..8a81a75 100644 --- a/Cleipnir/Flows.cs +++ b/Cleipnir/Flows.cs @@ -15,8 +15,6 @@ namespace Cleipnir.Flows; public interface IBaseFlows { public static abstract Type FlowType { get; } - - public Task RouteMessage(T message, string correlationId, string? idempotencyKey = null) where T : class; } public abstract class BaseFlows : IBaseFlows where TFlow : notnull @@ -44,8 +42,6 @@ protected static Action CreateWorkflowSetter() var setter = lambdaExpr.Compile(); return setter; } - - public abstract Task RouteMessage(T message, string correlationId, string? idempotencyKey = null) where T : class; } public class Flows : BaseFlows where TFlow : Flow @@ -143,17 +139,6 @@ public Task Schedule(FlowInstance instanceId, InitialState? initialSt /// A task which will complete when the flow has been persisted public Task ScheduleIn(FlowInstance instanceId, TimeSpan delay) => _registration.ScheduleIn(instanceId.Value, delay); - /// - /// Route a message to the flow with registered correlation id - /// - /// Message to be delivered to the flow - /// Correlation id by which the flow is resolved - /// Optional idempotency key to de-duplicate messages - /// Message type - /// A task which will complete when the message has been persisted - public override Task RouteMessage(T message, string correlationId, string? idempotencyKey = null) - => _registration.RouteMessage(message, correlationId, idempotencyKey); - /// /// Schedule multiple flows at once /// Execution of flows will be divided between the replicas @@ -301,17 +286,6 @@ public Task ScheduleIn( TimeSpan delay ) => _registration.ScheduleIn(instanceId.Value, param, delay); - /// - /// Route a message to the flow with registered correlation id - /// - /// Message to be delivered to the flow - /// Correlation id by which the flow is resolved - /// Optional idempotency key to de-duplicate messages - /// Message type - /// A task which will complete when the message has been persisted - public override Task RouteMessage(T message, string correlationId, string? idempotencyKey = null) - => _registration.RouteMessage(message, correlationId, idempotencyKey); - /// /// Emit interrupt signal to flows /// Execution of suspended flows will be resumed. Already executing flows will be restarted on suspension. @@ -455,17 +429,6 @@ public Task ScheduleIn( TimeSpan delay ) => _registration.ScheduleIn(instanceId.Value, param, delay); - /// - /// Route a message to the flow with registered correlation id - /// - /// Message to be delivered to the flow - /// Correlation id by which the flow is resolved - /// Optional idempotency key to de-duplicate messages - /// Message type - /// A task which will complete when the message has been persisted - public override Task RouteMessage(T message, string correlationId, string? idempotencyKey = null) - => _registration.RouteMessage(message, correlationId, idempotencyKey); - /// /// Emit interrupt signal to flows /// Execution of suspended flows will be resumed. Already executing flows will be restarted on suspension. diff --git a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/IBankCentralClient.cs b/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/IBankCentralClient.cs deleted file mode 100644 index 3902c55..0000000 --- a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/IBankCentralClient.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Cleipnir.ResilientFunctions.Helpers; - -namespace Cleipnir.Flows.Sample.MicrosoftOpen.Flows.BankTransfer; - -public interface IBankCentralClient -{ - Task PostTransaction(Guid transactionId, string account, decimal amount); - Task GetAvailableFunds(string account); -} - -public class BankCentralClient : IBankCentralClient -{ - public Task PostTransaction(Guid transactionId, string account, decimal amount) - { - Console.WriteLine($"POSTING: {amount} to {account} account"); - return Task.Delay(1_000).ContinueWith(_ => true); - } - - public Task GetAvailableFunds(string account) => 100M.ToTask(); -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/Transfer.cs b/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/Transfer.cs deleted file mode 100644 index fc0f515..0000000 --- a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/Transfer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Cleipnir.Flows.Sample.MicrosoftOpen.Flows.BankTransfer; - -public record Transfer( - Guid TransactionId, - string FromAccount, - string ToAccount, - decimal Amount -); \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/TransferFlow.cs b/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/TransferFlow.cs deleted file mode 100644 index 324b0d5..0000000 --- a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/BankTransfer/TransferFlow.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Cleipnir.ResilientFunctions.Domain; - -namespace Cleipnir.Flows.Sample.MicrosoftOpen.Flows.BankTransfer; - -[GenerateFlows] -public class TransferFlow : Flow -{ - public override async Task Run(Transfer transfer) - { - var availableFunds = await _bankCentralClient.GetAvailableFunds(transfer.FromAccount); - if (availableFunds <= transfer.Amount) - throw new InvalidOperationException("Insufficient funds on from account"); - - await _bankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.FromAccount, - -transfer.Amount - ); - - await _bankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.ToAccount, - transfer.Amount - ); - } - - private Task DistributedLock(string account) - => Workflow.Synchronization.AcquireLock("BankTransfer", instance: account); - - private readonly IBankCentralClient _bankCentralClient = new BankCentralClient(); -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/MessageDriven/Other/PostmanExtensions.cs b/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/MessageDriven/Other/PostmanExtensions.cs deleted file mode 100644 index dc47f76..0000000 --- a/Samples/Cleipnir.Sample.Presentation.AspNet/Flows/MessageDriven/Other/PostmanExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Cleipnir.ResilientFunctions.Messaging; - -namespace Cleipnir.Flows.Sample.MicrosoftOpen.Flows.MessageDriven.Other; - -public static class PostmanExtensions -{ - public static Task RouteMessage(this Postman postman, object message, Type messageType) - { - return (Task) typeof(Postman) - .GetMethods() - .Single(m => m.Name == nameof(Postman.RouteMessage) && m.GetParameters().Length == 1) - .MakeGenericMethod([messageType]) - .Invoke(postman, [message])!; - } -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/C_NewsletterSender/Distributed/NewsletterParentFlow.cs b/Samples/Cleipnir.Sample.Presentation/C_NewsletterSender/Distributed/NewsletterParentFlow.cs index bb84df9..bf7bbc8 100644 --- a/Samples/Cleipnir.Sample.Presentation/C_NewsletterSender/Distributed/NewsletterParentFlow.cs +++ b/Samples/Cleipnir.Sample.Presentation/C_NewsletterSender/Distributed/NewsletterParentFlow.cs @@ -23,7 +23,7 @@ public override async Task Run(MailAndRecipients param) await childFlows.BulkSchedule(bulkWork); for (var i = 0; i < 3; i++) - await Message(maxWait: TimeSpan.FromMinutes(30)); + await Message(waitFor: TimeSpan.FromMinutes(30)); Console.WriteLine("Finished NewsletterParentFlow"); } diff --git a/Samples/Cleipnir.Sample.Presentation/E_CustomerSignup/Solution/SignupFlow.cs b/Samples/Cleipnir.Sample.Presentation/E_CustomerSignup/Solution/SignupFlow.cs index 3fe5e03..df03de6 100644 --- a/Samples/Cleipnir.Sample.Presentation/E_CustomerSignup/Solution/SignupFlow.cs +++ b/Samples/Cleipnir.Sample.Presentation/E_CustomerSignup/Solution/SignupFlow.cs @@ -9,7 +9,7 @@ public override async Task Run(string customerEmail) for (var i = 0; i <= 3; i++) { - var emailVerified = await Message(maxWait: TimeSpan.FromDays(1)); + var emailVerified = await Message(waitFor: TimeSpan.FromDays(1)); if (emailVerified != null) break; diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Example.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Example.cs deleted file mode 100644 index 83da835..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Example.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Cleipnir.ResilientFunctions.PostgreSQL; - -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer; - -public static class Example -{ - public static async Task Perform() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - - var connStr = "Server=localhost;Database=presentation;User Id=postgres;Password=Pa55word!; Include Error Detail=true;"; - await DatabaseHelper.CreateDatabaseIfNotExists(connStr); - var store = new PostgreSqlFunctionStore(connStr); - await store.Initialize(); - - var flowsContainer = new FlowsContainer( - store, - serviceCollection.BuildServiceProvider(), - Options.Default - ); - - var transferFlows = new Flows(nameof(TransferFlow), flowsContainer); - var transactionId = Guid.NewGuid(); - await transferFlows.Run( - transactionId.ToString(), new Transfer(transactionId, "FROM_ACC123", "TO_ACC456", Amount: 100) - ); - } -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/IBankCentralClient.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/IBankCentralClient.cs deleted file mode 100644 index 4693e56..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/IBankCentralClient.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Cleipnir.ResilientFunctions.Helpers; - -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer; - -public interface IBankCentralClient -{ - Task PostTransaction(Guid transactionId, string account, decimal amount); - Task GetAvailableFunds(string account); -} - -public class BankCentralClient : IBankCentralClient -{ - public Task PostTransaction(Guid transactionId, string account, decimal amount) - { - Console.WriteLine($"POSTING: {amount} to {account} account"); - return Task.Delay(1_000).ContinueWith(_ => true); - } - - public Task GetAvailableFunds(string account) => 100M.ToTask(); -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/Example.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/Example.cs deleted file mode 100644 index 77ca078..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/Example.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Cleipnir.ResilientFunctions.PostgreSQL; - -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer.Solution; - -public static class Example -{ - public static async Task Perform() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - - var connStr = "Server=localhost;Database=presentation;User Id=postgres;Password=Pa55word!; Include Error Detail=true;"; - await DatabaseHelper.CreateDatabaseIfNotExists(connStr); - var store = new PostgreSqlFunctionStore(connStr); - await store.Initialize(); - - var flowsContainer = new FlowsContainer( - store, - serviceCollection.BuildServiceProvider(), - Options.Default - ); - - var transferFlows = new Flows(nameof(TransferFlow), flowsContainer); - var transactionId = Guid.NewGuid(); - await transferFlows.Run( - transactionId.ToString(), new Transfer(transactionId, "FROM_ACC123", "TO_ACC456", Amount: 100) - ); - } -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/IBankCentralClient.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/IBankCentralClient.cs deleted file mode 100644 index 5ed80f2..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/IBankCentralClient.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Cleipnir.ResilientFunctions.Helpers; - -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer.Solution; - -public interface IBankCentralClient -{ - Task PostTransaction(Guid transactionId, string account, decimal amount); - Task GetAvailableFunds(string account); -} - -public class BankCentralClient : IBankCentralClient -{ - public Task PostTransaction(Guid transactionId, string account, decimal amount) - { - Console.WriteLine($"POSTING: {amount} to {account} account"); - return Task.Delay(1_000).ContinueWith(_ => true); - } - - public Task GetAvailableFunds(string account) => 100M.ToTask(); -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/Transfer.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/Transfer.cs deleted file mode 100644 index b9a7722..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/Transfer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer.Solution; - -public record Transfer( - Guid TransactionId, - string FromAccount, - string ToAccount, - decimal Amount -); \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/TransferFlow.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/TransferFlow.cs deleted file mode 100644 index c960ac9..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Solution/TransferFlow.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer.Solution; - -public sealed class TransferFlow : Flow -{ - public TransferFlow(IBankCentralClient bankCentralClient) => BankCentralClient = bankCentralClient; - - private IBankCentralClient BankCentralClient { get; } - - public override async Task Run(Transfer transfer) - { - await using var @lock = await Workflow.Synchronization.AcquireLock( - group: "BankTransfer", instance: transfer.FromAccount - ); - - var availableFunds = await BankCentralClient.GetAvailableFunds(transfer.FromAccount); - if (availableFunds <= transfer.Amount) - throw new InvalidOperationException("Insufficient funds on from account"); - - await BankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.FromAccount, - -transfer.Amount - ); - - await BankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.ToAccount, - transfer.Amount - ); - } -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Transfer.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Transfer.cs deleted file mode 100644 index 80768f8..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/Transfer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer; - -public record Transfer( - Guid TransactionId, - string FromAccount, - string ToAccount, - decimal Amount -); \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/TransferFlow.cs b/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/TransferFlow.cs deleted file mode 100644 index 450a67c..0000000 --- a/Samples/Cleipnir.Sample.Presentation/H_BankTransfer/TransferFlow.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Cleipnir.Flows.Sample.Presentation.H_BankTransfer; - -public sealed class TransferFlow : Flow -{ - public TransferFlow(IBankCentralClient bankCentralClient) => BankCentralClient = bankCentralClient; - - private IBankCentralClient BankCentralClient { get; } - - public override async Task Run(Transfer transfer) - { - var (transactionId, fromAccount, toAccount, amount) = transfer; - - //check available funds - - //withdraw funds from sender account - //add funds to receiver account - - await Task.CompletedTask; - } -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/Program.cs b/Samples/Cleipnir.Sample.Presentation/Program.cs index e9d5cc1..9f185de 100644 --- a/Samples/Cleipnir.Sample.Presentation/Program.cs +++ b/Samples/Cleipnir.Sample.Presentation/Program.cs @@ -12,8 +12,7 @@ private static async Task Main(string[] args) .CreateLogger(); //await C_NewsletterSender.Distributed.Example.Perform(); - await H_BankTransfer.Example.Perform(); - + Console.ReadLine(); } } \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/Other/IBankCentralClient.cs b/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/Other/IBankCentralClient.cs deleted file mode 100644 index 1bc9c83..0000000 --- a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/Other/IBankCentralClient.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Cleipnir.ResilientFunctions.Helpers; - -namespace Cleipnir.Flows.Sample.Presentation.Solutions.H_BankTransfer.Other; - -public interface IBankCentralClient -{ - Task PostTransaction(Guid transactionId, string account, decimal amount); - Task GetAvailableFunds(string account); -} - -public class BankCentralClient : IBankCentralClient -{ - public Task PostTransaction(Guid transactionId, string account, decimal amount) - { - Console.WriteLine($"POSTING: {amount} to {account} account"); - return Task.Delay(1_000).ContinueWith(_ => true); - } - - public Task GetAvailableFunds(string account) => 100M.ToTask(); -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/Other/Transfer.cs b/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/Other/Transfer.cs deleted file mode 100644 index facfc49..0000000 --- a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/Other/Transfer.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Cleipnir.Flows.Sample.Presentation.Solutions.H_BankTransfer.Other; - -public record Transfer( - Guid TransactionId, - string FromAccount, - string ToAccount, - decimal Amount -); \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/TransferFlow0.cs b/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/TransferFlow0.cs deleted file mode 100644 index b799eec..0000000 --- a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/TransferFlow0.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Cleipnir.Flows.Sample.Presentation.Solutions.H_BankTransfer.Other; - -namespace Cleipnir.Flows.Sample.Presentation.Solutions.H_BankTransfer; - -[GenerateFlows] -public sealed class TransferFlow0 : Flow -{ - public TransferFlow0(IBankCentralClient bankCentralClient) => BankCentralClient = bankCentralClient; - - private IBankCentralClient BankCentralClient { get; } - - public override async Task Run(Transfer transfer) - { - var availableFunds = await BankCentralClient.GetAvailableFunds(transfer.FromAccount); - if (availableFunds <= transfer.Amount) - throw new InvalidOperationException("Insufficient funds on from account"); - - await BankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.FromAccount, - -transfer.Amount - ); - - await BankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.ToAccount, - transfer.Amount - ); - } -} \ No newline at end of file diff --git a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/TransferFlow1.cs b/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/TransferFlow1.cs deleted file mode 100644 index 63ccac5..0000000 --- a/Samples/Cleipnir.Sample.Presentation/Solutions/H_BankTransfer/TransferFlow1.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Cleipnir.Flows.Sample.Presentation.Solutions.H_BankTransfer.Other; - -namespace Cleipnir.Flows.Sample.Presentation.Solutions.H_BankTransfer; - -[GenerateFlows] -public sealed class TransferFlow1 : Flow -{ - public TransferFlow1(IBankCentralClient bankCentralClient) => BankCentralClient = bankCentralClient; - - private IBankCentralClient BankCentralClient { get; } - - public override async Task Run(Transfer transfer) - { - await using var @lock = await Workflow.Synchronization.AcquireLock( - group: "BankTransfer", instance: transfer.FromAccount - ); - - var availableFunds = await BankCentralClient.GetAvailableFunds(transfer.FromAccount); - if (availableFunds <= transfer.Amount) - throw new InvalidOperationException("Insufficient funds on from account"); - - await BankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.FromAccount, - -transfer.Amount - ); - - await BankCentralClient.PostTransaction( - transfer.TransactionId, - transfer.ToAccount, - transfer.Amount - ); - } -} \ No newline at end of file