fix: Simplify GetPaginated in NordigenHttpClient

This commit is contained in:
Valters Melnalksnis
2022-06-24 16:28:40 +03:00
parent d754156f97
commit 25951fd00b
6 changed files with 27 additions and 30 deletions
@@ -27,7 +27,7 @@ public sealed class AccountClient : IAccountClient
public async Task<Account> Get(Guid id, CancellationToken cancellationToken = default)
{
var account = await _nordigenHttpClient
.GetAsJson<Account>(Routes.Accounts.IdUri(id), cancellationToken)
.Get<Account>(Routes.Accounts.IdUri(id), cancellationToken)
.ConfigureAwait(false);
return account!;
@@ -37,7 +37,7 @@ public sealed class AccountClient : IAccountClient
public async Task<List<Balance>> GetBalances(Guid id, CancellationToken cancellationToken = default)
{
var balances = await _nordigenHttpClient
.GetAsJson<BalancesWrapper>(Routes.Accounts.BalancesUri(id), cancellationToken)
.Get<BalancesWrapper>(Routes.Accounts.BalancesUri(id), cancellationToken)
.ConfigureAwait(false);
return balances!.Balances;
@@ -47,7 +47,7 @@ public sealed class AccountClient : IAccountClient
public async Task<AccountDetails> GetDetails(Guid id, CancellationToken cancellationToken = default)
{
var details = await _nordigenHttpClient
.GetAsJson<AccountDetailsWrapper>(Routes.Accounts.DetailsUri(id), cancellationToken)
.Get<AccountDetailsWrapper>(Routes.Accounts.DetailsUri(id), cancellationToken)
.ConfigureAwait(false);
return details!.Account;
@@ -62,7 +62,7 @@ public sealed class AccountClient : IAccountClient
var uri = Routes.Accounts.TransactionsUri(id, interval);
var transactions = await _nordigenHttpClient
.GetAsJson<TransactionsWrapper>(uri, cancellationToken)
.Get<TransactionsWrapper>(uri, cancellationToken)
.ConfigureAwait(false);
return transactions!.Transactions;
@@ -24,15 +24,14 @@ public sealed class AgreementClient : IAgreementClient
/// <inheritdoc />
public IAsyncEnumerable<EndUserAgreement> Get(int pageSize = 100, CancellationToken cancellationToken = default)
{
var requestUri = $"{Routes.Agreements.Uri}?limit={pageSize}&offset=0";
return _nordigenHttpClient.GetAsJsonPaginated<EndUserAgreement>(requestUri, cancellationToken);
return _nordigenHttpClient.GetPaginated<EndUserAgreement>(Routes.Agreements.PaginatedUri(100), cancellationToken);
}
/// <inheritdoc />
public async Task<EndUserAgreement> Get(Guid id, CancellationToken cancellationToken = default)
{
var agreement = await _nordigenHttpClient
.GetAsJson<EndUserAgreement>(Routes.Agreements.IdUri(id), cancellationToken)
.Get<EndUserAgreement>(Routes.Agreements.IdUri(id), cancellationToken)
.ConfigureAwait(false);
return agreement!;
@@ -42,7 +41,7 @@ public sealed class AgreementClient : IAgreementClient
public async Task<EndUserAgreement> Post(EndUserAgreementCreation agreementCreation)
{
var agreement = await _nordigenHttpClient
.PostAsJson<EndUserAgreementCreation, EndUserAgreement>(Routes.Agreements.Uri, agreementCreation)
.Post<EndUserAgreementCreation, EndUserAgreement>(Routes.Agreements.Uri, agreementCreation)
.ConfigureAwait(false);
return agreement!;
@@ -58,7 +57,7 @@ public sealed class AgreementClient : IAgreementClient
public async Task<EndUserAgreement> Put(Guid id, EndUserAgreementAcceptance acceptance)
{
var agreement = await _nordigenHttpClient
.PutAsJson<EndUserAgreementAcceptance, EndUserAgreement>(Routes.Agreements.AcceptUri(id), acceptance)
.Put<EndUserAgreementAcceptance, EndUserAgreement>(Routes.Agreements.AcceptUri(id), acceptance)
.ConfigureAwait(false);
return agreement!;
@@ -24,7 +24,7 @@ public sealed class InstitutionClient : IInstitutionClient
public async Task<List<Institution>> GetByCountry(string countryCode, CancellationToken cancellationToken = default)
{
var institutions = await _nordigenHttpClient
.GetAsJson<List<Institution>>(Routes.Institutions.CountryUri(countryCode), cancellationToken)
.Get<List<Institution>>(Routes.Institutions.CountryUri(countryCode), cancellationToken)
.ConfigureAwait(false);
return institutions!;
@@ -34,7 +34,7 @@ public sealed class InstitutionClient : IInstitutionClient
public async Task<Institution> Get(string id, CancellationToken cancellationToken = default)
{
var institution = await _nordigenHttpClient
.GetAsJson<Institution>(Routes.Institutions.IdUri(id), cancellationToken)
.Get<Institution>(Routes.Institutions.IdUri(id), cancellationToken)
.ConfigureAwait(false);
return institution!;
@@ -35,49 +35,42 @@ public sealed class NordigenHttpClient
}.ConfigureForNodaTime(dateTimeZoneProvider);
}
internal async Task<TResult?> GetAsJson<TResult>(string requestUri, CancellationToken cancellationToken)
internal async Task<TResult?> Get<TResult>(string requestUri, CancellationToken cancellationToken)
{
return await _httpClient.GetFromJsonAsync<TResult>(requestUri, _serializerOptions, cancellationToken).ConfigureAwait(false);
}
internal async IAsyncEnumerable<TResult> GetAsJsonPaginated<TResult>(
internal async IAsyncEnumerable<TResult> GetPaginated<TResult>(
string requestUri,
[EnumeratorCancellation] CancellationToken cancellationToken)
where TResult : class
{
var next = requestUri;
do
while (next is not null && !cancellationToken.IsCancellationRequested)
{
if (cancellationToken.IsCancellationRequested)
{
yield break;
}
var paginatedList = await GetAsJson<PaginatedList<TResult>>(next, cancellationToken).ConfigureAwait(false);
var paginatedList = await Get<PaginatedList<TResult>>(next, cancellationToken).ConfigureAwait(false);
if (paginatedList?.Results is null)
{
yield break;
}
foreach (var requisition in paginatedList.Results)
foreach (var result in paginatedList.Results)
{
yield return requisition;
yield return result;
}
next = paginatedList.Next?.PathAndQuery;
}
while (next is not null);
}
internal async Task<TResult?> PostAsJson<TRequest, TResult>(string requestUri, TRequest request)
internal async Task<TResult?> Post<TRequest, TResult>(string requestUri, TRequest request)
{
var response = await _httpClient.PostAsJsonAsync(requestUri, request, _serializerOptions).ConfigureAwait(false);
await response.ThrowIfNotSuccessful().ConfigureAwait(false);
return await response.Content.ReadFromJsonAsync<TResult>(_serializerOptions).ConfigureAwait(false);
}
internal async Task<TResult?> PutAsJson<TRequest, TResult>(string requestUri, TRequest request)
internal async Task<TResult?> Put<TRequest, TResult>(string requestUri, TRequest request)
{
var response = await _httpClient.PutAsJsonAsync(requestUri, request, _serializerOptions).ConfigureAwait(false);
await response.ThrowIfNotSuccessful().ConfigureAwait(false);
@@ -24,15 +24,14 @@ public sealed class RequisitionClient : IRequisitionClient
/// <inheritdoc />
public IAsyncEnumerable<Requisition> Get(int pageSize = 100, CancellationToken cancellationToken = default)
{
var requestUri = $"{Routes.Requisitions.Uri}?limit={pageSize}&offset=0";
return _nordigenHttpClient.GetAsJsonPaginated<Requisition>(requestUri, cancellationToken);
return _nordigenHttpClient.GetPaginated<Requisition>(Routes.Requisitions.PaginatedUri(pageSize), cancellationToken);
}
/// <inheritdoc />
public async Task<Requisition> Get(Guid id, CancellationToken cancellationToken = default)
{
var requisition = await _nordigenHttpClient
.GetAsJson<Requisition>(Routes.Requisitions.IdUri(id), cancellationToken)
.Get<Requisition>(Routes.Requisitions.IdUri(id), cancellationToken)
.ConfigureAwait(false);
return requisition!;
@@ -42,7 +41,7 @@ public sealed class RequisitionClient : IRequisitionClient
public async Task<Requisition> Post(RequisitionCreation requisitionCreation)
{
var requisition = await _nordigenHttpClient
.PostAsJson<RequisitionCreation, Requisition>(Routes.Requisitions.Uri, requisitionCreation)
.Post<RequisitionCreation, Requisition>(Routes.Requisitions.Uri, requisitionCreation)
.ConfigureAwait(false);
return requisition!;
@@ -10,10 +10,14 @@ namespace VMelnalksnis.NordigenDotNet;
internal static class Routes
{
private static string PaginatedUri(string baseUri, int pageSize) => $"{baseUri}?limit={pageSize}&offset=0";
internal static class Agreements
{
internal const string Uri = "api/v2/agreements/enduser/";
internal static string PaginatedUri(int pageSize) => Routes.PaginatedUri(Uri, pageSize);
internal static string IdUri(Guid id) => $"{Uri}{id:N}/";
internal static string AcceptUri(Guid id) => $"{IdUri(id)}accept/";
@@ -49,6 +53,8 @@ internal static class Routes
{
internal const string Uri = "api/v2/requisitions/";
internal static string PaginatedUri(int pageSize) => Routes.PaginatedUri(Uri, pageSize);
internal static string IdUri(Guid id) => $"{Uri}{id:N}/";
}