Skip to content

Commit

Permalink
Added requisitions endpoints
Browse files Browse the repository at this point in the history
Added requisitions endpoints
  • Loading branch information
dariogriffo authored Jan 31, 2022
2 parents 6d2c1d5 + 6b5f5c0 commit 4921112
Show file tree
Hide file tree
Showing 20 changed files with 366 additions and 4 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ services.AddNordigenApi();
INordigenApi => Just inject this and you can have access to all the endpoints with the members
IAccountsEndpoint => Access to Accounts
IInstitutionsEndpoint => Access to Institutions
IRequisitionsEndpoint => Access to Requisitions
```

# Token management
Expand Down
4 changes: 4 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
Release Notes
=============

## [0.6.0](https://github.com/dariogriffo/Nordigen.Net/releases/tag/0.6.0)

Added requisitions endpoint

## [0.5.0](https://github.com/dariogriffo/Nordigen.Net/releases/tag/0.5.0)

Removed dependency on OneOf Nuget package
Expand Down
2 changes: 2 additions & 0 deletions src/Nordigen.Net/INordigenApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ public interface INordigenApi
IAccountsEndpoint Accounts { get; }

IInstitutionsEndpoint Institutions { get; }

IRequisitionsEndpoint Requisitions { get; }

}
}
45 changes: 45 additions & 0 deletions src/Nordigen.Net/IRequisitionsEndpoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
namespace Nordigen.Net
{
using System;
using System.Threading;
using System.Threading.Tasks;
using Queries;
using Responses;

public interface IRequisitionsEndpoint
{
/// <summary>
/// Get details about a specific requisition.
/// </summary>
/// <param name="id">The id of the requisition</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/></param>
/// <returns>A list of <see cref="Institution"/> or <see cref="Error"/></returns>
Task<NOneOf<Requisition, Error>> Get(Guid id, CancellationToken cancellationToken = default);

/// <summary>
/// Paginate requisitions.
/// </summary>
/// <param name="command">The Pagination command</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/></param>
/// <returns>A list of <see cref="Institution"/> or <see cref="Error"/></returns>
Task<NOneOf<PaginationResult<Requisition>, Error>> Paginate(Paginate<Requisition> command, CancellationToken cancellationToken = default);

/// <summary>
/// Creates a new requisition
/// </summary>
/// <param name="requisition"> The <see cref="Requisition"/></param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/></param>
/// <returns></returns>
Task<NOneOf<Requisition, Error>> Post(Requisition requisition, CancellationToken cancellationToken = default);


/// <summary>
/// Deletes a requisition.
/// </summary>
/// <param name="id">The id of the requisition</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/></param>
/// <returns>A list of <see cref="Institution"/> or <see cref="Error"/></returns>
Task<NOneOf<Deleted, Error>> Delete(Guid id, CancellationToken cancellationToken = default);

}
}
5 changes: 5 additions & 0 deletions src/Nordigen.Net/Internal/INordigenHttpClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@ internal interface INordigenHttpClient
{
Task<NOneOf<T, Error>> Get<T>(string url, CancellationToken cancellationToken = default)
where T : class;

Task<NOneOf<TResult, Error>> Post<T, TResult>(T model, string url, CancellationToken cancellationToken = default)
where T : class;

Task<NOneOf<Deleted, Error>> Delete(string url, CancellationToken cancellationToken = default);
}
}
31 changes: 31 additions & 0 deletions src/Nordigen.Net/Internal/Model/PaginationResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace Nordigen.Net.Internal.Model
{
using System.Collections.Generic;
using Newtonsoft.Json;


public class PaginationResult<T>
{
[JsonConstructor]
public PaginationResult(
int count,
string next,
string previous,
T[] results
)
{
Count = count;
Next = next;
Previous = previous;
Results = results;
}

public int Count { get; }

public string Next { get; }

public string Previous { get; }

public T[] Results { get; }
}
}
48 changes: 48 additions & 0 deletions src/Nordigen.Net/Internal/Model/RequisitionPost.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
namespace Nordigen.Net.Internal.Model
{
using System;
using Newtonsoft.Json;

internal class RequisitionPost
{
public RequisitionPost(
string redirect,
Guid institutionId,
Guid agreement,
string reference,
string userLanguage,
string ssn,
bool accountSelection
)
{
this.Redirect = redirect;
this.InstitutionId = institutionId;
this.Agreement = agreement;
this.Reference = reference;
this.UserLanguage = userLanguage;
this.Ssn = ssn;
this.AccountSelection = accountSelection;
}

[JsonProperty("redirect")]
public string Redirect { get; }

[JsonProperty("institution_id")]
public Guid InstitutionId { get; }

[JsonProperty("agreement")]
public Guid Agreement { get; }

[JsonProperty("reference")]
public string Reference { get; }

[JsonProperty("user_language")]
public string UserLanguage { get; }

[JsonProperty("ssn")]
public string Ssn { get; }

[JsonProperty("account_selection")]
public bool AccountSelection { get; }
}
}
6 changes: 5 additions & 1 deletion src/Nordigen.Net/Internal/NordigenApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ public class NordigenApi : INordigenApi
{
public NordigenApi(
IAccountsEndpoint accounts,
IInstitutionsEndpoint institutions)
IInstitutionsEndpoint institutions,
IRequisitionsEndpoint requisitions)
{
Accounts = accounts;
Institutions = institutions;
Requisitions = requisitions;
}

public IAccountsEndpoint Accounts { get; }

public IInstitutionsEndpoint Institutions { get; }

public IRequisitionsEndpoint Requisitions { get; }
}
}
41 changes: 39 additions & 2 deletions src/Nordigen.Net/Internal/NordigenHttpClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Responses;
Expand All @@ -19,8 +20,8 @@ internal class NordigenHttpClient : INordigenHttpClient
private Token? _token;

public NordigenHttpClient(
ITokensEndpoint tokensEndpoint,
IHttpClientFactory factory,
ITokensEndpoint tokensEndpoint,
IHttpClientFactory factory,
ISerializer serializer,
NordigenApiOptions options)
{
Expand Down Expand Up @@ -48,6 +49,42 @@ public async Task<NOneOf<T, Error>> Get<T>(string url, CancellationToken cancell
: _serializer.Deserialize<Error>(await message.Content.ReadAsStringAsync());
}

public async Task<NOneOf<TResult, Error>> Post<T, TResult>(T model, string url, CancellationToken cancellationToken = default) where T : class
{
try
{
await EnsureValidToken(cancellationToken);
}
catch (UnauthorizedAccessException)
{
return new Error(401, string.Empty, string.Empty, string.Empty);
}

var content = new StringContent(_serializer.Serialize(model), Encoding.UTF8, "application/json");

var message = await _client.PostAsync(url, content, cancellationToken);
return message.IsSuccessStatusCode
? (NOneOf<TResult, Error>)_serializer.Deserialize<TResult>(await message.Content.ReadAsStringAsync())
: _serializer.Deserialize<Error>(await message.Content.ReadAsStringAsync());
}

public async Task<NOneOf<Deleted, Error>> Delete(string url, CancellationToken cancellationToken = default)
{
try
{
await EnsureValidToken(cancellationToken);
}
catch (UnauthorizedAccessException)
{
return new Error(401, string.Empty, string.Empty, string.Empty);
}

var message = await _client.DeleteAsync(url, cancellationToken);
return message.IsSuccessStatusCode ?
NOneOf<Deleted, Error>.FromT0(Deleted.Value)
: _serializer.Deserialize<Error>(await message.Content.ReadAsStringAsync());
}

internal Token? Token => _token;

private async Task EnsureValidToken(CancellationToken cancellationToken)
Expand Down
40 changes: 40 additions & 0 deletions src/Nordigen.Net/Internal/RequisitionsEndpoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
namespace Nordigen.Net.Internal
{
using System;
using System.Threading;
using System.Threading.Tasks;
using Queries;
using Responses;

public class RequisitionsEndpoint : IRequisitionsEndpoint
{
private readonly INordigenHttpClient _client;

internal RequisitionsEndpoint(INordigenHttpClient client)
{
_client = client;
}

public Task<NOneOf<Requisition, Error>> Get(Guid id, CancellationToken cancellationToken = default)
{
return _client.Get<Requisition>($"api/v2/requisitions/{id}/", cancellationToken);
}

public async Task<NOneOf<Responses.PaginationResult<Requisition>, Error>> Paginate(Paginate<Requisition> command, CancellationToken cancellationToken = default)
{
var result = await _client.Get<Internal.Model.PaginationResult<Requisition>>($"api/v2/requisitions/?limit={command.Limit}&offset={command.Offset}", cancellationToken);
return result.Match(x => NOneOf<Responses.PaginationResult<Requisition>, Error>.FromT0(new Responses.PaginationResult<Requisition>(x, command.Limit, command.Offset)), _ => _);
}

public async Task<NOneOf<Requisition, Error>> Post(Requisition requisition, CancellationToken cancellationToken = default)
{
var model = new Internal.Model.RequisitionPost(requisition.Redirect, requisition.InstitutionId, requisition.Agreement, requisition.Reference, requisition.UserLanguage, requisition.Ssn, requisition.AccountSelection);
return await _client.Post<Internal.Model.RequisitionPost, Requisition>(model, "api/v2/requisitions/", cancellationToken);
}

public Task<NOneOf<Deleted, Error>> Delete(Guid id, CancellationToken cancellationToken = default)
{
return _client.Delete($"api/v2/requisitions/{id}/", cancellationToken);
}
}
}
2 changes: 1 addition & 1 deletion src/Nordigen.Net/Nordigen.Net.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<Version>0.5.0</Version>
<Version>0.6.0</Version>
<Authors>https://github.com/dariogriffo</Authors>
<Company>https://github.com/dariogriffo</Company>
<Title>Nordigen.Net</Title>
Expand Down
1 change: 1 addition & 0 deletions src/Nordigen.Net/NordigenApiServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public static IServiceCollection AddNordigenApi(IServiceCollection services)
services.AddSingleton<INordigenApi, NordigenApi>();
services.AddSingleton<IAccountsEndpoint, AccountsEndpoint>();
services.AddSingleton<IInstitutionsEndpoint, InstitutionsEndpoint>();
services.AddSingleton<IRequisitionsEndpoint, RequisitionsEndpoint>();
return services;
}
}
Expand Down
15 changes: 15 additions & 0 deletions src/Nordigen.Net/Queries/Paginate.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Nordigen.Net.Queries
{
public class Paginate<T>
{
public Paginate(int limit, int offset)
{
Limit = limit;
Offset = offset;
}

public int Limit { get; }

public int Offset { get; }
}
}
1 change: 1 addition & 0 deletions src/Nordigen.Net/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ services.AddNordigenApi();
INordigenApi => Just inject this and you can have access to all the endpoints with the members
IAccountsEndpoint => Access to Accounts
IInstitutionsEndpoint => Access to Institutions
IRequisitionsEndpoint => Access to Requisitions
```

