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);