From 46e47e12bf3f9f5488e94ba1c8a8f0f92bf1402e Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 6 May 2025 15:53:47 +0100 Subject: [PATCH 1/5] Update package versions and refactor error handling This commit updates several package versions across multiple project files, including `Shared.EventStore`, `ClientProxyBase`, `Shared.DomainDrivenDesign`, `Shared.Results`, and `SecurityService.Client`. Additionally, it refactors test methods to adopt a result-based pattern for improved error handling and consistency. The `GetToken` method in `Extensions.cs` has been modified to return a `Result`, and various controller methods have been updated to utilize this new pattern. Error handling in repository methods has been enhanced, and `ModelFactory` methods now return results instead of direct objects, allowing for better validation. Overall, these changes improve maintainability and robustness across the codebase. --- .../TransactionProcessor.Aggregates.csproj | 2 +- .../Manager/VoucherManagementManagerTests.cs | 10 +- .../PataPawaPostPayProxyTests.cs | 14 +- .../SafaricomPinlessProxyTests.cs | 4 +- .../VoucherManagementProxyTests.cs | 5 +- .../Services/TransactionDomainServiceTests.cs | 30 ++- .../Common/Extensions.cs | 20 +- .../VoucherDomainEventHandler.cs | 5 +- .../Manager/TransactionProcessorManager.cs | 12 +- .../Services/ContractDomainService.cs | 13 +- .../Services/TransactionDomainService.cs | 11 +- .../TransactionProcessor.BusinessLogic.csproj | 6 +- .../TransactionProcessor.Client.csproj | 4 +- .../TransactionProcessor.Database.csproj | 4 +- .../TransactionProcessor.DomainEvents.csproj | 2 +- ...rocessor.IntegrationTesting.Helpers.csproj | 4 +- .../TransactionProcessorSteps.cs | 214 +++++++++++------- .../Common/TestingContext.cs | 6 +- ...ansactionProcessor.IntegrationTests.csproj | 4 +- .../ProjectionHandlerTests.cs | 10 +- ...ansactionProcessor.ProjectionEngine.csproj | 4 +- ...TransactionProcessorReadModelRepository.cs | 5 +- .../TransactionProcessor.Repository.csproj | 4 +- .../TransactionProcessor.Testing.csproj | 2 +- .../Factories/ModelFactoryTests.cs | 164 ++++++++------ .../TransactionProcessor.Tests.csproj | 4 +- .../Controllers/ContractController.cs | 6 +- .../Controllers/EstateController.cs | 10 +- .../Controllers/MerchantController.cs | 34 ++- .../Controllers/OperatorController.cs | 11 +- .../TransactionProcessor.csproj | 10 +- 31 files changed, 406 insertions(+), 228 deletions(-) diff --git a/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj b/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj index 32c42d8a..3470c884 100644 --- a/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj +++ b/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj @@ -8,7 +8,7 @@ - + diff --git a/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs b/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs index 63f7d1b7..792242b6 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs @@ -71,8 +71,9 @@ await context.VoucherProjectionStates.AddAsync(new VoucherProjectionState VoucherManagementManager manager = new VoucherManagementManager(dbContextFactory.Object, aggregateService.Object); - Models.Voucher voucher = await manager.GetVoucherByCode(TestData.EstateId, TestData.VoucherCode, CancellationToken.None); - + var result = await manager.GetVoucherByCode(TestData.EstateId, TestData.VoucherCode, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + Models.Voucher voucher = result.Data; voucher.ShouldNotBeNull(); } @@ -121,8 +122,9 @@ await context.VoucherProjectionStates.AddAsync(new VoucherProjectionState VoucherManagementManager manager = new VoucherManagementManager(dbContextFactory.Object, aggregateService.Object); - Models.Voucher voucher = await manager.GetVoucherByTransactionId(TestData.EstateId, TestData.TransactionId, CancellationToken.None); - + var result = await manager.GetVoucherByTransactionId(TestData.EstateId, TestData.TransactionId, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + Models.Voucher voucher = result.Data; voucher.ShouldNotBeNull(); } diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs index 48547909..a7577dc0 100644 --- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs @@ -44,8 +44,9 @@ public async Task PataPawaPostPayProxy_ProcessLogonMessage_SuccessfulResponse_Me PataPawaPostPayService.Setup(s => s.getLoginRequestAsync(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.PataPawaPostPaidSuccessfulLoginResponse); - BusinessLogic.OperatorInterfaces.OperatorResponse logonResponse = await PataPawaPostPayProxy.ProcessLogonMessage(CancellationToken.None); - + var logonResponseResult = await PataPawaPostPayProxy.ProcessLogonMessage(CancellationToken.None); + logonResponseResult.IsSuccess.ShouldBeTrue(); + BusinessLogic.OperatorInterfaces.OperatorResponse logonResponse = logonResponseResult.Data; logonResponse.ShouldNotBeNull(); logonResponse.IsSuccessful.ShouldBeTrue(); logonResponse.ResponseMessage.ShouldBe(TestData.PataPawaPostPaidSuccessfulLoginResponse.message); @@ -88,7 +89,7 @@ public async Task PataPawaPostPayProxy_ProcessSaleMessage_VerifyAccount_Successf .ReturnsAsync(TestData.PataPawaPostPaidSuccessfulVerifyAccountResponse); MemoryCache.Set("PataPawaPostPayLogon", TestData.PataPawaPostPaidSuccessfulLoginOperatorResponse); - BusinessLogic.OperatorInterfaces.OperatorResponse saleResponse = await this.PataPawaPostPayProxy.ProcessSaleMessage(TestData.TransactionId, + var processSaleMessageResult = await this.PataPawaPostPayProxy.ProcessSaleMessage(TestData.TransactionId, TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, @@ -96,6 +97,8 @@ public async Task PataPawaPostPayProxy_ProcessSaleMessage_VerifyAccount_Successf TestData.AdditionalTransactionMetaDataForPataPawaVerifyAccount(), CancellationToken.None); + processSaleMessageResult.IsSuccess.ShouldBeTrue(); + BusinessLogic.OperatorInterfaces.OperatorResponse saleResponse = processSaleMessageResult.Data; saleResponse.ShouldNotBeNull(); saleResponse.IsSuccessful.ShouldBeTrue(); saleResponse.ResponseMessage.ShouldBe("SUCCESS"); @@ -206,7 +209,7 @@ public async Task PataPawaPostPayProxy_ProcessSaleMessage_ProcessBill_Successful .ReturnsAsync(TestData.PataPawaPostPaidSuccessfulProcessBillResponse); this.MemoryCache.Set("PataPawaPostPayLogon", TestData.PataPawaPostPaidSuccessfulLoginOperatorResponse); - BusinessLogic.OperatorInterfaces.OperatorResponse saleResponse = await this.PataPawaPostPayProxy.ProcessSaleMessage( + var processSaleMessageResult = await this.PataPawaPostPayProxy.ProcessSaleMessage( TestData.TransactionId, TestData.OperatorId, TestData.Merchant, @@ -214,7 +217,8 @@ public async Task PataPawaPostPayProxy_ProcessSaleMessage_ProcessBill_Successful TestData.TransactionReference, TestData.AdditionalTransactionMetaDataForPataPawaProcessBill(), CancellationToken.None); - + processSaleMessageResult.IsSuccess.ShouldBeTrue(); + BusinessLogic.OperatorInterfaces.OperatorResponse saleResponse = processSaleMessageResult.Data; saleResponse.ShouldNotBeNull(); saleResponse.IsSuccessful.ShouldBeTrue(); saleResponse.ResponseMessage.ShouldBe(TestData.PataPawaPostPaidSuccessfulProcessBillResponse.msg); diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs index 7f121e5f..507a0bd1 100644 --- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs @@ -34,7 +34,9 @@ public async Task SafaricomPinlessProxy_ProcessLogonMessage_NullIsReturned() { HttpClient httpClient = SetupMockHttpClient(responseMessage); IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient); - OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessLogonMessage(CancellationToken.None); + var processLogonMessageResult = await safaricomPinlessproxy.ProcessLogonMessage(CancellationToken.None); + processLogonMessageResult.IsSuccess.ShouldBeTrue(); + OperatorResponse operatorResponse = processLogonMessageResult.Data; operatorResponse.ShouldBeNull(); } diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs index 4da7282a..729899b7 100644 --- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs @@ -28,8 +28,9 @@ public async Task VoucherManagementProxy_ProcessLogonMessage_NullReturned() { IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(mediator.Object); - OperatorResponse operatorResponse = await voucherManagementProxy.ProcessLogonMessage(CancellationToken.None); - + var processLogonMessageResult = await voucherManagementProxy.ProcessLogonMessage(CancellationToken.None); + processLogonMessageResult.IsSuccess.ShouldBeTrue(); + OperatorResponse operatorResponse = processLogonMessageResult.Data; operatorResponse.ShouldBeNull(); } diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs index 946988f4..b240d636 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs @@ -180,8 +180,9 @@ public async Task TransactionDomainService_ProcessReconciliationTransaction_Reco TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionDateTime, TestData.ReconciliationTransactionCount, TestData.ReconciliationTransactionValue); - ProcessReconciliationTransactionResponse response = await this.TransactionDomainService.ProcessReconciliationTransaction(command, CancellationToken.None); - ; + var result = await this.TransactionDomainService.ProcessReconciliationTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + ProcessReconciliationTransactionResponse response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); @@ -209,8 +210,9 @@ public async Task TransactionDomainService_ProcessReconciliationTransaction_Vali TestData.MerchantId, TestData.DeviceIdentifier, TestData.TransactionDateTime, TestData.ReconciliationTransactionCount, TestData.ReconciliationTransactionValue); - ProcessReconciliationTransactionResponse response = await this.TransactionDomainService.ProcessReconciliationTransaction(command, CancellationToken.None); - ; + var result = await this.TransactionDomainService.ProcessReconciliationTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); @@ -261,7 +263,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_DeclinedByOper TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(), TestData.ContractId, TestData.ProductId, TestData.TransactionSource); - ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + var result = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); @@ -302,7 +306,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_OperatorProxyT TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(), TestData.ContractId, TestData.ProductId, TestData.TransactionSource); - ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + var result = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); @@ -360,7 +366,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_TransactionIsP TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(), TestData.ContractId, TestData.ProductId, TestData.TransactionSource); - ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + var result = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); @@ -422,7 +430,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_NoFloatFound_T TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(), TestData.ContractId, TestData.ProductId, TestData.TransactionSource); - ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + var result = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); @@ -464,7 +474,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_ValidationFail TestData.CustomerEmailAddress, TestData.AdditionalTransactionMetaDataForMobileTopup(), TestData.ContractId, TestData.ProductId, TestData.TransactionSource); - ProcessSaleTransactionResponse response = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + var result = await this.TransactionDomainService.ProcessSaleTransaction(command, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var response = result.Data; response.EstateId.ShouldBe(TestData.EstateId); response.MerchantId.ShouldBe(TestData.MerchantId); diff --git a/TransactionProcessor.BusinessLogic/Common/Extensions.cs b/TransactionProcessor.BusinessLogic/Common/Extensions.cs index 1f2b033a..b8c8b526 100644 --- a/TransactionProcessor.BusinessLogic/Common/Extensions.cs +++ b/TransactionProcessor.BusinessLogic/Common/Extensions.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Shared.Results; +using SimpleResults; namespace TransactionProcessor.BusinessLogic.Common { @@ -23,7 +25,7 @@ public static Guid CalculateSettlementAggregateId(DateTime settlementDate, return aggregateId; } - public static async Task GetToken(TokenResponse currentToken, ISecurityServiceClient securityServiceClient, CancellationToken cancellationToken) + public static async Task> GetToken(TokenResponse currentToken, ISecurityServiceClient securityServiceClient, CancellationToken cancellationToken) { // Get a token to talk to the estate service String clientId = ConfigurationReader.GetValue("AppSettings", "ClientId"); @@ -33,20 +35,26 @@ public static async Task GetToken(TokenResponse currentToken, ISe if (currentToken == null) { - TokenResponse token = await securityServiceClient.GetToken(clientId, clientSecret, cancellationToken); + Result tokenResult= await securityServiceClient.GetToken(clientId, clientSecret, cancellationToken); + if (tokenResult.IsFailed) + return ResultHelpers.CreateFailure(tokenResult); + TokenResponse token =tokenResult.Data; Logger.LogDebug($"Token is {token.AccessToken}"); - return token; + return Result.Success(token); } if (currentToken.Expires.UtcDateTime.Subtract(DateTime.UtcNow) < TimeSpan.FromMinutes(2)) { Logger.LogDebug($"Token is about to expire at {currentToken.Expires.DateTime:O}"); - TokenResponse token = await securityServiceClient.GetToken(clientId, clientSecret, cancellationToken); + Result tokenResult = await securityServiceClient.GetToken(clientId, clientSecret, cancellationToken); + if (tokenResult.IsFailed) + return ResultHelpers.CreateFailure(tokenResult); + TokenResponse token = tokenResult.Data; Logger.LogDebug($"Token is {token.AccessToken}"); - return token; + return Result.Success(token); } - return currentToken; + return Result.Success(currentToken); } } diff --git a/TransactionProcessor.BusinessLogic/EventHandling/VoucherDomainEventHandler.cs b/TransactionProcessor.BusinessLogic/EventHandling/VoucherDomainEventHandler.cs index 3413433e..9de2fcb5 100644 --- a/TransactionProcessor.BusinessLogic/EventHandling/VoucherDomainEventHandler.cs +++ b/TransactionProcessor.BusinessLogic/EventHandling/VoucherDomainEventHandler.cs @@ -152,7 +152,10 @@ private async Task HandleSpecificDomainEvent(VoucherDomainEvents.Voucher return ResultHelpers.CreateFailure(voucherAggregateResult); Models.Voucher voucherModel = voucherAggregateResult.Data.GetVoucher(); - this.TokenResponse = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + Result getTokenResult = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + if (getTokenResult.IsFailed) + return ResultHelpers.CreateFailure(getTokenResult); + this.TokenResponse = getTokenResult.Data; if (string.IsNullOrEmpty(voucherModel.RecipientEmail) == false) { String message = await this.GetEmailVoucherMessage(voucherModel, cancellationToken); diff --git a/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs b/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs index 3d2546da..3a9b97ae 100644 --- a/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs +++ b/TransactionProcessor.BusinessLogic/Manager/TransactionProcessorManager.cs @@ -92,8 +92,11 @@ public async Task> GetContract(Guid estateId, { foreach (Operator @operator in estateModel.Operators) { - OperatorAggregate operatorAggregate = await this.AggregateService.GetLatest(@operator.OperatorId, cancellationToken); - @operator.Name = operatorAggregate.Name; + var getOperatorResult = await this.AggregateService.GetLatest(@operator.OperatorId, cancellationToken); + if (getOperatorResult.IsSuccess) { + OperatorAggregate operatorAggregate = getOperatorResult.Data; + @operator.Name = operatorAggregate.Name; + } } } @@ -132,7 +135,10 @@ public async Task> GetMerchant(Guid estateId, List operators = new(); foreach (Models.Merchant.Operator @operator in merchantModel.Operators) { - OperatorAggregate operatorAggregate = await this.AggregateService.GetLatest(@operator.OperatorId, cancellationToken); + var getOperatorResult = await this.AggregateService.GetLatest(@operator.OperatorId, cancellationToken); + if (getOperatorResult.IsFailed) + return ResultHelpers.CreateFailure(getOperatorResult); + OperatorAggregate operatorAggregate = getOperatorResult.Data; Models.Merchant.Operator newOperator = @operator with { Name = operatorAggregate.Name }; operators.Add(newOperator); } diff --git a/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs b/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs index 3c6f927f..b708f44b 100644 --- a/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs @@ -55,9 +55,12 @@ private async Task ApplyUpdates(Func<(EstateAggregate estateAggregate, C { try { - EstateAggregate estateAggregate = await this.AggregateService.Get(estateId, cancellationToken); + Result getResult = await this.AggregateService.Get(estateId, cancellationToken); + if (getResult.IsFailed) + return ResultHelpers.CreateFailure(getResult); + EstateAggregate estateAggregate = getResult.Data; if (estateAggregate.IsCreated == false) - return Result.Failure("Estate is noty created"); + return Result.Failure("Estate is not created"); Result getContractResult = await this.AggregateService.GetLatest(contractId, cancellationToken); Result contractAggregateResult = @@ -160,8 +163,10 @@ public async Task CreateContract(ContractCommands.CreateContractCommand String projection = $"fromCategory(\"ContractAggregate\")\n.when({{\n $init: function (s, e) {{\n return {{\n total: 0,\n contractId: 0\n }};\n }},\n 'ContractCreatedEvent': function(s,e){{\n // Check if it matches\n if (e.data.description === '{command.RequestDTO.Description}' \n && e.data.operatorId === '{command.RequestDTO.OperatorId}'){{\n s.total += 1;\n s.contractId = e.data.contractId\n }}\n }}\n}})"; - Result resultString = await this.Context.RunTransientQuery(projection, cancellationToken); - + Result result = await this.Context.RunTransientQuery(projection, cancellationToken); + if (result.IsFailed) + return ResultHelpers.CreateFailure(result); + String resultString = result.Data; if (String.IsNullOrEmpty(resultString) == false) { JObject jsonResult = JObject.Parse(resultString); diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs index 27956a21..41e345a1 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs @@ -458,8 +458,10 @@ public async Task AddSettledMerchantFee(TransactionCommands.AddSettledMe public async Task SendCustomerEmailReceipt(TransactionCommands.SendCustomerEmailReceiptCommand command, CancellationToken cancellationToken) { - this.TokenResponse = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); - + Result getTokenResult = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + if (getTokenResult.IsFailed) + return ResultHelpers.CreateFailure(getTokenResult); + this.TokenResponse = getTokenResult.Data; Result transactionAggregateResult = await this.AggregateService.GetLatest(command.TransactionId, cancellationToken); if (transactionAggregateResult.IsFailed) @@ -489,7 +491,10 @@ public async Task SendCustomerEmailReceipt(TransactionCommands.SendCusto public async Task ResendCustomerEmailReceipt(TransactionCommands.ResendCustomerEmailReceiptCommand command, CancellationToken cancellationToken) { - this.TokenResponse = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + Result getTokenResult = await Helpers.GetToken(this.TokenResponse, this.SecurityServiceClient, cancellationToken); + if (getTokenResult.IsFailed) + return ResultHelpers.CreateFailure(getTokenResult); + this.TokenResponse = getTokenResult.Data; Result transactionAggregateResult = await this.AggregateService.GetLatest(command.TransactionId, cancellationToken); diff --git a/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj b/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj index ba86b122..f4fbbb6d 100644 --- a/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj +++ b/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj @@ -6,7 +6,7 @@ - + @@ -14,8 +14,8 @@ - - + + diff --git a/TransactionProcessor.Client/TransactionProcessor.Client.csproj b/TransactionProcessor.Client/TransactionProcessor.Client.csproj index b854fdf0..cb552d55 100644 --- a/TransactionProcessor.Client/TransactionProcessor.Client.csproj +++ b/TransactionProcessor.Client/TransactionProcessor.Client.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/TransactionProcessor.Database/TransactionProcessor.Database.csproj b/TransactionProcessor.Database/TransactionProcessor.Database.csproj index 2a0c3c2e..2ff3a149 100644 --- a/TransactionProcessor.Database/TransactionProcessor.Database.csproj +++ b/TransactionProcessor.Database/TransactionProcessor.Database.csproj @@ -20,9 +20,9 @@ - + - + diff --git a/TransactionProcessor.DomainEvents/TransactionProcessor.DomainEvents.csproj b/TransactionProcessor.DomainEvents/TransactionProcessor.DomainEvents.csproj index 8816c0be..01e4cacc 100644 --- a/TransactionProcessor.DomainEvents/TransactionProcessor.DomainEvents.csproj +++ b/TransactionProcessor.DomainEvents/TransactionProcessor.DomainEvents.csproj @@ -6,6 +6,6 @@ enable - + diff --git a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj index 6bdc3eaa..d667919d 100644 --- a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj +++ b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessor.IntegrationTesting.Helpers.csproj @@ -7,10 +7,10 @@ - + - + diff --git a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs index 924d450c..fcb7bdcd 100644 --- a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs +++ b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs @@ -8,6 +8,7 @@ using TransactionProcessor.DataTransferObjects.Responses.Estate; using TransactionProcessor.DataTransferObjects.Responses.Operator; using TransactionProcessor.DataTransferObjects.Responses.Settlement; +using AssignOperatorRequest = TransactionProcessor.DataTransferObjects.Requests.Estate.AssignOperatorRequest; namespace TransactionProcessor.IntegrationTesting.Helpers; @@ -86,9 +87,9 @@ await this.TransactionProcessorClient.GetSettlement(accessToken, settlement.Data.SettlementFees.ShouldNotBeNull(); settlement.Data.SettlementFees.ShouldNotBeEmpty(); - var settlementFees = settlementFeeDetailsList.Where(s => s.EstateId == settlementFeeDetails.EstateId && - s.MerchantId == settlementFeeDetails.MerchantId && - s.SettlementId == settlementFeeDetails.SettlementId).ToList(); + List settlementFees = settlementFeeDetailsList.Where(s => s.EstateId == settlementFeeDetails.EstateId && + s.MerchantId == settlementFeeDetails.MerchantId && + s.SettlementId == settlementFeeDetails.SettlementId).ToList(); foreach (ReqnrollExtensions.SettlementFeeDetails feeDetails in settlementFees) { @@ -121,10 +122,11 @@ public async Task WhenIGetTheMerchantsForThenMerchantsWillBeReturned(String acce } await Retry.For(async () => { - List merchantList = await this.TransactionProcessorClient + Result>? getMerchantsResult = await this.TransactionProcessorClient .GetMerchants(token, estateDetails.EstateId, CancellationToken.None) .ConfigureAwait(false); - + getMerchantsResult.IsSuccess.ShouldBeTrue(); + List merchantList = getMerchantsResult.Data; merchantList.ShouldNotBeNull(); merchantList.ShouldNotBeEmpty(); merchantList.Count.ShouldBe(expectedMerchantCount); @@ -148,7 +150,7 @@ public async Task WhenIGetTheMerchantForEstateAnErrorIsReturned(String accessTok Guid merchantId = Guid.NewGuid(); - var result = await this.TransactionProcessorClient + Result? result = await this.TransactionProcessorClient .GetMerchant(token, estateDetails.EstateId, merchantId, CancellationToken.None) .ConfigureAwait(false); result.IsFailed.ShouldBeTrue(); @@ -160,16 +162,18 @@ public async Task WhenIPerformTheFollowingTransactions(String accessToken, List< List<(EstateDetails, Guid, String, SerialisedMessage)> responseMessages = new List<(EstateDetails, Guid, String, SerialisedMessage)>(); foreach ((EstateDetails, Guid, String, SerialisedMessage) serialisedMessage in serialisedMessages) { - SerialisedMessage responseSerialisedMessage = + Result? performTransactionResult = await this.TransactionProcessorClient.PerformTransaction(accessToken, serialisedMessage.Item4, CancellationToken.None); - var message = JsonConvert.SerializeObject(responseSerialisedMessage); + performTransactionResult.IsSuccess.ShouldBeTrue(); + SerialisedMessage responseSerialisedMessage = performTransactionResult.Data; + String message = JsonConvert.SerializeObject(responseSerialisedMessage); serialisedMessage.Item1.AddTransactionResponse(serialisedMessage.Item2, serialisedMessage.Item3, message); } } public async Task WhenISetTheMerchantsSettlementSchedule(String accessToken, List<(EstateDetails, Guid, SetSettlementScheduleRequest)> requests) { - foreach (var request in requests) + foreach ((EstateDetails, Guid, SetSettlementScheduleRequest) request in requests) { Should.NotThrow(async () => { await this.TransactionProcessorClient.SetMerchantSettlementSchedule(accessToken, @@ -197,10 +201,11 @@ await this.TransactionProcessorClient //this.TestingContext.Logger.LogInformation($"Device {newDeviceIdentifier} assigned to Merchant {merchantName}"); await Retry.For(async () => { - MerchantResponse? merchantResponse = await this.TransactionProcessorClient + Result? getMerchantResult = await this.TransactionProcessorClient .GetMerchant(accessToken, request.Item1.EstateId, request.Item2, CancellationToken.None) .ConfigureAwait(false); - + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse? merchantResponse = getMerchantResult.Data; merchantResponse.Devices.ContainsValue(request.Item4.NewDeviceIdentifier); }); } @@ -211,7 +216,7 @@ public async Task WhenIMakeTheFollowingMerchantDepositsTheDepositIsRejected(Stri foreach ((EstateDetails, Guid, MakeMerchantDepositRequest) makeDepositRequest in makeDepositRequests) { - var result = await this.TransactionProcessorClient.MakeMerchantDeposit(accessToken, makeDepositRequest.Item1.EstateId, + Result? result = await this.TransactionProcessorClient.MakeMerchantDeposit(accessToken, makeDepositRequest.Item1.EstateId, makeDepositRequest.Item2, makeDepositRequest.Item3, CancellationToken.None).ConfigureAwait(false); result.IsFailed.ShouldBeTrue(); @@ -235,7 +240,7 @@ public async Task WhenIMakeTheFollowingMerchantWithdrawals(String accessToken, L foreach ((EstateDetails, Guid, MakeMerchantWithdrawalRequest) makeMerchantWithdrawalRequest in requests) { - var result = await this.TransactionProcessorClient + Result? result = await this.TransactionProcessorClient .MakeMerchantWithdrawal(accessToken, makeMerchantWithdrawalRequest.Item1.EstateId, makeMerchantWithdrawalRequest.Item2, @@ -267,9 +272,11 @@ public async Task> WhenICreateTheFollowingMerchants(strin foreach ((Guid, Guid, String) m in merchants) { await Retry.For(async () => { - MerchantResponse merchant = await this.TransactionProcessorClient + Result? getMerchantResult = await this.TransactionProcessorClient .GetMerchant(accessToken, m.Item1, m.Item2, CancellationToken.None) .ConfigureAwait(false); + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse merchant = getMerchantResult.Data; responses.Add(merchant); string projectionName = "MerchantBalanceProjection"; @@ -279,14 +286,14 @@ await Retry.For(async () => { projectionName, partitionId); JsonElement x = (JsonElement)gg; - MerchantBalanceResponse response = await this.TransactionProcessorClient.GetMerchantBalance(accessToken, m.Item1, m.Item2, CancellationToken.None); - - response.ShouldNotBeNull(); + Result? getMerchantBalanceResult = await this.TransactionProcessorClient.GetMerchantBalance(accessToken, m.Item1, m.Item2, CancellationToken.None); + getMerchantBalanceResult.IsSuccess.ShouldBeTrue(); + getMerchantBalanceResult.Data.ShouldNotBeNull(); // Force a read model database hit - MerchantBalanceResponse response2 = await this.TransactionProcessorClient.GetMerchantBalance(accessToken, m.Item1, m.Item2, CancellationToken.None, liveBalance: false); - - response2.ShouldNotBeNull(); + Result? getMerchantBalanceResult2 = await this.TransactionProcessorClient.GetMerchantBalance(accessToken, m.Item1, m.Item2, CancellationToken.None, liveBalance: false); + getMerchantBalanceResult2.IsSuccess.ShouldBeTrue(); + getMerchantBalanceResult2.Data.ShouldNotBeNull(); }); } @@ -364,7 +371,7 @@ public async Task ThenTheFollowingEntriesAppearInTheMerchantsBalanceHistoryForEs List merchantEntries = balanceEntries.Where(b => b.EstateId == m.EstateId && b.MerchantId == m.MerchantId).ToList(); await Retry.For(async () => { - balanceHistory = + Result>? balanceHistoryResult = await this.TransactionProcessorClient.GetMerchantBalanceHistory(accessToken, m.EstateId, m.MerchantId, @@ -372,6 +379,8 @@ await this.TransactionProcessorClient.GetMerchantBalanceHistory(accessToken, endDate, CancellationToken.None); + balanceHistoryResult.IsSuccess.ShouldBeTrue(); + balanceHistory = balanceHistoryResult.Data; balanceHistory.ShouldNotBeNull(); balanceHistory.ShouldNotBeEmpty(); balanceHistory.Count.ShouldBe(m.NumberEntries); @@ -388,9 +397,9 @@ await this.TransactionProcessorClient.GetMerchantBalanceHistory(accessToken, balanceEntry.ShouldNotBeNull($"EntryDateTime [{merchantEntry.DateTime.ToString("yyyy-MM-dd")}] Ref [{merchantEntry.Reference}] DebitOrCredit [{merchantEntry.EntryType}] ChangeAmount [{merchantEntry.ChangeAmount}]"); } - }, - TimeSpan.FromMinutes(10), - TimeSpan.FromSeconds(30)); + }, + TimeSpan.FromMinutes(10), + TimeSpan.FromSeconds(30)); } } @@ -421,10 +430,12 @@ public async Task GetVoucherByTransactionNumber(String acces { GetVoucherResponse voucher = null; await Retry.For(async () => { - voucher = await this.TransactionProcessorClient.GetVoucherByTransactionId(accessToken, + Result? getVoucherResult = await this.TransactionProcessorClient.GetVoucherByTransactionId(accessToken, estate.EstateId, transactionResponse.TransactionId, CancellationToken.None); + getVoucherResult.IsSuccess.ShouldBeTrue(); + voucher = getVoucherResult.Data; voucher.ShouldNotBeNull(); }); return voucher; @@ -441,9 +452,11 @@ public async Task RedeemVoucher(String accessToken, EstateDetails estate, GetVou // Do the redeem await Retry.For(async () => { - RedeemVoucherResponse response = await this.TransactionProcessorClient + Result? redeemVoucherResult = await this.TransactionProcessorClient .RedeemVoucher(accessToken, redeemVoucherRequest, CancellationToken.None) .ConfigureAwait(false); + redeemVoucherResult.IsSuccess.ShouldBeTrue(); + RedeemVoucherResponse response = redeemVoucherResult.Data; response.ShouldNotBeNull(); response.RemainingBalance.ShouldBe(expectedBalance); }); @@ -458,12 +471,14 @@ await this.TransactionProcessorClient.ProcessSettlement(accessToken, CancellationToken.None); await Retry.For(async () => { - TransactionProcessor.DataTransferObjects.SettlementResponse settlement = + Result? getSettlementByDateResult = await this.TransactionProcessorClient.GetSettlementByDate(accessToken, request.SettlementDate, request.EstateDetails.EstateId, request.MerchantId, CancellationToken.None); + getSettlementByDateResult.IsSuccess.ShouldBeTrue(); + SettlementResponse settlement = getSettlementByDateResult.Data; settlement.NumberOfFeesPendingSettlement.ShouldBe(0); settlement.NumberOfFeesSettled.ShouldBe(expectedNumberFeesSettled); @@ -477,14 +492,15 @@ public async Task WhenIGetTheCompletedSettlementsTheFollowingInformationShouldBe foreach ((EstateDetails, Guid, DateTime, Int32) request in requests) { await Retry.For(async () => { - TransactionProcessor.DataTransferObjects.SettlementResponse settlements = - await this.TransactionProcessorClient.GetSettlementByDate(accessToken, + Result? getSettlementByDateResult = + await this.TransactionProcessorClient.GetSettlementByDate(accessToken, request.Item3, request.Item1.EstateId, request.Item2, CancellationToken.None); - - settlements.NumberOfFeesSettled.ShouldBe(request.Item4, $"Settlement date {request.Item3}"); + getSettlementByDateResult.IsSuccess.ShouldBeTrue(); + SettlementResponse settlement = getSettlementByDateResult.Data; + settlement.NumberOfFeesSettled.ShouldBe(request.Item4, $"Settlement date {request.Item3}"); }, TimeSpan.FromMinutes(3)); } @@ -495,14 +511,17 @@ public async Task WhenIGetThePendingSettlementsTheFollowingInformationShouldBeRe foreach ((EstateDetails, Guid, DateTime, Int32) request in requests) { await Retry.For(async () => { - TransactionProcessor.DataTransferObjects.SettlementResponse settlements = + Result? getSettlementByDateResult = await this.TransactionProcessorClient.GetSettlementByDate(accessToken, request.Item3, request.Item1.EstateId, request.Item2, CancellationToken.None); - settlements.ShouldNotBeNull(); - settlements.NumberOfFeesPendingSettlement.ShouldBe(request.Item4, $"Settlement date {request.Item3}"); + + getSettlementByDateResult.IsSuccess.ShouldBeTrue(); + SettlementResponse settlement = getSettlementByDateResult.Data; + settlement.ShouldNotBeNull(); + settlement.NumberOfFeesPendingSettlement.ShouldBe(request.Item4, $"Settlement date {request.Item3}"); }, TimeSpan.FromMinutes(3)); } @@ -524,8 +543,10 @@ public async Task> WhenICreateTheFollowingEstatesX(String a { EstateResponse estate = null; await Retry.For(async () => { - List? estates = await this.TransactionProcessorClient + Result>? getEstatesResult = await this.TransactionProcessorClient .GetEstates(accessToken, createEstateRequest.EstateId, CancellationToken.None).ConfigureAwait(false); + getEstatesResult.IsSuccess.ShouldBeTrue(); + List? estates = getEstatesResult.Data; estates.ShouldNotBeNull(); estates.Count.ShouldBe(1); estate = estates.Single(); @@ -551,10 +572,11 @@ public async Task> WhenIUpdateTheFollowingMerchants(strin foreach ((EstateDetails estate, Guid merchantId, UpdateMerchantRequest request) request in requests) { await Retry.For(async () => { - MerchantResponse merchant = await this.TransactionProcessorClient + Result? getMerchantResult = await this.TransactionProcessorClient .GetMerchant(accessToken, request.estate.EstateId, request.merchantId, CancellationToken.None) .ConfigureAwait(false); - + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse merchant = getMerchantResult.Data; merchant.MerchantName.ShouldBe(request.request.Name); merchant.SettlementSchedule.ShouldBe(request.request.SettlementSchedule); responses.Add(merchant); @@ -581,13 +603,14 @@ await this.TransactionProcessorClient.AssignOperatorToMerchant(accessToken, merchantOperators.Add((request.estate, request.merchantId, request.request.OperatorId)); } - foreach (var m in merchantOperators) + foreach ((EstateDetails estate, Guid merchantId, Guid operatorId) m in merchantOperators) { await Retry.For(async () => { - MerchantResponse merchant = await this.TransactionProcessorClient + Result? getMerchantResult = await this.TransactionProcessorClient .GetMerchant(accessToken, m.estate.EstateId, m.merchantId, CancellationToken.None) .ConfigureAwait(false); - + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse merchant = getMerchantResult.Data; if (merchant.Operators == null) { Console.WriteLine($"Merchant {merchant.MerchantName} has null operators"); @@ -626,7 +649,7 @@ await Retry.For(async () => { Result>? operators = await this.TransactionProcessorClient .GetOperators(accessToken, request.estate.EstateId, CancellationToken.None).ConfigureAwait(false); operators.IsSuccess.ShouldBeTrue(); - var @operator = operators.Data.SingleOrDefault(o => o.Name == request.request.Name); + OperatorResponse? @operator = operators.Data.SingleOrDefault(o => o.Name == request.request.Name); @operator.ShouldNotBeNull(); request.estate.AddOperator(@operator.OperatorId, request.request.Name); results.Add((request.estate.EstateId, @@ -652,13 +675,15 @@ public async Task GivenIHaveAssignedTheFollowingOperatorsToTheEstates(String acc } // verify at the read model - foreach (var request in requests) + foreach ((EstateDetails estate, AssignOperatorRequest request) request in requests) { await Retry.For(async () => { - EstateResponse e = await this.TransactionProcessorClient.GetEstate(accessToken, + Result? getEstateResult = await this.TransactionProcessorClient.GetEstate(accessToken, request.estate.EstateId, CancellationToken.None); - EstateOperatorResponse operatorResponse = e.Operators.SingleOrDefault(o => o.OperatorId == request.request.OperatorId); + getEstateResult.IsSuccess.ShouldBeTrue(); + EstateResponse e = getEstateResult.Data; + EstateOperatorResponse operatorResponse = e.Operators.SingleOrDefault(o => o.OperatorId == request.request.OperatorId); operatorResponse.ShouldNotBeNull(); results.Add((request.estate.EstateId, operatorResponse)); @@ -698,7 +723,7 @@ public async Task WhenICreateTheFollowingProducts(String accessToken, List<(Esta List<(EstateDetails, Contract, AddProductToContractRequest)> estateContractProducts = new(); foreach ((EstateDetails, Contract, AddProductToContractRequest) request in requests) { - var result = await this.TransactionProcessorClient.AddProductToContract(accessToken, + Result? result = await this.TransactionProcessorClient.AddProductToContract(accessToken, request.Item1.EstateId, request.Item2.ContractId, request.Item3, @@ -710,7 +735,9 @@ public async Task WhenICreateTheFollowingProducts(String accessToken, List<(Esta { await Retry.For(async () => { - ContractResponse contract = await this.TransactionProcessorClient.GetContract(accessToken, estateContractProduct.Item1.EstateId, estateContractProduct.Item2.ContractId, CancellationToken.None).ConfigureAwait(false); + Result? getContractResult = await this.TransactionProcessorClient.GetContract(accessToken, estateContractProduct.Item1.EstateId, estateContractProduct.Item2.ContractId, CancellationToken.None).ConfigureAwait(false); + getContractResult.IsSuccess.ShouldBeTrue(); + ContractResponse contract = getContractResult.Data; contract.ShouldNotBeNull(); ContractProduct product = contract.Products.SingleOrDefault(c => c.Name == estateContractProduct.Item3.ProductName); @@ -729,7 +756,7 @@ public async Task WhenIAddTheFollowingTransactionFees(String accessToken, List<( List<(EstateDetails, Contract, Product, AddTransactionFeeForProductToContractRequest)> estateContractProductsFees = new(); foreach ((EstateDetails, Contract, Product, AddTransactionFeeForProductToContractRequest) request in requests) { - var result = await this.TransactionProcessorClient.AddTransactionFeeForProductToContract(accessToken, + Result? result = await this.TransactionProcessorClient.AddTransactionFeeForProductToContract(accessToken, request.Item1.EstateId, request.Item2.ContractId, request.Item3.ProductId, @@ -740,13 +767,14 @@ public async Task WhenIAddTheFollowingTransactionFees(String accessToken, List<( foreach ((EstateDetails, Contract, Product, AddTransactionFeeForProductToContractRequest) estateContractProductsFee in estateContractProductsFees) { await Retry.For(async () => { - ContractResponse contract = await this.TransactionProcessorClient.GetContract(accessToken, estateContractProductsFee.Item1.EstateId, estateContractProductsFee.Item2.ContractId, CancellationToken.None).ConfigureAwait(false); + Result? getContractResult = await this.TransactionProcessorClient.GetContract(accessToken, estateContractProductsFee.Item1.EstateId, estateContractProductsFee.Item2.ContractId, CancellationToken.None).ConfigureAwait(false); + ContractResponse contract = getContractResult.Data; contract.ShouldNotBeNull(); ContractProduct product = contract.Products.SingleOrDefault(c => c.ProductId == estateContractProductsFee.Item3.ProductId); product.ShouldNotBeNull(); - var transactionFee = product.TransactionFees.SingleOrDefault(f => f.Description == estateContractProductsFee.Item4.Description); + ContractProductTransactionFee? transactionFee = product.TransactionFees.SingleOrDefault(f => f.Description == estateContractProductsFee.Item4.Description); transactionFee.ShouldNotBeNull(); estateContractProductsFee.Item3.AddTransactionFee(transactionFee.TransactionFeeId, @@ -755,13 +783,16 @@ await Retry.For(async () => { estateContractProductsFee.Item4.Description, estateContractProductsFee.Item4.Value); - List? fees = await this.TransactionProcessorClient.GetTransactionFeesForProduct(accessToken, + Result>? feesResult = await this.TransactionProcessorClient.GetTransactionFeesForProduct(accessToken, estateContractProductsFee.Item1.EstateId, estateContractProductsFee.Item1.GetMerchants().First().MerchantId, contract.ContractId, product.ProductId, CancellationToken.None); - var fee = fees.SingleOrDefault(f => f.TransactionFeeId == transactionFee.TransactionFeeId); + feesResult.IsSuccess.ShouldBeTrue(); + List? fees = feesResult.Data; + + ContractProductTransactionFee? fee = fees.SingleOrDefault(f => f.TransactionFeeId == transactionFee.TransactionFeeId); fee.ShouldNotBeNull(); }); } @@ -776,13 +807,15 @@ await Retry.For(async () => { await this.TransactionProcessorClient.AddDeviceToMerchant(accessToken, request.Item1.EstateId, request.Item2, request.Item3, CancellationToken.None).ConfigureAwait(false); } - foreach (var m in merchantDevices) + foreach ((EstateDetails estate, Guid merchantId, Guid deviceId) m in merchantDevices) { await Retry.For(async () => { - MerchantResponse merchant = await this.TransactionProcessorClient + Result? getMerchantResult = await this.TransactionProcessorClient .GetMerchant(accessToken, m.estate.EstateId, m.merchantId, CancellationToken.None) .ConfigureAwait(false); - var device = merchant.Devices.SingleOrDefault(o => o.Key == m.deviceId); + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse merchant = getMerchantResult.Data; + KeyValuePair device = merchant.Devices.SingleOrDefault(o => o.Key == m.deviceId); device.Value.ShouldNotBeNull(); result.Add((m.estate, merchant, device.Value)); }); @@ -805,7 +838,7 @@ public async Task WhenIAddTheFollowingContractsToTheFollowingMerchants(String ac public async Task GivenIMakeTheFollowingManualMerchantDeposits(String accessToken, (EstateDetails, Guid, MakeMerchantDepositRequest) request) { - var result = await this.TransactionProcessorClient.MakeMerchantDeposit(accessToken, request.Item1.EstateId, request.Item2, request.Item3, CancellationToken.None).ConfigureAwait(false); + Result? result = await this.TransactionProcessorClient.MakeMerchantDeposit(accessToken, request.Item1.EstateId, request.Item2, request.Item3, CancellationToken.None).ConfigureAwait(false); result.IsSuccess.ShouldBeTrue(); } @@ -813,7 +846,7 @@ public async Task WhenICreateTheFollowingSecurityUsers(String accessToken, List< { foreach (CreateNewUserRequest createNewUserRequest in requests) { - var estateDetails = estateDetailsList.SingleOrDefault(e => e.EstateId == createNewUserRequest.EstateId.GetValueOrDefault()); + EstateDetails? estateDetails = estateDetailsList.SingleOrDefault(e => e.EstateId == createNewUserRequest.EstateId.GetValueOrDefault()); estateDetails.ShouldNotBeNull(); @@ -879,7 +912,9 @@ public async Task WhenIGetTheEstateTheEstateDetailsAreReturnedAsFollows(String a } } - EstateResponse estate = await this.TransactionProcessorClient.GetEstate(token, estateId, CancellationToken.None).ConfigureAwait(false); + Result? getEstateResult = await this.TransactionProcessorClient.GetEstate(token, estateId, CancellationToken.None).ConfigureAwait(false); + getEstateResult.IsSuccess.ShouldBeTrue(); + EstateResponse estate = getEstateResult.Data; estate.EstateName.ShouldBe(expectedEstateDetails.Single()); } @@ -890,8 +925,9 @@ public async Task WhenIGetAllTheOperatorsTheFollowingDetailsAreReturned(String a foreach (Guid estateId in distinctEstates) { await Retry.For(async () => { - List? operatorList = await this.TransactionProcessorClient.GetOperators(accessToken, estateId, CancellationToken.None); - + Result>? getOperatorsResult = await this.TransactionProcessorClient.GetOperators(accessToken, estateId, CancellationToken.None); + getOperatorsResult.IsSuccess.ShouldBeTrue(); + List? operatorList = getOperatorsResult.Data; foreach (OperatorResponse operatorResponse in operatorList) { OperatorResponse? expectedOperator = expectedOperatorResponses.SingleOrDefault(s => s.Item3.OperatorId == operatorResponse.OperatorId).Item3; @@ -922,7 +958,7 @@ public async Task WhenIGetTheEstateTheEstateOperatorDetailsAreReturnedAsFollows( Result>? getEstatesResult = await this.TransactionProcessorClient.GetEstates(token, estateId, CancellationToken.None).ConfigureAwait(false); getEstatesResult.IsSuccess.ShouldBeTrue(); getEstatesResult.Data.ShouldNotBeEmpty(); - var estate = getEstatesResult.Data.Single(); + EstateResponse estate = getEstatesResult.Data.Single(); foreach (String expectedOperator in expectedOperators) { EstateOperatorResponse? op = estate.Operators.SingleOrDefault(o => o.Name == expectedOperator); @@ -946,11 +982,13 @@ public async Task WhenIGetTheEstateTheEstateSecurityUserDetailsAreReturnedAsFoll } } - EstateResponse? estate = await this.TransactionProcessorClient.GetEstate(token, estateId, CancellationToken.None).ConfigureAwait(false); + Result? getEstateResult = await this.TransactionProcessorClient.GetEstate(token, estateId, CancellationToken.None).ConfigureAwait(false); + getEstateResult.IsSuccess.ShouldBeTrue(); + EstateResponse? estate = getEstateResult.Data; estate.ShouldNotBeNull(); foreach (String expectedSecurityUser in expectedSecurityUsers) { - var user = estate.SecurityUsers.SingleOrDefault(o => o.EmailAddress == expectedSecurityUser); + SecurityUserResponse? user = estate.SecurityUsers.SingleOrDefault(o => o.EmailAddress == expectedSecurityUser); user.ShouldNotBeNull(); } } @@ -958,7 +996,7 @@ public async Task WhenIGetTheEstateTheEstateSecurityUserDetailsAreReturnedAsFoll public async Task WhenIGetTheEstateAnErrorIsReturned(String accessToken, String estateName, List estateDetailsList) { Guid estateId = Guid.NewGuid(); - var result = await this.TransactionProcessorClient.GetEstate(accessToken, estateId, CancellationToken.None).ConfigureAwait(false); + Result? result = await this.TransactionProcessorClient.GetEstate(accessToken, estateId, CancellationToken.None).ConfigureAwait(false); result.IsSuccess.ShouldBeFalse(); result.Status.ShouldBe(ResultStatus.NotFound); } @@ -972,7 +1010,9 @@ public async Task WhenIRemoveTheOperatorFromEstateTheOperatorIsRemoved(String ac await this.TransactionProcessorClient.RemoveOperatorFromEstate(accessToken, estateDetails.EstateId, operatorId, CancellationToken.None); await Retry.For(async () => { - EstateResponse? estateResponse = await this.TransactionProcessorClient.GetEstate(accessToken, estateDetails.EstateId, CancellationToken.None); + Result? getEstateResult = await this.TransactionProcessorClient.GetEstate(accessToken, estateDetails.EstateId, CancellationToken.None); + getEstateResult.IsSuccess.ShouldBeTrue(); + EstateResponse? estateResponse = getEstateResult.Data; estateResponse.ShouldNotBeNull(); EstateOperatorResponse? operatorResponse = estateResponse.Operators.SingleOrDefault(c => c.OperatorId == operatorId); @@ -993,10 +1033,12 @@ public async Task> WhenIUpdateTheOperatorsWithTheFollowin foreach ((EstateDetails estate, Guid operatorId, UpdateOperatorRequest request) request in requests) { await Retry.For(async () => { - OperatorResponse? operatorResponse = await this.TransactionProcessorClient + Result? getOperatorResult = await this.TransactionProcessorClient .GetOperator(accessToken, request.estate.EstateId, request.operatorId, CancellationToken.None) .ConfigureAwait(false); + getOperatorResult.IsSuccess.ShouldBeTrue(); + OperatorResponse? operatorResponse = getOperatorResult.Data; operatorResponse.Name.ShouldBe(request.request.Name); operatorResponse.RequireCustomTerminalNumber.ShouldBe(request.request.RequireCustomTerminalNumber.Value); operatorResponse.RequireCustomMerchantNumber.ShouldBe(request.request.RequireCustomMerchantNumber.Value); @@ -1026,9 +1068,10 @@ public async Task ThenIGetTheContractsForTheFollowingContractDetailsAreReturned( } await Retry.For(async () => { - List contracts = + Result>? getContractsResult = await this.TransactionProcessorClient.GetContracts(token, estateDetails.EstateId, CancellationToken.None); - + getContractsResult.IsSuccess.ShouldBeTrue(); + List? contracts = getContractsResult.Data; contracts.ShouldNotBeNull(); contracts.ShouldHaveSingleItem(); ContractResponse contract = contracts.Single(); @@ -1060,14 +1103,16 @@ public async Task ThenIGetTheMerchantContractsForForTheFollowingContractDetailsA Guid merchantId = estateDetails.GetMerchant(merchantName).MerchantId; await Retry.For(async () => { - List contracts = + Result>? getContractsResult = await this.TransactionProcessorClient.GetMerchantContracts(token, estateDetails.EstateId, merchantId, CancellationToken.None); - + getContractsResult.IsSuccess.ShouldBeTrue(); + + List contracts = getContractsResult.Data; contracts.ShouldNotBeNull(); contracts.ShouldHaveSingleItem(); ContractResponse contractResponse = contracts.Single(); - foreach (var contract in contractDetails) + foreach ((String, String) contract in contractDetails) { contractResponse.Description.ShouldBe(contract.Item1); contractResponse.Products.Any(p => p.Name == contract.Item2).ShouldBeTrue(); @@ -1096,17 +1141,21 @@ public async Task ThenIGetTheTransactionFeesForOnTheContractForTheFollowingFeesA Product product = contract.GetProduct(productName); await Retry.For(async () => { - List transactionFeesResults = + Result>? transactionFeesResult = await this.TransactionProcessorClient.GetTransactionFeesForProduct(token, estateDetails.EstateId, Guid.Empty, contract.ContractId, product.ProductId, CancellationToken.None); + + transactionFeesResult.IsSuccess.ShouldBeTrue(); + List transactionFeesList = transactionFeesResult.Data; + foreach ((CalculationType, String, Decimal?, FeeType) transactionFee in transactionFees) { - Boolean feeFound = transactionFeesResults.Any(f => f.CalculationType == transactionFee.Item1 && f.Description == transactionFee.Item2 && - f.Value == transactionFee.Item3 && f.FeeType == transactionFee.Item4); + Boolean feeFound = transactionFeesList.Any(f => f.CalculationType == transactionFee.Item1 && f.Description == transactionFee.Item2 && + f.Value == transactionFee.Item3 && f.FeeType == transactionFee.Item4); feeFound.ShouldBeTrue(); } @@ -1115,9 +1164,9 @@ await this.TransactionProcessorClient.GetTransactionFeesForProduct(token, public async Task WhenICreateAnotherContractWithTheSameValuesItShouldBeRejected(string accessToken, List<(EstateDetails, CreateContractRequest)> requests) { - var createContractRequest = requests.Single(); + (EstateDetails, CreateContractRequest) createContractRequest = requests.Single(); - var result = await this.TransactionProcessorClient.CreateContract(accessToken, createContractRequest.Item1.EstateId, + Result? result = await this.TransactionProcessorClient.CreateContract(accessToken, createContractRequest.Item1.EstateId, createContractRequest.Item2, CancellationToken.None); result.IsFailed.ShouldBeTrue(); @@ -1135,7 +1184,8 @@ public async Task WhenIUpdateTheMerchantsAddressWithTheFollowingDetails(String a foreach ((EstateDetails, MerchantResponse, Guid, Address) addressVerify in addressUpdatesList) { await Retry.For(async () => { - MerchantResponse? merchant = await this.TransactionProcessorClient.GetMerchant(accessToken, addressVerify.Item1.EstateId, addressVerify.Item2.MerchantId, CancellationToken.None); + Result? getMerchantResult = await this.TransactionProcessorClient.GetMerchant(accessToken, addressVerify.Item1.EstateId, addressVerify.Item2.MerchantId, CancellationToken.None); + MerchantResponse? merchant = getMerchantResult.Data; merchant.ShouldNotBeNull(); AddressResponse? address = merchant.Addresses.First(); @@ -1161,7 +1211,9 @@ public async Task WhenIUpdateTheMerchantsContactWithTheFollowingDetails(String a foreach ((EstateDetails, MerchantResponse, Guid, Contact) contactVerify in contactUpdatesList) { await Retry.For(async () => { - MerchantResponse? merchant = await this.TransactionProcessorClient.GetMerchant(accessToken, contactVerify.Item1.EstateId, contactVerify.Item2.MerchantId, CancellationToken.None); + var getMerchantResult = await this.TransactionProcessorClient.GetMerchant(accessToken, contactVerify.Item1.EstateId, contactVerify.Item2.MerchantId, CancellationToken.None); + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse? merchant = getMerchantResult.Data; merchant.ShouldNotBeNull(); ContactResponse? contact = merchant.Contacts.First(); @@ -1186,7 +1238,9 @@ public async Task WhenIRemoveTheContractFromMerchantOnTheContractIsRemoved(Strin await this.TransactionProcessorClient.RemoveContractFromMerchant(accessToken, estateDetails.EstateId, merchant.MerchantId, estateContract.ContractId, CancellationToken.None); await Retry.For(async () => { - MerchantResponse? merchantResponse = await this.TransactionProcessorClient.GetMerchant(accessToken, estateDetails.EstateId, merchant.MerchantId, CancellationToken.None); + Result? getMerchantResult = await this.TransactionProcessorClient.GetMerchant(accessToken, estateDetails.EstateId, merchant.MerchantId, CancellationToken.None); + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse? merchantResponse = getMerchantResult.Data; merchantResponse.ShouldNotBeNull(); MerchantContractResponse? contractResponse = merchantResponse.Contracts.SingleOrDefault(c => c.ContractId == estateContract.ContractId); @@ -1205,7 +1259,9 @@ public async Task WhenIRemoveTheOperatorFromMerchantOnTheOperatorIsRemoved(Strin await this.TransactionProcessorClient.RemoveOperatorFromMerchant(accessToken, estateDetails.EstateId, merchant.MerchantId, operatorId, CancellationToken.None); await Retry.For(async () => { - MerchantResponse? merchantResponse = await this.TransactionProcessorClient.GetMerchant(accessToken, estateDetails.EstateId, merchant.MerchantId, CancellationToken.None); + var getMerchantResult = await this.TransactionProcessorClient.GetMerchant(accessToken, estateDetails.EstateId, merchant.MerchantId, CancellationToken.None); + getMerchantResult.IsSuccess.ShouldBeTrue(); + MerchantResponse? merchantResponse = getMerchantResult.Data; merchantResponse.ShouldNotBeNull(); MerchantOperatorResponse? operatorResponse = merchantResponse.Operators.SingleOrDefault(c => c.OperatorId == operatorId); diff --git a/TransactionProcessor.IntegrationTests/Common/TestingContext.cs b/TransactionProcessor.IntegrationTests/Common/TestingContext.cs index 75c1163c..00f488f6 100644 --- a/TransactionProcessor.IntegrationTests/Common/TestingContext.cs +++ b/TransactionProcessor.IntegrationTests/Common/TestingContext.cs @@ -204,12 +204,14 @@ public async Task GetVoucherByTransactionNumber(String estat GetVoucherResponse voucher = null; await Retry.For(async () => { - voucher = await this.DockerHelper.TransactionProcessorClient.GetVoucherByTransactionId(this.AccessToken, + var getVoucherByTransactionIdResult = await this.DockerHelper.TransactionProcessorClient.GetVoucherByTransactionId(this.AccessToken, estate.EstateId, transactionResponse.TransactionId, CancellationToken.None); + getVoucherByTransactionIdResult.IsSuccess.ShouldBeTrue(); + voucher = getVoucherByTransactionIdResult.Data; - }); + }); return voucher; } } diff --git a/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj b/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj index 7179f21e..a8ff1b62 100644 --- a/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj +++ b/TransactionProcessor.IntegrationTests/TransactionProcessor.IntegrationTests.csproj @@ -7,7 +7,7 @@ - + @@ -17,7 +17,7 @@ - + diff --git a/TransactionProcessor.ProjectionEngine.Tests/ProjectionHandlerTests.cs b/TransactionProcessor.ProjectionEngine.Tests/ProjectionHandlerTests.cs index 76c0b89f..3971f62c 100644 --- a/TransactionProcessor.ProjectionEngine.Tests/ProjectionHandlerTests.cs +++ b/TransactionProcessor.ProjectionEngine.Tests/ProjectionHandlerTests.cs @@ -61,7 +61,7 @@ public async Task ProjectionHandler_Handle_StateNotFoundInRepository_EventHandle projection.Setup(p => p.ShouldIHandleEvent(It.IsAny())).Returns(true); projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(Result.Success(state)); + .ReturnsAsync(state); repo.Setup(r => r.Load(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(state)); var result = await ph.Handle(TestData.MerchantCreatedEvent, CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -99,7 +99,7 @@ public async Task ProjectionHandler_Handle_StateFoundInRepository_ChangesMade_Ev MerchantBalanceState newState = new MerchantBalanceState(); newState = newState.HandleMerchantCreated(TestData.MerchantCreatedEvent); projection.Setup(p => p.ShouldIHandleEvent(It.IsAny())).Returns(true); - projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(newState)); + projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(newState); repo.Setup(r => r.Load(It.IsAny(), It.IsAny())).ReturnsAsync(state); repo.Setup(r => r.Save(It.IsAny(),It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(state)); @@ -121,7 +121,7 @@ public async Task ProjectionHandler_Handle_LoadFails_FailedResult() MerchantBalanceState newState = new MerchantBalanceState(); newState = newState.HandleMerchantCreated(TestData.MerchantCreatedEvent); projection.Setup(p => p.ShouldIHandleEvent(It.IsAny())).Returns(true); - projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(newState)); + projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(newState); repo.Setup(r => r.Load(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure()); //repo.Setup(r => r.Save(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(state)); @@ -143,7 +143,7 @@ public async Task ProjectionHandler_Handle_SaveFails_FailedResult() MerchantBalanceState newState = new MerchantBalanceState(); newState = newState.HandleMerchantCreated(TestData.MerchantCreatedEvent); projection.Setup(p => p.ShouldIHandleEvent(It.IsAny())).Returns(true); - projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(newState)); + projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(newState); repo.Setup(r => r.Load(It.IsAny(), It.IsAny())).ReturnsAsync(state); repo.Setup(r => r.Save(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Failure()); @@ -165,7 +165,7 @@ public async Task ProjectionHandler_Handle_DispatchFails_FailedResult() MerchantBalanceState newState = new MerchantBalanceState(); newState = newState.HandleMerchantCreated(TestData.MerchantCreatedEvent); projection.Setup(p => p.ShouldIHandleEvent(It.IsAny())).Returns(true); - projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(newState)); + projection.Setup(p => p.Handle(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(newState); repo.Setup(r => r.Load(It.IsAny(), It.IsAny())).ReturnsAsync(state); repo.Setup(r => r.Save(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(state)); diff --git a/TransactionProcessor.ProjectionEngine/TransactionProcessor.ProjectionEngine.csproj b/TransactionProcessor.ProjectionEngine/TransactionProcessor.ProjectionEngine.csproj index aef62ae9..8c951d09 100644 --- a/TransactionProcessor.ProjectionEngine/TransactionProcessor.ProjectionEngine.csproj +++ b/TransactionProcessor.ProjectionEngine/TransactionProcessor.ProjectionEngine.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs index e9563f07..48545b6e 100644 --- a/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs +++ b/TransactionProcessor.Repository/ITransactionProcessorReadModelRepository.cs @@ -1171,7 +1171,10 @@ public async Task DisableContractProductTransactionFee(ContractDomainEve CancellationToken cancellationToken) { EstateManagementGenericContext context = await this.GetContextFromDomainEvent(domainEvent, cancellationToken); - ContractProductTransactionFee transactionFee = await context.LoadContractProductTransactionFee(domainEvent, cancellationToken); + Result loadContractProductTransactionFeeResult = await context.LoadContractProductTransactionFee(domainEvent, cancellationToken); + // TODO: Check the result value + + ContractProductTransactionFee transactionFee = loadContractProductTransactionFeeResult.Data; transactionFee.IsEnabled = false; diff --git a/TransactionProcessor.Repository/TransactionProcessor.Repository.csproj b/TransactionProcessor.Repository/TransactionProcessor.Repository.csproj index cfe63118..e895454a 100644 --- a/TransactionProcessor.Repository/TransactionProcessor.Repository.csproj +++ b/TransactionProcessor.Repository/TransactionProcessor.Repository.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj b/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj index 67faa2ad..b76a945f 100644 --- a/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj +++ b/TransactionProcessor.Testing/TransactionProcessor.Testing.csproj @@ -6,7 +6,7 @@ - + diff --git a/TransactionProcessor.Tests/Factories/ModelFactoryTests.cs b/TransactionProcessor.Tests/Factories/ModelFactoryTests.cs index 1385e2e6..c3fb6adc 100644 --- a/TransactionProcessor.Tests/Factories/ModelFactoryTests.cs +++ b/TransactionProcessor.Tests/Factories/ModelFactoryTests.cs @@ -11,6 +11,7 @@ using TransactionProcessor.Models.Estate; using TransactionProcessor.Models.Merchant; using Contract = TransactionProcessor.Models.Contract.Contract; +using ContractProductTransactionFee = TransactionProcessor.DataTransferObjects.Responses.Contract.ContractProductTransactionFee; using ProductType = TransactionProcessor.DataTransferObjects.Responses.Contract.ProductType; namespace TransactionProcessor.Tests.Factories @@ -31,8 +32,9 @@ public void ModelFactory_Contract_ContractOnly_IsConverted() { Contract contractModel = TestData.ContractModel; - ContractResponse contractResponse = ModelFactory.ConvertFrom(contractModel); - + Result result= ModelFactory.ConvertFrom(contractModel); + result.IsSuccess.ShouldBeTrue(); + ContractResponse contractResponse= result.Data; contractResponse.ShouldNotBeNull(); contractResponse.OperatorId.ShouldBe(contractModel.OperatorId); contractResponse.OperatorName.ShouldBe(contractModel.OperatorName); @@ -46,8 +48,9 @@ public void ModelFactory_Contract_ContractWithProducts_IsConverted() { Contract contractModel = TestData.ContractModelWithProducts; - ContractResponse contractResponse = ModelFactory.ConvertFrom(contractModel); - + Result result = ModelFactory.ConvertFrom(contractModel); + result.IsSuccess.ShouldBeTrue(); + ContractResponse contractResponse = result.Data; contractResponse.ShouldNotBeNull(); contractResponse.OperatorId.ShouldBe(contractModel.OperatorId); contractResponse.ContractId.ShouldBe(contractModel.ContractId); @@ -94,8 +97,9 @@ public void ModelFactory_MerchantList_IsConverted() TestData.MerchantModelWithAddressesContactsDevicesAndOperatorsAndContracts() }; - List merchantResponseList = ModelFactory.ConvertFrom(merchantModelList); - + Result> merchantResponseListResult = ModelFactory.ConvertFrom(merchantModelList); + merchantResponseListResult.IsSuccess.ShouldBeTrue(); + List merchantResponseList = merchantResponseListResult.Data; merchantResponseList.ShouldNotBeNull(); merchantResponseList.ShouldNotBeEmpty(); merchantResponseList.Count.ShouldBe(merchantModelList.Count); @@ -105,8 +109,9 @@ public void ModelFactory_MerchantList_IsConverted() public void ModelFactory_MerchantList_NullList_IsConverted() { List merchantModelList = null; - List merchantResponseList = ModelFactory.ConvertFrom(merchantModelList); - + Result> merchantResponseListResult = ModelFactory.ConvertFrom(merchantModelList); + merchantResponseListResult.IsSuccess.ShouldBeTrue(); + List merchantResponseList = merchantResponseListResult.Data; merchantResponseList.ShouldNotBeNull(); merchantResponseList.ShouldBeEmpty(); } @@ -118,7 +123,7 @@ public void ModelFactory_MerchantList_NullModelInList_IsConverted() null }; - var result = ModelFactory.ConvertFrom(merchantModelList); + Result> result = ModelFactory.ConvertFrom(merchantModelList); result.IsFailed.ShouldBeTrue(); } @@ -127,7 +132,9 @@ public void ModelFactory_Contract_ContractWithProductsAndFees_IsConverted() { Contract contractModel = TestData.ContractModelWithProductsAndTransactionFees; - ContractResponse contractResponse = ModelFactory.ConvertFrom(contractModel); + Result result = ModelFactory.ConvertFrom(contractModel); + result.IsSuccess.ShouldBeTrue(); + ContractResponse contractResponse = result.Data; contractResponse.ShouldNotBeNull(); contractResponse.OperatorId.ShouldBe(contractModel.OperatorId); @@ -189,8 +196,9 @@ public void ModelFactory_ProcessLogonTransactionResponseModel_IsConverted() { ProcessLogonTransactionResponse processLogonTransactionResponseModel = TestData.ProcessLogonTransactionResponseModel; - SerialisedMessage logonTransactionResponse = ModelFactory.ConvertFrom(processLogonTransactionResponseModel); - + Result logonTransactionResult = ModelFactory.ConvertFrom(processLogonTransactionResponseModel); + logonTransactionResult.IsSuccess.ShouldBeTrue(); + SerialisedMessage logonTransactionResponse = logonTransactionResult.Data; logonTransactionResponse.ShouldNotBeNull(); logonTransactionResponse.Metadata.ShouldContainKey(MetadataContants.KeyNameEstateId); logonTransactionResponse.Metadata.ShouldContainKey(MetadataContants.KeyNameMerchantId); @@ -205,9 +213,9 @@ public void ModelFactory_ProcessLogonTransactionResponseModel_NullInput_IsConver { ProcessLogonTransactionResponse processLogonTransactionResponseModel = null; - SerialisedMessage logonTransactionResponse = ModelFactory.ConvertFrom(processLogonTransactionResponseModel); - - logonTransactionResponse.ShouldBeNull(); + Result logonTransactionResult = ModelFactory.ConvertFrom(processLogonTransactionResponseModel); + logonTransactionResult.IsFailed.ShouldBeTrue(); + logonTransactionResult.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -215,7 +223,9 @@ public void ModelFactory_ProcessSaleTransactionResponseModel_IsConverted() { ProcessSaleTransactionResponse processSaleTransactionResponseModel = TestData.ProcessSaleTransactionResponseModel; - SerialisedMessage saleTransactionResponse = ModelFactory.ConvertFrom(processSaleTransactionResponseModel); + Result saleTransactionResult = ModelFactory.ConvertFrom(processSaleTransactionResponseModel); + saleTransactionResult.IsSuccess.ShouldBeTrue(); + SerialisedMessage saleTransactionResponse = saleTransactionResult.Data; saleTransactionResponse.ShouldNotBeNull(); saleTransactionResponse.Metadata.ShouldContainKey(MetadataContants.KeyNameEstateId); @@ -231,9 +241,9 @@ public void ModelFactory_ProcessSaleTransactionResponseModel_NullInput_IsConvert { ProcessSaleTransactionResponse processSaleTransactionResponseModel = null; - SerialisedMessage saleTransactionResponse = ModelFactory.ConvertFrom(processSaleTransactionResponseModel); - - saleTransactionResponse.ShouldBeNull(); + Result saleTransactionResult = ModelFactory.ConvertFrom(processSaleTransactionResponseModel); + saleTransactionResult.IsFailed.ShouldBeTrue(); + saleTransactionResult.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -241,7 +251,9 @@ public void ModelFactory_ProcessReconciliationTransactionResponse_IsConverted() { ProcessReconciliationTransactionResponse processReconciliationTransactionResponseModel = TestData.ProcessReconciliationTransactionResponseModel; - SerialisedMessage processReconciliationTransactionResponse = ModelFactory.ConvertFrom(processReconciliationTransactionResponseModel); + Result reconciliationTransactionResult = ModelFactory.ConvertFrom(processReconciliationTransactionResponseModel); + reconciliationTransactionResult.IsSuccess.ShouldBeTrue(); + SerialisedMessage processReconciliationTransactionResponse = reconciliationTransactionResult.Data; processReconciliationTransactionResponse.ShouldNotBeNull(); processReconciliationTransactionResponse.Metadata.ShouldContainKey(MetadataContants.KeyNameEstateId); @@ -256,10 +268,10 @@ public void ModelFactory_ProcessReconciliationTransactionResponse_IsConverted() public void ModelFactory_ProcessReconciliationTransactionResponse_NullInput_IsConverted() { ProcessReconciliationTransactionResponse processReconciliationTransactionResponseModel = null; - - SerialisedMessage processReconciliationTransactionResponse = ModelFactory.ConvertFrom(processReconciliationTransactionResponseModel); - processReconciliationTransactionResponse.ShouldBeNull(); + Result reconciliationTransactionResult = ModelFactory.ConvertFrom(processReconciliationTransactionResponseModel); + reconciliationTransactionResult.IsFailed.ShouldBeTrue(); + reconciliationTransactionResult.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -289,7 +301,9 @@ public void ModelFactory_ConvertFrom_VoucherModel_IsConverted() { Voucher model = TestData.GetVoucherAggregateWithRecipientMobile().GetVoucher(); - GetVoucherResponse dto = ModelFactory.ConvertFrom(model); + Result result = ModelFactory.ConvertFrom(model); + result.IsSuccess.ShouldBeTrue(); + GetVoucherResponse dto =result.Data; dto.ShouldNotBeNull(); dto.TransactionId.ShouldBe(model.TransactionId); dto.IssuedDateTime.ShouldBe(model.IssuedDateTime); @@ -310,17 +324,19 @@ public void ModelFactory_ConvertFrom_VoucherModel_IsConverted() public void ModelFactory_ConvertFrom_VoucherModel_NullInput_IsConverted() { Voucher model = null; - GetVoucherResponse dto = ModelFactory.ConvertFrom(model); + Result result = ModelFactory.ConvertFrom(model); - dto.ShouldBeNull(); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void ModelFactory_ConvertFrom_RedeemVoucherResponse_IsConverted() { RedeemVoucherResponse model = TestData.RedeemVoucherResponse; - DataTransferObjects.RedeemVoucherResponse dto = ModelFactory.ConvertFrom(model); - + Result result = ModelFactory.ConvertFrom(model); + result.IsSuccess.ShouldBeTrue(); + DataTransferObjects.RedeemVoucherResponse dto = result.Data; dto.ShouldNotBeNull(); dto.ExpiryDate.ShouldBe(model.ExpiryDate); dto.VoucherCode.ShouldBe(model.VoucherCode); @@ -331,16 +347,17 @@ public void ModelFactory_ConvertFrom_RedeemVoucherResponse_IsConverted() public void ModelFactory_ConvertFrom_RedeemVoucherResponse_NullInput_IsConverted() { RedeemVoucherResponse model = null; - DataTransferObjects.RedeemVoucherResponse dto = ModelFactory.ConvertFrom(model); - - dto.ShouldBeNull(); + Result result = ModelFactory.ConvertFrom(model); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] public void ModelFactory_ConvertFrom_Operator_ModelConverted() { - OperatorResponse operatorResponse = ModelFactory.ConvertFrom(TestData.OperatorModel); - + Result result = ModelFactory.ConvertFrom(TestData.OperatorModel); + result.IsSuccess.ShouldBeTrue(); + OperatorResponse operatorResponse = result.Data; operatorResponse.ShouldNotBeNull(); operatorResponse.OperatorId.ShouldBe(TestData.OperatorId); operatorResponse.RequireCustomTerminalNumber.ShouldBe(TestData.RequireCustomTerminalNumber); @@ -353,9 +370,9 @@ public void ModelFactory_ConvertFrom_OperatorModelIsNull_ModelConverted() { TransactionProcessor.Models.Operator.Operator operatorModel = null; - OperatorResponse operatorResponse = ModelFactory.ConvertFrom(operatorModel); - - operatorResponse.ShouldBeNull(); + Result operatorResponseResult = ModelFactory.ConvertFrom(operatorModel); + operatorResponseResult.IsFailed.ShouldBeTrue(); + operatorResponseResult.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -365,7 +382,9 @@ public void ModelFactory_ConvertFrom_OperatorList_ModelConverted() TestData.OperatorModel }; - List operatorResponses = ModelFactory.ConvertFrom(operatorList); + Result> operatorResponseResult = ModelFactory.ConvertFrom(operatorList); + operatorResponseResult.IsSuccess.ShouldBeTrue(); + List operatorResponses = operatorResponseResult.Data; operatorResponses.ShouldNotBeNull(); operatorResponses.ShouldNotBeEmpty(); operatorResponses.Count.ShouldBe(operatorList.Count); @@ -385,8 +404,9 @@ public void ModelFactory_ConvertFrom_NullOperatorList_ModelConverted() { List operatorList = null; - List operatorResponses = ModelFactory.ConvertFrom(operatorList); - operatorResponses.ShouldBeEmpty(); + Result> operatorResponseResult = ModelFactory.ConvertFrom(operatorList); + operatorResponseResult.IsSuccess.ShouldBeTrue(); + operatorResponseResult.Data.ShouldBeEmpty(); } @@ -395,8 +415,9 @@ public void ModelFactory_ConvertFrom_EmptyOperatorList_ModelConverted() { List operatorList = new List(); - List operatorResponses = ModelFactory.ConvertFrom(operatorList); - operatorResponses.ShouldBeEmpty(); + Result> operatorResponseResult = ModelFactory.ConvertFrom(operatorList); + operatorResponseResult.IsSuccess.ShouldBeTrue(); + operatorResponseResult.Data.ShouldBeEmpty(); } @@ -407,7 +428,7 @@ public void ModelFactory_ConvertFrom_NullModelInList_ModelConverted() null }; - var result = ModelFactory.ConvertFrom(operatorList); + Result> result = ModelFactory.ConvertFrom(operatorList); result.IsFailed.ShouldBeTrue(); } @@ -417,9 +438,10 @@ public void ModelFactory_Estate_NullInput_IsConverted() { Estate estateModel = null; - EstateResponse estateResponse = ModelFactory.ConvertFrom(estateModel); + Result estateResponseResult = ModelFactory.ConvertFrom(estateModel); - estateResponse.ShouldBeNull(); + estateResponseResult.IsFailed.ShouldBeTrue(); + estateResponseResult.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -427,8 +449,9 @@ public void ModelFactory_Estate_WithNoOperatorsOrSecurityUsers_IsConverted() { Estate estateModel = TestData.EstateModel; - EstateResponse estateResponse = ModelFactory.ConvertFrom(estateModel); - + Result result = ModelFactory.ConvertFrom(estateModel); + result.IsSuccess.ShouldBeTrue(); + EstateResponse estateResponse= result.Data; estateResponse.ShouldNotBeNull(); estateResponse.EstateId.ShouldBe(estateModel.EstateId); estateResponse.EstateName.ShouldBe(estateModel.Name); @@ -439,8 +462,9 @@ public void ModelFactory_Estate_WithOperators_IsConverted() { Estate estateModel = TestData.EstateModelWithOperators; - EstateResponse estateResponse = ModelFactory.ConvertFrom(estateModel); - + Result result = ModelFactory.ConvertFrom(estateModel); + result.IsSuccess.ShouldBeTrue(); + EstateResponse estateResponse = result.Data; estateResponse.ShouldNotBeNull(); estateResponse.EstateId.ShouldBe(estateModel.EstateId); estateResponse.EstateName.ShouldBe(estateModel.Name); @@ -454,8 +478,9 @@ public void ModelFactory_Estate_WithSecurityUsers_IsConverted() { Estate estateModel = TestData.EstateModelWithSecurityUsers; - EstateResponse estateResponse = ModelFactory.ConvertFrom(estateModel); - + Result result = ModelFactory.ConvertFrom(estateModel); + result.IsSuccess.ShouldBeTrue(); + EstateResponse estateResponse = result.Data; estateResponse.ShouldNotBeNull(); estateResponse.EstateId.ShouldBe(estateModel.EstateId); estateResponse.EstateName.ShouldBe(estateModel.Name); @@ -469,8 +494,9 @@ public void ModelFactory_Estate_WithOperatorsAndSecurityUsers_IsConverted() { Estate estateModel = TestData.EstateModelWithOperatorsAndSecurityUsers; - EstateResponse estateResponse = ModelFactory.ConvertFrom(estateModel); - + Result result = ModelFactory.ConvertFrom(estateModel); + result.IsSuccess.ShouldBeTrue(); + EstateResponse estateResponse = result.Data; estateResponse.ShouldNotBeNull(); estateResponse.EstateId.ShouldBe(estateModel.EstateId); estateResponse.EstateName.ShouldBe(estateModel.Name); @@ -489,8 +515,9 @@ public void ModelFactory_Merchant_IsConverted(Models.Merchant.SettlementSchedule { Merchant merchantModel = TestData.MerchantModelWithAddressesContactsDevicesAndOperatorsAndContracts(settlementSchedule); - MerchantResponse merchantResponse = ModelFactory.ConvertFrom(merchantModel); - + Result result = ModelFactory.ConvertFrom(merchantModel); + result.IsSuccess.ShouldBeTrue(); + MerchantResponse merchantResponse = result.Data; merchantResponse.ShouldNotBeNull(); merchantResponse.MerchantId.ShouldBe(merchantModel.MerchantId); merchantResponse.MerchantName.ShouldBe(merchantModel.MerchantName); @@ -520,9 +547,9 @@ public void ModelFactory_Merchant_NullInput_IsConverted() { Merchant merchantModel = null; - MerchantResponse merchantResponse = ModelFactory.ConvertFrom(merchantModel); - - merchantResponse.ShouldBeNull(); + Result result = ModelFactory.ConvertFrom(merchantModel); + result.IsFailed.ShouldBeTrue(); + result.Status.ShouldBe(ResultStatus.Invalid); } [Fact] @@ -530,7 +557,9 @@ public void ModelFactory_Merchant_NullAddresses_IsConverted() { Merchant merchantModel = TestData.MerchantModelWithNullAddresses; - MerchantResponse merchantResponse = ModelFactory.ConvertFrom(merchantModel); + Result result = ModelFactory.ConvertFrom(merchantModel); + result.IsSuccess.ShouldBeTrue(); + MerchantResponse merchantResponse = result.Data; merchantResponse.ShouldNotBeNull(); merchantResponse.MerchantId.ShouldBe(merchantModel.MerchantId); @@ -563,7 +592,9 @@ public void ModelFactory_Merchant_NullContacts_IsConverted() { Merchant merchantModel = TestData.MerchantModelWithNullContacts; - MerchantResponse merchantResponse = ModelFactory.ConvertFrom(merchantModel); + Result result = ModelFactory.ConvertFrom(merchantModel); + result.IsSuccess.ShouldBeTrue(); + MerchantResponse merchantResponse = result.Data; merchantResponse.ShouldNotBeNull(); merchantResponse.MerchantId.ShouldBe(merchantModel.MerchantId); @@ -601,7 +632,9 @@ public void ModelFactory_Merchant_NullDevices_IsConverted() { Merchant merchantModel = TestData.MerchantModelWithNullDevices; - MerchantResponse merchantResponse = ModelFactory.ConvertFrom(merchantModel); + Result result = ModelFactory.ConvertFrom(merchantModel); + result.IsSuccess.ShouldBeTrue(); + MerchantResponse merchantResponse = result.Data; merchantResponse.ShouldNotBeNull(); merchantResponse.MerchantId.ShouldBe(merchantModel.MerchantId); @@ -641,7 +674,9 @@ public void ModelFactory_Merchant_NullOperators_IsConverted() { Merchant merchantModel = TestData.MerchantModelWithNullOperators; - MerchantResponse merchantResponse = ModelFactory.ConvertFrom(merchantModel); + Result result = ModelFactory.ConvertFrom(merchantModel); + result.IsSuccess.ShouldBeTrue(); + MerchantResponse merchantResponse = result.Data; merchantResponse.ShouldNotBeNull(); merchantResponse.MerchantId.ShouldBe(merchantModel.MerchantId); @@ -667,7 +702,7 @@ public void ModelFactory_Merchant_NullOperators_IsConverted() contactResponse.ContactPhoneNumber.ShouldBe(merchantModel.Contacts.Single().ContactPhoneNumber); merchantResponse.Devices.ShouldHaveSingleItem(); - var device = merchantResponse.Devices.Single(); + KeyValuePair device = merchantResponse.Devices.Single(); device.Key.ShouldBe(merchantModel.Devices.Single().DeviceId); device.Value.ShouldBe(merchantModel.Devices.Single().DeviceIdentifier); @@ -679,8 +714,9 @@ public void ModelFactory_TransactionFeeList_IsConverted() { List transactionFeeModelList = TestData.ProductTransactionFees; - List transactionFeeResponseList = ModelFactory.ConvertFrom(transactionFeeModelList); - + Result> result = ModelFactory.ConvertFrom(transactionFeeModelList); + result.IsSuccess.ShouldBeTrue(); + List transactionFeeResponseList = result.Data; transactionFeeResponseList.ShouldNotBeNull(); transactionFeeResponseList.ShouldNotBeEmpty(); transactionFeeResponseList.Count.ShouldBe(transactionFeeModelList.Count); diff --git a/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj b/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj index c8cab36a..7b453c05 100644 --- a/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj +++ b/TransactionProcessor.Tests/TransactionProcessor.Tests.csproj @@ -7,7 +7,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/TransactionProcessor/Controllers/ContractController.cs b/TransactionProcessor/Controllers/ContractController.cs index 2dd3d842..f1b11356 100644 --- a/TransactionProcessor/Controllers/ContractController.cs +++ b/TransactionProcessor/Controllers/ContractController.cs @@ -50,8 +50,10 @@ internal ClaimsPrincipal GetUser() { private Result StandardSecurityChecks(Guid estateId) { // Get the Estate Id claim from the user - Claim estateIdClaim = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); - + Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); + if (estateIdClaimResult.IsFailed) + return Result.Forbidden("User estate id claim is not valid"); + Claim estateIdClaim = estateIdClaimResult.Data; string estateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); if (ClaimsHelper.IsUserRolesValid(GetUser(), new[] { string.IsNullOrEmpty(estateRoleName) ? "Estate" : estateRoleName }) == false) { return Result.Forbidden("User role is not valid"); diff --git a/TransactionProcessor/Controllers/EstateController.cs b/TransactionProcessor/Controllers/EstateController.cs index 6176c9bc..8e2881ad 100644 --- a/TransactionProcessor/Controllers/EstateController.cs +++ b/TransactionProcessor/Controllers/EstateController.cs @@ -99,7 +99,10 @@ public async Task GetEstate([FromRoute] Guid estateId, CancellationToken cancellationToken) { // Get the Estate Id claim from the user - Claim estateIdClaim = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); + Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); + if (estateIdClaimResult.IsFailed) + return Result.Forbidden("User estate id claim is not valid").ToActionResultX(); + Claim estateIdClaim = estateIdClaimResult.Data; string estateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); if (ClaimsHelper.IsUserRolesValid(GetUser(), new[] { string.IsNullOrEmpty(estateRoleName) ? "Estate" : estateRoleName }) == false) @@ -129,7 +132,10 @@ public async Task GetEstates([FromRoute] Guid estateId, CancellationToken cancellationToken) { // Get the Estate Id claim from the user - Claim estateIdClaim = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); + Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); + if (estateIdClaimResult.IsFailed) + return Result.Forbidden("User estate id claim is not valid").ToActionResultX(); + Claim estateIdClaim = estateIdClaimResult.Data; string estateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); if (ClaimsHelper.IsUserRolesValid(GetUser(), new[] { string.IsNullOrEmpty(estateRoleName) ? "Estate" : estateRoleName }) == false) diff --git a/TransactionProcessor/Controllers/MerchantController.cs b/TransactionProcessor/Controllers/MerchantController.cs index 955c3cc9..e2ce2583 100644 --- a/TransactionProcessor/Controllers/MerchantController.cs +++ b/TransactionProcessor/Controllers/MerchantController.cs @@ -7,6 +7,7 @@ using TransactionProcessor.DataTransferObjects.Requests.Merchant; using TransactionProcessor.DataTransferObjects.Responses.Merchant; using TransactionProcessor.Factories; +using TransactionProcessor.Models.Contract; namespace TransactionProcessor.Controllers; @@ -74,14 +75,23 @@ private Result PerformSecurityChecks(Guid estateId,Guid merchantId) { { // Estate user // Get the Estate Id claim from the user - estateIdClaim = ClaimsHelper.GetUserClaim(this.User, "EstateId"); + Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId"); + if (estateIdClaimResult.IsFailed) + return Result.Forbidden("User estate id claim is not valid"); + estateIdClaim = estateIdClaimResult.Data; } if (this.User.IsInRole(merchantRoleName)) { // Get the merchant Id claim from the user - estateIdClaim = ClaimsHelper.GetUserClaim(this.User, "EstateId"); - merchantIdClaim = ClaimsHelper.GetUserClaim(this.User, "MerchantId"); + Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId"); + if (estateIdClaimResult.IsFailed) + return Result.Forbidden("User estate id claim is not valid"); + estateIdClaim = estateIdClaimResult.Data; + Result merchantIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "MerchantId"); + if (estateIdClaimResult.IsFailed) + return Result.Forbidden("User merchant id claim is not valid"); + merchantIdClaim = merchantIdClaimResult.Data; } if (ClaimsHelper.ValidateRouteParameter(estateId, estateIdClaim) == false) { @@ -224,7 +234,11 @@ internal ClaimsPrincipal GetUser() private bool PerformStandardChecks(Guid estateId) { // Get the Estate Id claim from the user - Claim estateIdClaim = ClaimsHelper.GetUserClaim(GetUser(), "EstateId", estateId.ToString()); + Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId",estateId.ToString()); + if (estateIdClaimResult.IsFailed) + //return Result.Forbidden("User estate id claim is not valid"); + return false; // TODO: Shoudl this be a result? + Claim estateIdClaim = estateIdClaimResult.Data; string estateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); if (ClaimsHelper.IsUserRolesValid(GetUser(), new[] { string.IsNullOrEmpty(estateRoleName) ? "Estate" : estateRoleName }) == false) @@ -486,8 +500,10 @@ private bool PerformMerchantUserChecks(Guid estateId, Guid merchantId) return false; } - Claim merchantIdClaim = ClaimsHelper.GetUserClaim(GetUser(), "MerchantId"); - + Result getMerchantIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "MerchantId"); + if (getMerchantIdClaimResult.IsFailed) + return false; // TODO: Shoudl this be a result? + Claim merchantIdClaim = getMerchantIdClaimResult.Data; if (ClaimsHelper.ValidateRouteParameter(merchantId, merchantIdClaim) == false) { return false; @@ -654,8 +670,10 @@ public async Task GetTransactionFeesForProduct([FromRoute] Guid e MerchantQueries.GetTransactionFeesForProductQuery query = new(estateId, merchantId, contractId, productId); - List transactionFees = await Mediator.Send(query, cancellationToken); - + Result> transactionFeesResult = await Mediator.Send(query, cancellationToken); + if (transactionFeesResult.IsFailed) + return transactionFeesResult.ToActionResultX(); + List transactionFees = transactionFeesResult.Data; return ModelFactory.ConvertFrom(transactionFees).ToActionResultX(); } diff --git a/TransactionProcessor/Controllers/OperatorController.cs b/TransactionProcessor/Controllers/OperatorController.cs index 65c70777..e40f50b7 100644 --- a/TransactionProcessor/Controllers/OperatorController.cs +++ b/TransactionProcessor/Controllers/OperatorController.cs @@ -15,6 +15,7 @@ using TransactionProcessor.BusinessLogic.Requests; using TransactionProcessor.DataTransferObjects.Requests.Operator; using TransactionProcessor.Factories; +using TransactionProcessor.Models.Operator; namespace TransactionProcessor.Controllers; @@ -98,8 +99,11 @@ public async Task GetOperator([FromRoute] Guid estateId, OperatorQueries.GetOperatorQuery query = new(estateId, operatorId); // Route the command - Models.Operator.Operator @operator = await Mediator.Send(query, cancellationToken); + Result getOperatorResult = await Mediator.Send(query, cancellationToken); + if (getOperatorResult.IsFailed) + return getOperatorResult.ToActionResultX(); + Models.Operator.Operator @operator = getOperatorResult.Data; return ModelFactory.ConvertFrom(@operator).ToActionResultX(); } @@ -112,8 +116,11 @@ public async Task GetOperators([FromRoute] Guid estateId, OperatorQueries.GetOperatorsQuery query = new(estateId); // Route the command - List @operatorList = await Mediator.Send(query, cancellationToken); + Result> getOperatorResult = await Mediator.Send(query, cancellationToken); + if (getOperatorResult.IsFailed) + return getOperatorResult.ToActionResultX(); + List @operatorList = getOperatorResult.Data; return ModelFactory.ConvertFrom(@operatorList).ToActionResultX(); } diff --git a/TransactionProcessor/TransactionProcessor.csproj b/TransactionProcessor/TransactionProcessor.csproj index 23d5e93e..cd2042e5 100644 --- a/TransactionProcessor/TransactionProcessor.csproj +++ b/TransactionProcessor/TransactionProcessor.csproj @@ -10,7 +10,7 @@ - + @@ -34,11 +34,11 @@ - - - + + + - + From b8044f23420a0a6513bf5e0a09da73ef995895a9 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 6 May 2025 16:50:50 +0100 Subject: [PATCH 2/5] code review fixes --- .../TransactionProcessorSteps.cs | 2 ++ TransactionProcessor/Controllers/MerchantController.cs | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs index fcb7bdcd..38694169 100644 --- a/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs +++ b/TransactionProcessor.IntegrationTesting.Helpers/TransactionProcessorSteps.cs @@ -728,6 +728,7 @@ public async Task WhenICreateTheFollowingProducts(String accessToken, List<(Esta request.Item2.ContractId, request.Item3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); estateContractProducts.Add((request.Item1, request.Item2, request.Item3)); } @@ -762,6 +763,7 @@ public async Task WhenIAddTheFollowingTransactionFees(String accessToken, List<( request.Item3.ProductId, request.Item4, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); } foreach ((EstateDetails, Contract, Product, AddTransactionFeeForProductToContractRequest) estateContractProductsFee in estateContractProductsFees) diff --git a/TransactionProcessor/Controllers/MerchantController.cs b/TransactionProcessor/Controllers/MerchantController.cs index e2ce2583..dfe26db2 100644 --- a/TransactionProcessor/Controllers/MerchantController.cs +++ b/TransactionProcessor/Controllers/MerchantController.cs @@ -236,7 +236,6 @@ private bool PerformStandardChecks(Guid estateId) // Get the Estate Id claim from the user Result estateIdClaimResult = ClaimsHelper.GetUserClaim(GetUser(), "EstateId",estateId.ToString()); if (estateIdClaimResult.IsFailed) - //return Result.Forbidden("User estate id claim is not valid"); return false; // TODO: Shoudl this be a result? Claim estateIdClaim = estateIdClaimResult.Data; From 78dc8321b80c5631c6e2511dfc6a420de6005295 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 6 May 2025 19:21:26 +0100 Subject: [PATCH 3/5] update for getting token --- TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs index e330ca8d..55d1d64e 100644 --- a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs +++ b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs @@ -424,7 +424,11 @@ public async Task GivenIHaveATokenToAccessTheEstateManagementResource(DataTable String clientId = ReqnrollTableHelper.GetStringRowValue(firstRow, "ClientId"); ClientDetails clientDetails = this.TestingContext.GetClientDetails(clientId); - this.TestingContext.AccessToken = await this.SecurityServiceSteps.GetClientToken(clientDetails.ClientId, clientDetails.ClientSecret, CancellationToken.None); + //this.TestingContext.AccessToken = await this.SecurityServiceSteps.GetClientToken(clientDetails.ClientId, clientDetails.ClientSecret, CancellationToken.None); + var token = await this.TestingContext.DockerHelper.SecurityServiceClient.GetToken(clientDetails.ClientId, clientDetails.ClientSecret, CancellationToken.None); + token.IsSuccess.ShouldBeTrue(); + this.TestingContext.AccessToken = token.Data.AccessToken; + } [When(@"I create the following security users")] From 8367dec6c8eb78c806a8bb70630a15f601bb0ab8 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 6 May 2025 19:46:23 +0100 Subject: [PATCH 4/5] more failed test fixes --- .../Shared/SharedSteps.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs index 55d1d64e..6c6938f0 100644 --- a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs +++ b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using SecurityService.DataTransferObjects.Responses; +using SimpleResults; using TransactionProcessor.DataTransferObjects.Requests.Contract; using TransactionProcessor.DataTransferObjects.Requests.Merchant; using TransactionProcessor.DataTransferObjects.Requests.Operator; @@ -480,10 +482,13 @@ public async Task GivenIAmLoggedInAsWithPasswordForEstate(String username, EstateDetails estateDetails = this.TestingContext.GetEstateDetails(estateName); ClientDetails clientDetails = this.TestingContext.GetClientDetails(clientId); - String tokenResponse = await this.SecurityServiceSteps - .GetPasswordToken(clientId, clientDetails.ClientSecret, username, password, CancellationToken.None).ConfigureAwait(false); - - estateDetails.SetEstateUserToken(tokenResponse); + //String tokenResponse = await this.SecurityServiceSteps + // .GetPasswordToken(clientId, clientDetails.ClientSecret, username, password, CancellationToken.None).ConfigureAwait(false); + Result token = await this.TestingContext.DockerHelper.SecurityServiceClient.GetToken(clientId, clientDetails.ClientSecret, + username,password, CancellationToken.None); + token.IsSuccess.ShouldBeTrue(); + this.TestingContext.AccessToken = token.Data.AccessToken; + estateDetails.SetEstateUserToken(token.Data.AccessToken); } [When("I remove the operator {string} from estate {string} the operator is removed")] From c002913fe04169d9868542040b1d00efc48c7dcf Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 6 May 2025 19:59:21 +0100 Subject: [PATCH 5/5] :| --- TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs index 6c6938f0..8d654026 100644 --- a/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs +++ b/TransactionProcessor.IntegrationTests/Shared/SharedSteps.cs @@ -484,8 +484,8 @@ public async Task GivenIAmLoggedInAsWithPasswordForEstate(String username, //String tokenResponse = await this.SecurityServiceSteps // .GetPasswordToken(clientId, clientDetails.ClientSecret, username, password, CancellationToken.None).ConfigureAwait(false); - Result token = await this.TestingContext.DockerHelper.SecurityServiceClient.GetToken(clientId, clientDetails.ClientSecret, - username,password, CancellationToken.None); + Result token = await this.TestingContext.DockerHelper.SecurityServiceClient.GetToken(username, password, clientId, clientDetails.ClientSecret, + CancellationToken.None); token.IsSuccess.ShouldBeTrue(); this.TestingContext.AccessToken = token.Data.AccessToken; estateDetails.SetEstateUserToken(token.Data.AccessToken);