diff --git a/Vonage/SubAccounts/SubAccountsClient.cs b/Vonage/SubAccounts/SubAccountsClient.cs index 0aab06125..4df4db30a 100644 --- a/Vonage/SubAccounts/SubAccountsClient.cs +++ b/Vonage/SubAccounts/SubAccountsClient.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Vonage.Common; using Vonage.Common.Client; using Vonage.Common.Monads; @@ -16,6 +17,15 @@ namespace Vonage.SubAccounts; public class SubAccountsClient : ISubAccountsClient { private readonly string apiKey; + + private readonly TransferMapping balanceTransferMapping = + new(GetTransfersRequest.BalanceTransfer, TransferAmountRequest.BalanceTransfer, + response => response.BalanceTransfers); + + private readonly TransferMapping creditTransferMapping = + new(GetTransfersRequest.CreditTransfer, TransferAmountRequest.CreditTransfer, + response => response.CreditTransfers); + private readonly VonageHttpClient vonageClient; /// @@ -37,21 +47,11 @@ public Task> CreateSubAccountAsync(Result public Task> GetBalanceTransfersAsync(Result request) => - request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey)) - .Map(incompleteRequest => incompleteRequest.WithEndpoint(GetTransfersRequest.BalanceTransfer)) - .BindAsync(completeRequest => - this.vonageClient.SendWithResponseAsync>( - completeRequest)) - .Map(value => value.Content.BalanceTransfers); + this.MapTransfersAsync(request, this.balanceTransferMapping); /// public Task> GetCreditTransfersAsync(Result request) => - request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey)) - .Map(incompleteRequest => incompleteRequest.WithEndpoint(GetTransfersRequest.CreditTransfer)) - .BindAsync(completeRequest => - this.vonageClient.SendWithResponseAsync>( - completeRequest)) - .Map(value => value.Content.CreditTransfers); + this.MapTransfersAsync(request, this.creditTransferMapping); /// public Task> GetSubAccountAsync(Result request) => @@ -68,17 +68,11 @@ await this.vonageClient /// public Task> TransferBalanceAsync(Result request) => - request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey)) - .Map(incompleteRequest => incompleteRequest.WithEndpoint(TransferAmountRequest.BalanceTransfer)) - .BindAsync(completeRequest => - this.vonageClient.SendWithResponseAsync(completeRequest)); + this.MapTransfersAsync(request, this.balanceTransferMapping); /// public Task> TransferCreditAsync(Result request) => - request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey)) - .Map(incompleteRequest => incompleteRequest.WithEndpoint(TransferAmountRequest.CreditTransfer)) - .BindAsync(completeRequest => - this.vonageClient.SendWithResponseAsync(completeRequest)); + this.MapTransfersAsync(request, this.creditTransferMapping); /// public Task> TransferNumberAsync(Result request) => @@ -92,4 +86,21 @@ public Task> UpdateSubAccountAsync(Result incompleteRequest.WithApiKey(this.apiKey)) .BindAsync(completeRequest => this.vonageClient.SendWithResponseAsync(completeRequest)); + + private Task> MapTransfersAsync(Result request, TransferMapping mapping) => + request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey)) + .Map(incompleteRequest => incompleteRequest.WithEndpoint(mapping.GetEndpointKey)) + .BindAsync(completeRequest => + this.vonageClient.SendWithResponseAsync>( + completeRequest)) + .Map(value => mapping.GetMapping(value.Content)); + + private Task> MapTransfersAsync(Result request, TransferMapping mapping) => + request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey)) + .Map(incompleteRequest => incompleteRequest.WithEndpoint(mapping.UpdateEndpointKey)) + .BindAsync(completeRequest => + this.vonageClient.SendWithResponseAsync(completeRequest)); + + private sealed record TransferMapping(string GetEndpointKey, string UpdateEndpointKey, + Func GetMapping); } \ No newline at end of file