Skip to content

Commit

Permalink
refactor: reduce duplication in SubAccountsClient (#545)
Browse files Browse the repository at this point in the history
* Reduce duplication in SubAccountsClient

* Rename parameter
  • Loading branch information
Tr00d authored Oct 20, 2023
1 parent 972c624 commit 929b331
Showing 1 changed file with 32 additions and 21 deletions.
53 changes: 32 additions & 21 deletions Vonage/SubAccounts/SubAccountsClient.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

/// <summary>
Expand All @@ -37,21 +47,11 @@ public Task<Result<Account>> CreateSubAccountAsync(Result<CreateSubAccountReques

/// <inheritdoc />
public Task<Result<Transfer[]>> GetBalanceTransfersAsync(Result<GetTransfersRequest> request) =>
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.Map(incompleteRequest => incompleteRequest.WithEndpoint(GetTransfersRequest.BalanceTransfer))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<GetTransfersRequest, EmbeddedResponse<GetTransfersResponse>>(
completeRequest))
.Map(value => value.Content.BalanceTransfers);
this.MapTransfersAsync(request, this.balanceTransferMapping);

/// <inheritdoc />
public Task<Result<Transfer[]>> GetCreditTransfersAsync(Result<GetTransfersRequest> request) =>
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.Map(incompleteRequest => incompleteRequest.WithEndpoint(GetTransfersRequest.CreditTransfer))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<GetTransfersRequest, EmbeddedResponse<GetTransfersResponse>>(
completeRequest))
.Map(value => value.Content.CreditTransfers);
this.MapTransfersAsync(request, this.creditTransferMapping);

/// <inheritdoc />
public Task<Result<Account>> GetSubAccountAsync(Result<GetSubAccountRequest> request) =>
Expand All @@ -68,17 +68,11 @@ await this.vonageClient

/// <inheritdoc />
public Task<Result<Transfer>> TransferBalanceAsync(Result<TransferAmountRequest> request) =>
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.Map(incompleteRequest => incompleteRequest.WithEndpoint(TransferAmountRequest.BalanceTransfer))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<TransferAmountRequest, Transfer>(completeRequest));
this.MapTransfersAsync(request, this.balanceTransferMapping);

/// <inheritdoc />
public Task<Result<Transfer>> TransferCreditAsync(Result<TransferAmountRequest> request) =>
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.Map(incompleteRequest => incompleteRequest.WithEndpoint(TransferAmountRequest.CreditTransfer))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<TransferAmountRequest, Transfer>(completeRequest));
this.MapTransfersAsync(request, this.creditTransferMapping);

/// <inheritdoc />
public Task<Result<TransferNumberResponse>> TransferNumberAsync(Result<TransferNumberRequest> request) =>
Expand All @@ -92,4 +86,21 @@ public Task<Result<Account>> UpdateSubAccountAsync(Result<UpdateSubAccountReques
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<UpdateSubAccountRequest, Account>(completeRequest));

private Task<Result<Transfer[]>> MapTransfersAsync(Result<GetTransfersRequest> request, TransferMapping mapping) =>
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.Map(incompleteRequest => incompleteRequest.WithEndpoint(mapping.GetEndpointKey))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<GetTransfersRequest, EmbeddedResponse<GetTransfersResponse>>(
completeRequest))
.Map(value => mapping.GetMapping(value.Content));

private Task<Result<Transfer>> MapTransfersAsync(Result<TransferAmountRequest> request, TransferMapping mapping) =>
request.Map(incompleteRequest => incompleteRequest.WithApiKey(this.apiKey))
.Map(incompleteRequest => incompleteRequest.WithEndpoint(mapping.UpdateEndpointKey))
.BindAsync(completeRequest =>
this.vonageClient.SendWithResponseAsync<TransferAmountRequest, Transfer>(completeRequest));

private sealed record TransferMapping(string GetEndpointKey, string UpdateEndpointKey,
Func<GetTransfersResponse, Transfer[]> GetMapping);
}

0 comments on commit 929b331

Please sign in to comment.