diff --git a/TransactionProcessor.Aggregates/TransactionAggregate.cs b/TransactionProcessor.Aggregates/TransactionAggregate.cs index 6e78103a..9e35a3c6 100644 --- a/TransactionProcessor.Aggregates/TransactionAggregate.cs +++ b/TransactionProcessor.Aggregates/TransactionAggregate.cs @@ -501,6 +501,43 @@ public static Result StartTransaction(this TransactionAggregate aggregate, Guid merchantId, String deviceIdentifier, Decimal? transactionAmount) + { + Result result = ValidateStartTransactionArguments(transactionDateTime, + transactionNumber, + transactionType, + transactionReference, + estateId, + merchantId, + deviceIdentifier); + if (result.IsFailed) + return result; + + result = CheckCanStartTransaction(aggregate); + if (result.IsFailed) + return result; + + TransactionDomainEvents.TransactionHasStartedEvent transactionHasStartedEvent = new(aggregate.AggregateId, + estateId, + merchantId, + transactionDateTime, + transactionNumber, + transactionType.ToString(), + transactionReference, + deviceIdentifier, + transactionAmount); + + aggregate.ApplyAndAppend(transactionHasStartedEvent); + + return Result.Success(); + } + + private static Result ValidateStartTransactionArguments(DateTime transactionDateTime, + String transactionNumber, + TransactionType transactionType, + String transactionReference, + Guid estateId, + Guid merchantId, + String deviceIdentifier) { if (transactionDateTime == DateTime.MinValue) return Result.Invalid($"Transaction Date Time must not be [{DateTime.MinValue}]"); @@ -523,26 +560,16 @@ public static Result StartTransaction(this TransactionAggregate aggregate, if (String.IsNullOrEmpty(deviceIdentifier)) return Result.Invalid("Device Identifier must not be null or empty"); + return Result.Success(); + } + + private static Result CheckCanStartTransaction(TransactionAggregate aggregate) + { Result result = aggregate.CheckTransactionNotAlreadyStarted(); - if (result.IsFailed) - return result; - result = aggregate.CheckTransactionNotAlreadyCompleted(); if (result.IsFailed) return result; - TransactionDomainEvents.TransactionHasStartedEvent transactionHasStartedEvent = new(aggregate.AggregateId, - estateId, - merchantId, - transactionDateTime, - transactionNumber, - transactionType.ToString(), - transactionReference, - deviceIdentifier, - transactionAmount); - - aggregate.ApplyAndAppend(transactionHasStartedEvent); - - return Result.Success(); + return aggregate.CheckTransactionNotAlreadyCompleted(); } public static Result RecordCostPrice(this TransactionAggregate aggregate, Decimal unitCost, Decimal totalCost){ @@ -967,4 +994,4 @@ protected override Object GetMetadata() { #endregion } -} \ No newline at end of file +}