Skip to content

Commit 5470fd1

Browse files
Refactor logon transaction flow
Co-authored-by: StuartFerguson <16325469+StuartFerguson@users.noreply.github.com>
1 parent 18b8f63 commit 5470fd1

2 files changed

Lines changed: 36 additions & 24 deletions

File tree

TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public async Task TransactionDomainService_ProcessLogonTransaction_DeviceNeedsAd
102102
result.Data.MerchantId.ShouldBe(TestData.MerchantId);
103103
result.Data.ResponseCode.ShouldBe("0001");
104104
result.Data.TransactionId.ShouldBe(TestData.TransactionId);
105+
this.AggregateService.Verify(t => t.GetLatest<MerchantAggregate>(TestData.MerchantId, It.IsAny<CancellationToken>()), Times.Once);
106+
this.AggregateService.Verify(t => t.Save(It.IsAny<MerchantAggregate>(), It.IsAny<CancellationToken>()), Times.Once);
105107
}
106108

107109
[Fact]

TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -107,23 +107,9 @@ public async Task<Result<ProcessLogonTransactionResponse>> ProcessLogonTransacti
107107
return ResultHelpers.CreateFailure(stateResult);
108108

109109
Result<TransactionValidationResult> validationResult = await this.TransactionValidationService.ValidateLogonTransaction(command.EstateId, command.MerchantId, command.DeviceIdentifier, cancellationToken);
110-
111-
if (validationResult.IsSuccess && (validationResult.Data.ResponseCode == TransactionResponseCode.Success || validationResult.Data.ResponseCode == TransactionResponseCode.SuccessNeedToAddDevice)) {
112-
if (validationResult.Data.ResponseCode == TransactionResponseCode.SuccessNeedToAddDevice) {
113-
await this.AddDeviceToMerchant(command.MerchantId, command.DeviceIdentifier, cancellationToken);
114-
}
115-
116-
// Record the successful validation
117-
stateResult = transactionAggregate.AuthoriseTransactionLocally(TransactionHelpers.GenerateAuthCode(), validationResult.Data.ResponseCode, validationResult.Data.ResponseMessage);
118-
if (stateResult.IsFailed)
119-
return ResultHelpers.CreateFailure(stateResult);
120-
}
121-
else {
122-
// Record the failure
123-
stateResult = transactionAggregate.DeclineTransactionLocally(validationResult.Data.ResponseCode, validationResult.Data.ResponseMessage);
124-
if (stateResult.IsFailed)
125-
return ResultHelpers.CreateFailure(stateResult);
126-
}
110+
stateResult = await this.RecordLogonTransactionValidation(command, transactionAggregate, validationResult, cancellationToken);
111+
if (stateResult.IsFailed)
112+
return ResultHelpers.CreateFailure(stateResult);
127113

128114
stateResult = transactionAggregate.CompleteTransaction();
129115
if (stateResult.IsFailed)
@@ -136,13 +122,7 @@ public async Task<Result<ProcessLogonTransactionResponse>> ProcessLogonTransacti
136122
Result saveResult = await this.AggregateService.Save(transactionAggregate, cancellationToken);
137123
if (saveResult.IsFailed)
138124
return ResultHelpers.CreateFailure(saveResult);
139-
return Result.Success(new ProcessLogonTransactionResponse {
140-
ResponseMessage = transactionAggregate.ResponseMessage,
141-
ResponseCode = transactionAggregate.ResponseCode,
142-
EstateId = command.EstateId,
143-
MerchantId = command.MerchantId,
144-
TransactionId = command.TransactionId
145-
});
125+
return Result.Success(this.CreateLogonTransactionResponse(command, transactionAggregate));
146126
}
147127
catch (Exception ex) {
148128
return Result.Failure(ex.GetExceptionMessages());
@@ -450,6 +430,36 @@ private async Task<Result> AddDeviceToMerchant(Guid merchantId,
450430
return await this.AggregateService.Save(merchantAggregate.Data, cancellationToken);
451431
}
452432

433+
private ProcessLogonTransactionResponse CreateLogonTransactionResponse(TransactionCommands.ProcessLogonTransactionCommand command,
434+
TransactionAggregate transactionAggregate) {
435+
return new ProcessLogonTransactionResponse {
436+
ResponseMessage = transactionAggregate.ResponseMessage,
437+
ResponseCode = transactionAggregate.ResponseCode,
438+
EstateId = command.EstateId,
439+
MerchantId = command.MerchantId,
440+
TransactionId = command.TransactionId
441+
};
442+
}
443+
444+
private async Task<Result> RecordLogonTransactionValidation(TransactionCommands.ProcessLogonTransactionCommand command,
445+
TransactionAggregate transactionAggregate,
446+
Result<TransactionValidationResult> validationResult,
447+
CancellationToken cancellationToken) {
448+
if (validationResult.IsSuccess && this.IsSuccessfulLogonValidation(validationResult.Data.ResponseCode)) {
449+
if (validationResult.Data.ResponseCode == TransactionResponseCode.SuccessNeedToAddDevice) {
450+
await this.AddDeviceToMerchant(command.MerchantId, command.DeviceIdentifier, cancellationToken);
451+
}
452+
453+
return transactionAggregate.AuthoriseTransactionLocally(TransactionHelpers.GenerateAuthCode(), validationResult.Data.ResponseCode, validationResult.Data.ResponseMessage);
454+
}
455+
456+
return transactionAggregate.DeclineTransactionLocally(validationResult.Data.ResponseCode, validationResult.Data.ResponseMessage);
457+
}
458+
459+
private Boolean IsSuccessfulLogonValidation(TransactionResponseCode responseCode) {
460+
return responseCode == TransactionResponseCode.Success || responseCode == TransactionResponseCode.SuccessNeedToAddDevice;
461+
}
462+
453463

454464

455465
private async Task<Result<Merchant>> GetMerchant(Guid merchantId,

0 commit comments

Comments
 (0)