From 3f379493d28b41c235ef24ece2d0d4d40921ad7b Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Tue, 25 May 2021 17:42:44 +0100 Subject: [PATCH] Further update to metadata handling --- .../Common/Extensions.cs | 41 +++++++++++++++++++ .../SafaricomPinless/SafaricomPinlessProxy.cs | 27 ++---------- .../VoucherManagementProxy.cs | 7 ++-- .../Services/TransactionDomainService.cs | 33 ++------------- 4 files changed, 51 insertions(+), 57 deletions(-) create mode 100644 TransactionProcessor.BusinessLogic/Common/Extensions.cs diff --git a/TransactionProcessor.BusinessLogic/Common/Extensions.cs b/TransactionProcessor.BusinessLogic/Common/Extensions.cs new file mode 100644 index 00000000..fb0ad2ca --- /dev/null +++ b/TransactionProcessor.BusinessLogic/Common/Extensions.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TransactionProcessor.BusinessLogic.Common +{ + using System.Diagnostics.CodeAnalysis; + + public static class Extensions + { + /// + /// Extracts the field from metadata. + /// + /// + /// Name of the field. + /// The additional transaction metadata. + /// + [ExcludeFromCodeCoverage] + public static T ExtractFieldFromMetadata(this Dictionary additionalTransactionMetadata, String fieldName) + { + // Create a case insensitive version of the dictionary + Dictionary caseInsensitiveDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + foreach (KeyValuePair keyValuePair in additionalTransactionMetadata) + { + caseInsensitiveDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + + if (caseInsensitiveDictionary.ContainsKey(fieldName)) + { + String fieldData = caseInsensitiveDictionary[fieldName]; + return (T)Convert.ChangeType(fieldData, typeof(T)); + } + else + { + return default(T); + } + } + } +} diff --git a/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs b/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs index 920ae77a..25d4fa42 100644 --- a/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs +++ b/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; + using Common; using EstateManagement.DataTransferObjects.Responses; /// @@ -74,8 +75,8 @@ public async Task ProcessSaleMessage(String accessToken, CancellationToken cancellationToken) { // Extract the required fields - String transactionAmount = this.ExtractFieldFromMetadata("Amount", additionalTransactionMetadata); - String customerMsisdn = this.ExtractFieldFromMetadata("CustomerAccountNumber", additionalTransactionMetadata); + String transactionAmount = additionalTransactionMetadata.ExtractFieldFromMetadata("Amount"); + String customerMsisdn = additionalTransactionMetadata.ExtractFieldFromMetadata("CustomerAccountNumber"); if (String.IsNullOrEmpty(transactionAmount)) { @@ -116,28 +117,6 @@ public async Task ProcessSaleMessage(String accessToken, return this.CreateFrom(responseContent); } - [ExcludeFromCodeCoverage] - private String ExtractFieldFromMetadata(String fieldName, - Dictionary additionalTransactionMetadata) - { - // Create a case insensitive version of the dictionary - Dictionary caseInsensitiveDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - foreach (KeyValuePair keyValuePair in additionalTransactionMetadata) - { - caseInsensitiveDictionary.Add(keyValuePair.Key, keyValuePair.Value); - } - - if (caseInsensitiveDictionary.ContainsKey(fieldName)) - { - return caseInsensitiveDictionary[fieldName]; - } - else - { - return String.Empty; - } - - } - /// /// Builds the request. /// diff --git a/TransactionProcessor.BusinessLogic/OperatorInterfaces/VoucherManagement/VoucherManagementProxy.cs b/TransactionProcessor.BusinessLogic/OperatorInterfaces/VoucherManagement/VoucherManagementProxy.cs index 11f1d09d..0b510923 100644 --- a/TransactionProcessor.BusinessLogic/OperatorInterfaces/VoucherManagement/VoucherManagementProxy.cs +++ b/TransactionProcessor.BusinessLogic/OperatorInterfaces/VoucherManagement/VoucherManagementProxy.cs @@ -7,6 +7,7 @@ namespace TransactionProcessor.BusinessLogic.OperatorInterfaces.VoucherManagemen using System.Security.Policy; using System.Threading; using System.Threading.Tasks; + using Common; using EstateManagement.DataTransferObjects.Responses; using global::VoucherManagement.Client; using global::VoucherManagement.DataTransferObjects; @@ -58,9 +59,9 @@ public async Task ProcessSaleMessage(String accessToken, CancellationToken cancellationToken) { // Extract the required fields - String recipientEmail = additionalTransactionMetadata.GetValueOrDefault("RecipientEmail"); - String recipientMobile = additionalTransactionMetadata.GetValueOrDefault("RecipientMobile"); - String transactionAmount = additionalTransactionMetadata.GetValueOrDefault("Amount"); + String recipientEmail = additionalTransactionMetadata.ExtractFieldFromMetadata("RecipientEmail"); + String recipientMobile = additionalTransactionMetadata.ExtractFieldFromMetadata("RecipientMobile"); + String transactionAmount = additionalTransactionMetadata.ExtractFieldFromMetadata("Amount"); // Covert the transaction amount to Decimal and remove decimal places if (Decimal.TryParse(transactionAmount, out Decimal amountAsDecimal) == false) diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs index 8734b3f8..009629d9 100644 --- a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; + using Common; using EstateManagement.Client; using EstateManagement.DataTransferObjects.Requests; using EstateManagement.DataTransferObjects.Responses; @@ -189,7 +190,7 @@ public async Task ProcessSaleTransaction(Guid tr String transactionReference = this.GenerateTransactionReference(); // Extract the transaction amount from the metadata - Decimal transactionAmount = this.ExtractFieldFromMetadata("Amount", additionalTransactionMetadata); + Decimal transactionAmount = additionalTransactionMetadata.ExtractFieldFromMetadata("Amount"); (String responseMessage, TransactionResponseCode responseCode) validationResult = await this.ValidateSaleTransaction(estateId, merchantId, deviceIdentifier, operatorIdentifier, transactionAmount, cancellationToken); @@ -395,35 +396,7 @@ public async Task ProcessReconciliatio }; } - /// - /// Extracts the field from metadata. - /// - /// - /// Name of the field. - /// The additional transaction metadata. - /// - [ExcludeFromCodeCoverage] - private T ExtractFieldFromMetadata(String fieldName, - Dictionary additionalTransactionMetadata) - { - // Create a case insensitive version of the dictionary - Dictionary caseInsensitiveDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - foreach (KeyValuePair keyValuePair in additionalTransactionMetadata) - { - caseInsensitiveDictionary.Add(keyValuePair.Key, keyValuePair.Value); - } - - if (caseInsensitiveDictionary.ContainsKey(fieldName)) - { - String fieldData = caseInsensitiveDictionary[fieldName]; - return (T)Convert.ChangeType(fieldData, typeof(T)); - } - else - { - return default(T); - } - - } + /// /// Adds the device to merchant.