diff --git a/TransactionProcessor.Aggregates.Tests/VoucherAggregateTests.cs b/TransactionProcessor.Aggregates.Tests/VoucherAggregateTests.cs index eeb2dc12..f9d20df4 100644 --- a/TransactionProcessor.Aggregates.Tests/VoucherAggregateTests.cs +++ b/TransactionProcessor.Aggregates.Tests/VoucherAggregateTests.cs @@ -1,4 +1,6 @@ using Shouldly; +using SimpleResults; +using TransactionProcessor.Models; using TransactionProcessor.Testing; namespace TransactionProcessor.Aggregates.Tests; @@ -17,9 +19,10 @@ public void VoucherAggregate_CanBeCreated_IsCreated() public void VoucherAggregate_Generate_VoucherIsGenerated() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - - var voucher = aggregate.GetVoucher(); + Result result = aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); + result.IsSuccess.ShouldBeTrue(); + + Voucher voucher = aggregate.GetVoucher(); voucher.IsGenerated.ShouldBeTrue(); voucher.EstateId.ShouldBe(TestData.EstateId); @@ -35,10 +38,8 @@ public void VoucherAggregate_Generate_VoucherAlreadyGenerated_ErrorThrown() Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - Should.Throw(() => - { - aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - }); + Result result = aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); + result.IsSuccess.ShouldBeTrue(); } [Fact] @@ -47,10 +48,8 @@ public void VoucherAggregate_Generate_VoucherAlreadyIssued_ErrorThrown() Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); - Should.Throw(() => - { - aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.IssuedDateTime, TestData.Value); - }); + var result = aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.IssuedDateTime, TestData.Value); + result.IsSuccess.ShouldBeTrue(); } [Fact] @@ -58,21 +57,39 @@ public void VoucherAggregate_Generate_InvalidOperatorIdentifier_ErrorIsThrown() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - Should.Throw(() => - { - aggregate.Generate(Guid.Empty, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - }); + Result result = aggregate.Generate(Guid.Empty, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } - [Fact] + [Fact] + public void VoucherAggregate_Generate_InvalidTransactionIdentifier_ErrorIsThrown() + { + Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); + + Result result = aggregate.Generate(TestData.OperatorId, TestData.EstateId, Guid.Empty, TestData.GeneratedDateTime, TestData.Value); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + + [Fact] + public void VoucherAggregate_Generate_InvalidGeneratedDateTime_ErrorIsThrown() + { + Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); + + Result result = aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, DateTime.MinValue, TestData.Value); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + + [Fact] public void VoucherAggregate_Generate_InvalidEstateId_ErrorIsThrown() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - Should.Throw(() => - { - aggregate.Generate(TestData.OperatorId, Guid.Empty, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - }); + Result result = aggregate.Generate(TestData.OperatorId, Guid.Empty, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Theory] @@ -82,10 +99,9 @@ public void VoucherAggregate_Generate_InvalidValue_ErrorIsThrown(Decimal value) { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - Should.Throw(() => - { - aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, value); - }); + Result result = aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, value); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -93,8 +109,10 @@ public void VoucherAggregate_Issue_VoucherIsIssued() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); - var voucher = aggregate.GetVoucher(); + Result result = aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); + result.IsSuccess.ShouldBeTrue(); + + Voucher voucher = aggregate.GetVoucher(); voucher.IsIssued.ShouldBeTrue(); } @@ -103,11 +121,11 @@ public void VoucherAggregate_Issue_VoucherNotGenerated_ErrorThrown() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - Should.Throw(() => - { - aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); - }); + Result result = aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } + [Fact] public void VoucherAggregate_Issue_VoucherAlreadyIssued_ErrorThrown() { @@ -115,10 +133,8 @@ public void VoucherAggregate_Issue_VoucherAlreadyIssued_ErrorThrown() aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); - Should.Throw(() => - { - aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); - }); + Result result = aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); + result.IsSuccess.ShouldBeTrue(); } [Theory] @@ -130,10 +146,9 @@ public void VoucherAggregate_Issue_EitherEmailOrMobileIsRequired_ErrorThrown(Str { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - Should.Throw(() => - { - aggregate.Issue(recipientEmail, recipientMobile, TestData.IssuedDateTime); - }); + Result result = aggregate.Issue(recipientEmail, recipientMobile, TestData.IssuedDateTime); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -141,23 +156,23 @@ public void VoucherAggregate_AddBarcode_BarcodeIsAdded() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - aggregate.AddBarcode(TestData.Barcode); - var voucher = aggregate.GetVoucher(); + Result result = aggregate.AddBarcode(TestData.Barcode); + result.IsSuccess.ShouldBeTrue(); + + Voucher voucher = aggregate.GetVoucher(); voucher.Barcode.ShouldBe(TestData.Barcode); } [Theory] [InlineData(null)] [InlineData("")] - public void VoucherAggregate_AddBarcode_InvalidBarcode_ErrorThrown(String barcode) - { + public void VoucherAggregate_AddBarcode_InvalidBarcode_ErrorThrown(String barcode) { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - Should.Throw(() => - { - aggregate.AddBarcode(barcode); - }); + Result result = aggregate.AddBarcode(barcode); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -165,10 +180,20 @@ public void VoucherAggregate_AddBarcode_VoucherNotGenerated_ErrorThrown() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - Should.Throw(() => - { - aggregate.AddBarcode(TestData.Barcode); - }); + Result result = aggregate.AddBarcode(TestData.Barcode); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } + + [Fact] + public void VoucherAggregate_AddBarcode_AlreadyIssued_ErrorThrown() { + Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); + aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); + aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); + + Result result = aggregate.AddBarcode(TestData.Barcode); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -188,22 +213,21 @@ public void VoucherAggregate_Redeem_VoucherNotGenerated_ErrorThrown() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); - Should.Throw(() => - { - aggregate.Redeem(TestData.RedeemedDateTime); - }); - } + Result result = aggregate.Redeem(TestData.RedeemedDateTime); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } [Fact] public void VoucherAggregate_Redeem_VoucherNotIssued_ErrorThrown() { Aggregates.VoucherAggregate aggregate = Aggregates.VoucherAggregate.Create(TestData.VoucherId); aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); - Should.Throw(() => - { - aggregate.Redeem(TestData.RedeemedDateTime); - }); - } + + Result result = aggregate.Redeem(TestData.RedeemedDateTime); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); + } [Fact] public void VoucherAggregate_Redeem_VoucherAlreadyRedeemed_ErrorThrown() @@ -212,9 +236,9 @@ public void VoucherAggregate_Redeem_VoucherAlreadyRedeemed_ErrorThrown() aggregate.Generate(TestData.OperatorId, TestData.EstateId, TestData.TransactionId, TestData.GeneratedDateTime, TestData.Value); aggregate.Issue(TestData.RecipientEmail, TestData.RecipientMobile, TestData.IssuedDateTime); aggregate.Redeem(TestData.RedeemedDateTime); - Should.Throw(() => - { - aggregate.Redeem(TestData.RedeemedDateTime); - }); + + Result result = aggregate.Redeem(TestData.RedeemedDateTime); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } } \ No newline at end of file diff --git a/TransactionProcessor.Aggregates/VoucherAggregate.cs b/TransactionProcessor.Aggregates/VoucherAggregate.cs index 099aec88..0055a0ed 100644 --- a/TransactionProcessor.Aggregates/VoucherAggregate.cs +++ b/TransactionProcessor.Aggregates/VoucherAggregate.cs @@ -2,37 +2,51 @@ using Shared.DomainDrivenDesign.EventSourcing; using Shared.EventStore.Aggregate; using Shared.General; +using SimpleResults; using TransactionProcessor.DomainEvents; namespace TransactionProcessor.Aggregates; public static class VoucherAggregateExtensions{ - public static void AddBarcode(this VoucherAggregate aggregate, String barcodeAsBase64) + public static Result AddBarcode(this VoucherAggregate aggregate, String barcodeAsBase64) { - Guard.ThrowIfNullOrEmpty(barcodeAsBase64, nameof(barcodeAsBase64)); + if (String.IsNullOrEmpty(barcodeAsBase64)) + return Result.Invalid("barcode must not ne empty"); - aggregate.CheckIfVoucherHasBeenGenerated(); - aggregate.CheckIfVoucherAlreadyIssued(); + Result result = aggregate.CheckIfVoucherHasBeenGenerated(); + if (result.IsFailed) + return result; + result = aggregate.CheckIfVoucherAlreadyIssued(); + if (result.IsFailed) + return result; VoucherDomainEvents.BarcodeAddedEvent barcodeAddedEvent = new VoucherDomainEvents.BarcodeAddedEvent(aggregate.AggregateId, aggregate.EstateId, barcodeAsBase64); aggregate.ApplyAndAppend(barcodeAddedEvent); + + return Result.Success(); } - public static void Generate(this VoucherAggregate aggregate, + public static Result Generate(this VoucherAggregate aggregate, Guid operatorId, Guid estateId, Guid transactionId, DateTime generatedDateTime, Decimal value) { - Guard.ThrowIfInvalidDate(generatedDateTime, nameof(generatedDateTime)); - Guard.ThrowIfInvalidGuid(operatorId, nameof(operatorId)); - Guard.ThrowIfInvalidGuid(transactionId, nameof(transactionId)); - Guard.ThrowIfInvalidGuid(estateId, nameof(estateId)); - Guard.ThrowIfNegative(value, nameof(value)); - Guard.ThrowIfZero(value, nameof(value)); - aggregate.CheckIfVoucherAlreadyGenerated(); + if (aggregate.IsGenerated) + return Result.Success(); + + if (generatedDateTime == DateTime.MinValue) + return Result.Invalid("Generated Date Time must be set"); + if (operatorId == Guid.Empty) + return Result.Invalid("Operator Id must not be an empty Guid"); + if (transactionId == Guid.Empty) + return Result.Invalid("Transaction Id must not be an empty Guid"); + if (estateId == Guid.Empty) + return Result.Invalid("Estate Id must not be an empty Guid"); + if (value <= 0) + return Result.Invalid("Value must be greater than zero"); // Do the generate process here... String voucherCode = aggregate.GenerateVoucherCode(); @@ -43,6 +57,8 @@ public static void Generate(this VoucherAggregate aggregate, new VoucherDomainEvents.VoucherGeneratedEvent(aggregate.AggregateId, estateId, transactionId, generatedDateTime, operatorId, value, voucherCode, expiryDateTime, message); aggregate.ApplyAndAppend(voucherGeneratedEvent); + + return Result.Success(); } public static TransactionProcessor.Models.Voucher GetVoucher(this VoucherAggregate aggregate) @@ -69,74 +85,76 @@ public static TransactionProcessor.Models.Voucher GetVoucher(this VoucherAggrega }; } - public static void Issue(this VoucherAggregate aggregate, + public static Result Issue(this VoucherAggregate aggregate, String recipientEmail, String recipientMobile, DateTime issuedDateTime) { - aggregate.CheckIfVoucherHasBeenGenerated(); + if (aggregate.IsIssued) + return Result.Success(); - if (string.IsNullOrEmpty(recipientEmail) && string.IsNullOrEmpty(recipientMobile)) - { - throw new ArgumentNullException(message: "Either Recipient Email Address or Recipient Mobile number must be set to issue a voucher", innerException: null); - } + Result result = aggregate.CheckIfVoucherHasBeenGenerated(); + if (result.IsFailed) + return result; - aggregate.CheckIfVoucherAlreadyIssued(); + if (String.IsNullOrEmpty(recipientEmail) && String.IsNullOrEmpty(recipientMobile)) { + return Result.Invalid("Either Recipient Email Address or Recipient Mobile number must be set to issue a voucher"); + } VoucherDomainEvents.VoucherIssuedEvent voucherIssuedEvent = new VoucherDomainEvents.VoucherIssuedEvent(aggregate.AggregateId, aggregate.EstateId, issuedDateTime, recipientEmail, recipientMobile); aggregate.ApplyAndAppend(voucherIssuedEvent); + + return Result.Success(); } - public static void Redeem(this VoucherAggregate aggregate, DateTime redeemedDateTime) + public static Result Redeem(this VoucherAggregate aggregate, DateTime redeemedDateTime) { - aggregate.CheckIfVoucherHasBeenGenerated(); - aggregate.CheckIfVoucherHasBeenIssued(); - aggregate.CheckIfVoucherAlreadyRedeemed(); - - VoucherDomainEvents.VoucherFullyRedeemedEvent voucherFullyRedeemedEvent = new VoucherDomainEvents.VoucherFullyRedeemedEvent(aggregate.AggregateId, aggregate.EstateId, redeemedDateTime); + Result result = aggregate.CheckIfVoucherHasBeenGenerated(); + if (result.IsFailed) + return result; + result = aggregate.CheckIfVoucherHasBeenIssued(); + if (result.IsFailed) + return result; + result = aggregate.CheckIfVoucherAlreadyRedeemed(); + if (result.IsFailed) + return result; + + VoucherDomainEvents.VoucherFullyRedeemedEvent voucherFullyRedeemedEvent = new(aggregate.AggregateId, aggregate.EstateId, redeemedDateTime); aggregate.ApplyAndAppend(voucherFullyRedeemedEvent); - } - private static void CheckIfVoucherAlreadyGenerated(this VoucherAggregate aggregate) - { - if (aggregate.IsGenerated) - { - throw new InvalidOperationException($"Voucher Id [{aggregate.AggregateId}] has already been generated"); - } + return Result.Success(); } - - private static void CheckIfVoucherAlreadyIssued(this VoucherAggregate aggregate) - { - if (aggregate.IsIssued) - { - throw new InvalidOperationException($"Voucher Id [{aggregate.AggregateId}] has already been issued"); + + private static Result CheckIfVoucherAlreadyIssued(this VoucherAggregate aggregate) { + if (aggregate.IsIssued) { + return Result.Invalid($"Voucher Id [{aggregate.AggregateId}] has already been issued"); } + return Result.Success(); } - - private static void CheckIfVoucherAlreadyRedeemed(this VoucherAggregate aggregate) + + private static Result CheckIfVoucherAlreadyRedeemed(this VoucherAggregate aggregate) { if (aggregate.IsRedeemed) { - throw new InvalidOperationException($"Voucher Id [{aggregate.AggregateId}] has already been redeemed"); + return Result.Invalid($"Voucher Id [{aggregate.AggregateId}] has already been redeemed"); } + return Result.Success(); } - - private static void CheckIfVoucherHasBeenGenerated(this VoucherAggregate aggregate) - { - if (aggregate.IsGenerated == false) - { - throw new InvalidOperationException($"Voucher Id [{aggregate.AggregateId}] has not been generated"); + + private static Result CheckIfVoucherHasBeenGenerated(this VoucherAggregate aggregate) { + if (aggregate.IsGenerated == false) { + return Result.Invalid($"Voucher Id [{aggregate.AggregateId}] has not been generated"); } + return Result.Success(); } - - private static void CheckIfVoucherHasBeenIssued(this VoucherAggregate aggregate) - { - if (aggregate.IsIssued == false) - { - throw new InvalidOperationException($"Voucher Id [{aggregate.AggregateId}] has not been issued"); + + private static Result CheckIfVoucherHasBeenIssued(this VoucherAggregate aggregate) { + if (aggregate.IsIssued == false) { + return Result.Invalid($"Voucher Id [{aggregate.AggregateId}] has not been issued"); } + return Result.Success(); } private static String GenerateVoucherCode(this VoucherAggregate aggregate, Int32 length = 10) diff --git a/TransactionProcessor.BusinessLogic/Services/VoucherDomainService.cs b/TransactionProcessor.BusinessLogic/Services/VoucherDomainService.cs index 3b3dcf18..93f26a95 100644 --- a/TransactionProcessor.BusinessLogic/Services/VoucherDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/VoucherDomainService.cs @@ -97,14 +97,21 @@ public async Task> IssueVoucher(Guid voucherId, Gui VoucherAggregate voucherAggregate = voucherResult.Data; - voucherAggregate.Generate(operatorId, estateId, transactionId, issuedDateTime, value); + Result stateResult = voucherAggregate.Generate(operatorId, estateId, transactionId, issuedDateTime, value); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Models.Voucher voucherModel = voucherAggregate.GetVoucher(); // Generate the barcode Barcode barcode = new Barcode(voucherModel.VoucherCode); - voucherAggregate.AddBarcode(barcode.GetBase64Image()); - voucherAggregate.Issue(recipientEmail, recipientMobile, issuedDateTime); + stateResult = voucherAggregate.AddBarcode(barcode.GetBase64Image()); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); + + stateResult = voucherAggregate.Issue(recipientEmail, recipientMobile, issuedDateTime); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Result saveResult = await this.AggregateService.Save(voucherAggregate, cancellationToken); if (saveResult.IsFailed) @@ -145,9 +152,7 @@ public async Task> RedeemVoucher(Guid estateId, Result validateResult = await this.ValidateVoucherRedemption(estateId, cancellationToken); if (validateResult.IsFailed) return ResultHelpers.CreateFailure(validateResult); - - - + Result voucherResult = await DomainServiceHelper.GetAggregateOrFailure(ct => this.AggregateService.GetLatest(voucher.VoucherId, ct), voucher.VoucherId, cancellationToken); if (voucherResult.IsFailed) return ResultHelpers.CreateFailure(voucherResult); @@ -155,7 +160,9 @@ public async Task> RedeemVoucher(Guid estateId, VoucherAggregate voucherAggregate = voucherResult.Data; // Redeem the voucher - voucherAggregate.Redeem(redeemedDateTime); + Result stateResult = voucherAggregate.Redeem(redeemedDateTime); + if (stateResult.IsFailed) + return ResultHelpers.CreateFailure(stateResult); Result saveResult = await this.AggregateService.Save(voucherAggregate, cancellationToken); if (saveResult.IsFailed) @@ -176,7 +183,6 @@ public async Task> RedeemVoucher(Guid estateId, return Result.Failure(ex.GetExceptionMessages()); } } - private async Task ValidateVoucherIssue(Guid estateId, Guid operatorId, CancellationToken cancellationToken) {