# Token management
Expand Down
1 change: 1 addition & 0 deletions src/Nordigen.Net/Responses/Account.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using Newtonsoft.Json;


public class Account
{
[JsonConstructor]
Expand Down
10 changes: 10 additions & 0 deletions src/Nordigen.Net/Responses/Deleted.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Nordigen.Net.Responses
{
public struct Deleted
{
public static Deleted Value
{
get;
} = new Deleted();
}
}
10 changes: 10 additions & 0 deletions src/Nordigen.Net/Responses/End.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Nordigen.Net.Responses
{
public struct End
{
public static End Value
{
get;
} = new End();
}
}
21 changes: 21 additions & 0 deletions src/Nordigen.Net/Responses/PaginationResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace Nordigen.Net.Responses
{
using System.Collections.Generic;
using Queries;

public class PaginationResult<T>
{
internal PaginationResult(Internal.Model.PaginationResult<T> paginationResult, int limit, int offset)
{
Result = paginationResult.Results;
var taken = offset + Result.Length;
Next = taken != paginationResult.Count
? (NOneOf<Paginate<T>, End>)new Paginate<T>(limit, taken)
: End.Value;
}

public T[] Result { get; }

public NOneOf<Paginate<T>, End> Next { get; }
}
}
Loading

0 comments on commit 4921112

Please sign in to comment.