diff --git a/ReservationSaga/ReserveUsername.cs b/ReservationSaga/ReserveUsername.cs index 77cf924..942ed00 100644 --- a/ReservationSaga/ReserveUsername.cs +++ b/ReservationSaga/ReserveUsername.cs @@ -22,10 +22,6 @@ if (_usernameReservation.Reserve(message.Username)) { - var expireOptions = new SendOptions(); - expireOptions.DelayDeliveryWith(TimeSpan.FromSeconds(10)); - await context.Send(new ExpireReservation { Username = message.Username }, expireOptions); - await context.Publish(new UsernameReserved { Username = message.Username }); } } @@ -34,4 +30,9 @@ public class UsernameReserved : IEvent { public string Username { get; set; } +} + +public class UserRegistrationTimeout : IEvent +{ + public string Username { get; set; } } \ No newline at end of file diff --git a/ReservationSaga/ReserveUsername.cs b/ReservationSaga/ReserveUsername.cs index 77cf924..942ed00 100644 --- a/ReservationSaga/ReserveUsername.cs +++ b/ReservationSaga/ReserveUsername.cs @@ -22,10 +22,6 @@ if (_usernameReservation.Reserve(message.Username)) { - var expireOptions = new SendOptions(); - expireOptions.DelayDeliveryWith(TimeSpan.FromSeconds(10)); - await context.Send(new ExpireReservation { Username = message.Username }, expireOptions); - await context.Publish(new UsernameReserved { Username = message.Username }); } } @@ -34,4 +30,9 @@ public class UsernameReserved : IEvent { public string Username { get; set; } +} + +public class UserRegistrationTimeout : IEvent +{ + public string Username { get; set; } } \ No newline at end of file diff --git a/ReservationSaga/Subsription.cs b/ReservationSaga/Subsription.cs new file mode 100644 index 0000000..9f92e53 --- /dev/null +++ b/ReservationSaga/Subsription.cs @@ -0,0 +1,84 @@ +using NServiceBus; + +namespace ReservationSaga; + +public class SubscriptionPaid : IEvent +{ + public Guid CustomerId { get; set; } +} + +public class ReconcileUnpaidOrders : ICommand +{ + public Guid CustomerId { get; set; } +} + +public class AmountAuthorized : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class SetOrdersAsPaid : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class SubscriptionSagaState: ContainSagaData +{ + public Guid CustomerId { get; set; } +} + +public class AuthorizeAmountTimeout : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class OrderSetAsPaid : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class CompleteAuthorization : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class CancelAuthorization : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class SubscriptionSaga : + Saga, + IAmStartedByMessages, + IHandleMessages, + IHandleTimeouts, + IHandleMessages +{ + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + + } + + public Task Handle(SubscriptionPaid message, IMessageHandlerContext context) + { + Data.CustomerId = message.CustomerId; + + return context.Send(new ReconcileUnpaidOrders { CustomerId = message.CustomerId }); + } + + public async Task Handle(AmountAuthorized message, IMessageHandlerContext context) + { + await context.Send(new SetOrdersAsPaid { Orders = message.Orders }); + await RequestTimeout(context, TimeSpan.FromSeconds(10)); + } + + public Task Timeout(AuthorizeAmountTimeout state, IMessageHandlerContext context) + { + return context.Send(new CancelAuthorization { Orders = state.Orders }); + } + + public Task Handle(OrderSetAsPaid message, IMessageHandlerContext context) + { + return context.Send(new CompleteAuthorization { Orders = message.Orders }); + } +} \ No newline at end of file diff --git a/ReservationSaga/ReserveUsername.cs b/ReservationSaga/ReserveUsername.cs index 77cf924..942ed00 100644 --- a/ReservationSaga/ReserveUsername.cs +++ b/ReservationSaga/ReserveUsername.cs @@ -22,10 +22,6 @@ if (_usernameReservation.Reserve(message.Username)) { - var expireOptions = new SendOptions(); - expireOptions.DelayDeliveryWith(TimeSpan.FromSeconds(10)); - await context.Send(new ExpireReservation { Username = message.Username }, expireOptions); - await context.Publish(new UsernameReserved { Username = message.Username }); } } @@ -34,4 +30,9 @@ public class UsernameReserved : IEvent { public string Username { get; set; } +} + +public class UserRegistrationTimeout : IEvent +{ + public string Username { get; set; } } \ No newline at end of file diff --git a/ReservationSaga/Subsription.cs b/ReservationSaga/Subsription.cs new file mode 100644 index 0000000..9f92e53 --- /dev/null +++ b/ReservationSaga/Subsription.cs @@ -0,0 +1,84 @@ +using NServiceBus; + +namespace ReservationSaga; + +public class SubscriptionPaid : IEvent +{ + public Guid CustomerId { get; set; } +} + +public class ReconcileUnpaidOrders : ICommand +{ + public Guid CustomerId { get; set; } +} + +public class AmountAuthorized : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class SetOrdersAsPaid : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class SubscriptionSagaState: ContainSagaData +{ + public Guid CustomerId { get; set; } +} + +public class AuthorizeAmountTimeout : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class OrderSetAsPaid : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class CompleteAuthorization : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class CancelAuthorization : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class SubscriptionSaga : + Saga, + IAmStartedByMessages, + IHandleMessages, + IHandleTimeouts, + IHandleMessages +{ + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + + } + + public Task Handle(SubscriptionPaid message, IMessageHandlerContext context) + { + Data.CustomerId = message.CustomerId; + + return context.Send(new ReconcileUnpaidOrders { CustomerId = message.CustomerId }); + } + + public async Task Handle(AmountAuthorized message, IMessageHandlerContext context) + { + await context.Send(new SetOrdersAsPaid { Orders = message.Orders }); + await RequestTimeout(context, TimeSpan.FromSeconds(10)); + } + + public Task Timeout(AuthorizeAmountTimeout state, IMessageHandlerContext context) + { + return context.Send(new CancelAuthorization { Orders = state.Orders }); + } + + public Task Handle(OrderSetAsPaid message, IMessageHandlerContext context) + { + return context.Send(new CompleteAuthorization { Orders = message.Orders }); + } +} \ No newline at end of file diff --git a/ReservationSaga/UserRegistrationSaga.cs b/ReservationSaga/UserRegistrationSaga.cs index 31c8cd5..4c36868 100644 --- a/ReservationSaga/UserRegistrationSaga.cs +++ b/ReservationSaga/UserRegistrationSaga.cs @@ -6,7 +6,8 @@ IAmStartedByMessages, IHandleMessages, IHandleMessages, - IHandleMessages + IHandleMessages, + IHandleTimeouts { protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { @@ -24,10 +25,24 @@ public async Task Handle(UsernameReserved message, IMessageHandlerContext context) { await context.Send(new CreateUserAccount { Username = message.Username }); + + /* + var sendOptions = new SendOptions(); + sendOptions.DelayDeliveryWith(TimeSpan.FromSeconds(10)); + await context.Send(new UserRegistrationExpired { Username = message.Username }, sendOptions); + */ + + await RequestTimeout(context, TimeSpan.FromSeconds(10)); + } + + public async Task Timeout(UserRegistrationTimeout state, IMessageHandlerContext context) + { + await context.Send(new ExpireReservation { Username = state.Username }); } public async Task Handle(UserAccountCreated message, IMessageHandlerContext context) { + // For Demo purposes if (message.Username == "test" && Data.Attempts == 0) { Data.Attempts++; diff --git a/ReservationSaga/ReserveUsername.cs b/ReservationSaga/ReserveUsername.cs index 77cf924..942ed00 100644 --- a/ReservationSaga/ReserveUsername.cs +++ b/ReservationSaga/ReserveUsername.cs @@ -22,10 +22,6 @@ if (_usernameReservation.Reserve(message.Username)) { - var expireOptions = new SendOptions(); - expireOptions.DelayDeliveryWith(TimeSpan.FromSeconds(10)); - await context.Send(new ExpireReservation { Username = message.Username }, expireOptions); - await context.Publish(new UsernameReserved { Username = message.Username }); } } @@ -34,4 +30,9 @@ public class UsernameReserved : IEvent { public string Username { get; set; } +} + +public class UserRegistrationTimeout : IEvent +{ + public string Username { get; set; } } \ No newline at end of file diff --git a/ReservationSaga/Subsription.cs b/ReservationSaga/Subsription.cs new file mode 100644 index 0000000..9f92e53 --- /dev/null +++ b/ReservationSaga/Subsription.cs @@ -0,0 +1,84 @@ +using NServiceBus; + +namespace ReservationSaga; + +public class SubscriptionPaid : IEvent +{ + public Guid CustomerId { get; set; } +} + +public class ReconcileUnpaidOrders : ICommand +{ + public Guid CustomerId { get; set; } +} + +public class AmountAuthorized : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class SetOrdersAsPaid : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class SubscriptionSagaState: ContainSagaData +{ + public Guid CustomerId { get; set; } +} + +public class AuthorizeAmountTimeout : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class OrderSetAsPaid : IEvent +{ + public List Orders { get; set; } = new (); +} + +public class CompleteAuthorization : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class CancelAuthorization : ICommand +{ + public List Orders { get; set; } = new (); +} + +public class SubscriptionSaga : + Saga, + IAmStartedByMessages, + IHandleMessages, + IHandleTimeouts, + IHandleMessages +{ + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + + } + + public Task Handle(SubscriptionPaid message, IMessageHandlerContext context) + { + Data.CustomerId = message.CustomerId; + + return context.Send(new ReconcileUnpaidOrders { CustomerId = message.CustomerId }); + } + + public async Task Handle(AmountAuthorized message, IMessageHandlerContext context) + { + await context.Send(new SetOrdersAsPaid { Orders = message.Orders }); + await RequestTimeout(context, TimeSpan.FromSeconds(10)); + } + + public Task Timeout(AuthorizeAmountTimeout state, IMessageHandlerContext context) + { + return context.Send(new CancelAuthorization { Orders = state.Orders }); + } + + public Task Handle(OrderSetAsPaid message, IMessageHandlerContext context) + { + return context.Send(new CompleteAuthorization { Orders = message.Orders }); + } +} \ No newline at end of file diff --git a/ReservationSaga/UserRegistrationSaga.cs b/ReservationSaga/UserRegistrationSaga.cs index 31c8cd5..4c36868 100644 --- a/ReservationSaga/UserRegistrationSaga.cs +++ b/ReservationSaga/UserRegistrationSaga.cs @@ -6,7 +6,8 @@ IAmStartedByMessages, IHandleMessages, IHandleMessages, - IHandleMessages + IHandleMessages, + IHandleTimeouts { protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { @@ -24,10 +25,24 @@ public async Task Handle(UsernameReserved message, IMessageHandlerContext context) { await context.Send(new CreateUserAccount { Username = message.Username }); + + /* + var sendOptions = new SendOptions(); + sendOptions.DelayDeliveryWith(TimeSpan.FromSeconds(10)); + await context.Send(new UserRegistrationExpired { Username = message.Username }, sendOptions); + */ + + await RequestTimeout(context, TimeSpan.FromSeconds(10)); + } + + public async Task Timeout(UserRegistrationTimeout state, IMessageHandlerContext context) + { + await context.Send(new ExpireReservation { Username = state.Username }); } public async Task Handle(UserAccountCreated message, IMessageHandlerContext context) { + // For Demo purposes if (message.Username == "test" && Data.Attempts == 0) { Data.Attempts++; diff --git a/ReservationSaga/UserRegistrationStarted.cs b/ReservationSaga/UserRegistrationStarted.cs index 91d9803..bf6033a 100644 --- a/ReservationSaga/UserRegistrationStarted.cs +++ b/ReservationSaga/UserRegistrationStarted.cs @@ -5,4 +5,9 @@ public class UserRegistrationStarted : IEvent { public string Username { get; set; } +} + +public class UserRegistrationExpired : IEvent +{ + public string Username { get; set; } } \ No newline at end of file