Skip to content

Commit 7966906

Browse files
Merge pull request #1596 from TransactionProcessing/copilot/fix-cyclomatic-complexity-issue
Reduce `ProcessLogonTransaction` complexity by extracting logon validation flow
2 parents 1e88b60 + 6074521 commit 7966906

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());
@@ -427,6 +407,36 @@ private async Task<Result> AddDeviceToMerchant(Guid merchantId,
427407
return await this.AggregateService.Save(merchantAggregate.Data, cancellationToken);
428408
}
429409

410+
private ProcessLogonTransactionResponse CreateLogonTransactionResponse(TransactionCommands.ProcessLogonTransactionCommand command,
411+
TransactionAggregate transactionAggregate) {
412+
return new ProcessLogonTransactionResponse {
413+
ResponseMessage = transactionAggregate.ResponseMessage,
414+
ResponseCode = transactionAggregate.ResponseCode,
415+
EstateId = command.EstateId,
416+
MerchantId = command.MerchantId,
417+
TransactionId = command.TransactionId
418+
};
419+
}
420+
421+
private async Task<Result> RecordLogonTransactionValidation(TransactionCommands.ProcessLogonTransactionCommand command,
422+
TransactionAggregate transactionAggregate,
423+
Result<TransactionValidationResult> validationResult,
424+
CancellationToken cancellationToken) {
425+
if (validationResult.IsSuccess && this.IsSuccessfulLogonValidation(validationResult.Data.ResponseCode)) {
426+
if (validationResult.Data.ResponseCode == TransactionResponseCode.SuccessNeedToAddDevice) {
427+
await this.AddDeviceToMerchant(command.MerchantId, command.DeviceIdentifier, cancellationToken);
428+
}
429+
430+
return transactionAggregate.AuthoriseTransactionLocally(TransactionHelpers.GenerateAuthCode(), validationResult.Data.ResponseCode, validationResult.Data.ResponseMessage);
431+
}
432+
433+
return transactionAggregate.DeclineTransactionLocally(validationResult.Data.ResponseCode, validationResult.Data.ResponseMessage);
434+
}
435+
436+
private Boolean IsSuccessfulLogonValidation(TransactionResponseCode responseCode) {
437+
return responseCode == TransactionResponseCode.Success || responseCode == TransactionResponseCode.SuccessNeedToAddDevice;
438+
}
439+
430440

431441

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

0 commit comments

Comments
 (0)