namespace Books.Api.Banking;
///
/// Client for Enable Banking Open Banking API
/// https://enablebanking.com/docs/api/reference/
///
public interface IEnableBankingClient
{
///
/// Get list of available ASPSPs (banks) for a country
///
Task> GetAspspsAsync(string country = "DK", CancellationToken ct = default);
///
/// Start authorization flow for connecting a bank account
///
Task StartAuthorizationAsync(
string aspspName,
string redirectUrl,
string state,
string psuType = "personal",
string? psuIpAddress = null,
string? psuUserAgent = null,
CancellationToken ct = default);
///
/// Complete authorization and create a session
///
Task CreateSessionAsync(
string authorizationCode,
string? psuIpAddress = null,
string? psuUserAgent = null,
CancellationToken ct = default);
///
/// Get account details
///
Task GetAccountDetailsAsync(string sessionId, string accountId, CancellationToken ct = default);
///
/// Get account balances
///
Task> GetBalancesAsync(string sessionId, string accountId, CancellationToken ct = default);
///
/// Get account transactions
///
Task GetTransactionsAsync(
string sessionId,
string accountId,
DateOnly? dateFrom = null,
DateOnly? dateTo = null,
CancellationToken ct = default);
}
// DTOs for Enable Banking API responses
public record Aspsp(
string Name,
string Country,
string Logo,
IReadOnlyList PsuTypes,
bool BusinessAccounts,
bool PersonalAccounts);
public record AuthorizationResponse(
string AuthorizationId,
string Url);
public record SessionResponse(
string SessionId,
string AspspName,
IReadOnlyList Accounts,
DateTimeOffset ValidUntil);
public record SessionAccount(
string AccountId,
string Iban,
string Currency,
string? AccountName);
public record AccountDetails(
string AccountId,
string Iban,
string Currency,
string? Name,
string? OwnerName,
string? Product);
public record Balance(
string BalanceType,
decimal Amount,
string Currency,
DateTimeOffset? ReferenceDate);
public record TransactionsResponse(
IReadOnlyList Transactions,
string? ContinuationKey);
public record Transaction(
string TransactionId,
decimal Amount,
string Currency,
DateOnly BookingDate,
DateOnly? ValueDate,
string? CreditorName,
string? DebtorName,
string? RemittanceInformation,
string? EndToEndId,
bool IsDebit);