All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.kevin.api.services.account.AccountClient.kt Maven / Gradle / Ivy

package eu.kevin.api.services.account

import eu.kevin.api.Endpoint
import eu.kevin.api.exceptions.KevinApiErrorException
import eu.kevin.api.extensions.appendAtStartIfNotExist
import eu.kevin.api.extensions.suspendingToCompletableFuture
import eu.kevin.api.models.ResponseArray
import eu.kevin.api.models.account.AccountRequestHeaders
import eu.kevin.api.models.account.balance.request.GetAccountBalanceRequest
import eu.kevin.api.models.account.balance.response.AccountBalanceResponse
import eu.kevin.api.models.account.detail.AccountDetailsResponse
import eu.kevin.api.models.account.detail.GetAccountDetailsRequest
import eu.kevin.api.models.account.list.AccountResponse
import eu.kevin.api.models.account.transaction.request.GetAccountTransactionsRequest
import eu.kevin.api.models.account.transaction.response.AccountTransactionResponse
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import java.util.concurrent.CompletableFuture

/**
 * Implements API Methods of the [Account information service](https://api-reference.kevin.eu/public/platform/v0.3#tag/Account-Information-Service)
 */
class AccountClient internal constructor(
    private val httpClient: HttpClient
) {

    /**
     *  API Method: [Get accounts list](https://api-reference.kevin.eu/public/platform/v0.3#tag/Account-Information-Service/operation/getAccounts)
     */
    @Throws(KevinApiErrorException::class)
    suspend fun getAccountsList(request: AccountRequestHeaders): List =
        httpClient.get {
            url(path = Endpoint.Paths.Account.getAccountsList())
            appendAccountRequestHeaders(headers = request)
        }.body>().data

    /**
     * Equivalent of suspending `getAccountsList(request: AccountRequestHeaders)` for Java interoperability
     */
    @JvmName("getAccountsList")
    fun getAccountsListAsFuture(request: AccountRequestHeaders): CompletableFuture> {
        return suspendingToCompletableFuture { getAccountsList(request) }
    }

    /**
     * API Method: [Get account details](https://api-reference.kevin.eu/public/platform/v0.3#tag/Account-Information-Service/operation/getAccount)
     */
    @Throws(KevinApiErrorException::class)
    suspend fun getAccountDetails(request: GetAccountDetailsRequest): AccountDetailsResponse =
        httpClient.get {
            url(path = Endpoint.Paths.Account.getAccountDetails(accountId = request.accountId))
            appendAccountRequestHeaders(headers = request.headers)
        }.body()

    /**
     * Equivalent of suspending `getAccountDetails(request: GetAccountDetailsRequest)` for Java interoperability
     */
    @JvmName("getAccountDetails")
    fun getAccountDetailsAsFuture(request: GetAccountDetailsRequest): CompletableFuture {
        return suspendingToCompletableFuture { getAccountDetails(request) }
    }

    /**
     * API Method: [Get account transactions](https://api-reference.kevin.eu/public/platform/v0.3#tag/Account-Information-Service/operation/getAccountTransactions)
     */
    @Throws(KevinApiErrorException::class)
    suspend fun getAccountTransactions(request: GetAccountTransactionsRequest): List =
        httpClient.get {
            url(path = Endpoint.Paths.Account.getAccountTransactions(accountId = request.accountId))
            appendAccountRequestHeaders(headers = request.headers)
            parameter("dateFrom", request.dateFrom)
            parameter("dateTo", request.dateTo)
        }.body>().data

    /**
     * Equivalent of suspending `getAccountTransactions(request: GetAccountTransactionsRequest)` for Java interoperability
     */
    @JvmName("getAccountTransactions")
    fun getAccountTransactionsAsFuture(request: GetAccountTransactionsRequest): CompletableFuture> {
        return suspendingToCompletableFuture { getAccountTransactions(request) }
    }

    /**
     * API Method: [Get account balance](https://api-reference.kevin.eu/public/platform/v0.3#tag/Account-Information-Service/operation/getAccountBalance)
     */
    @Throws(KevinApiErrorException::class)
    suspend fun getAccountBalances(request: GetAccountBalanceRequest): List =
        httpClient.get {
            url(path = Endpoint.Paths.Account.getAccountBalance(accountId = request.accountId))
            appendAccountRequestHeaders(headers = request.headers)
        }.body>().data

    /**
     * Equivalent of suspending `getAccountBalances(request: GetAccountBalanceRequest)` for Java interoperability
     */
    @JvmName("getAccountBalances")
    fun getAccountBalancesAsFuture(request: GetAccountBalanceRequest): CompletableFuture> {
        return suspendingToCompletableFuture { getAccountBalances(request) }
    }

    private fun HttpRequestBuilder.appendAccountRequestHeaders(headers: AccountRequestHeaders) {
        headers.run {
            headers {
                append("Authorization", accessToken.appendAtStartIfNotExist("Bearer "))
                append("PSU-IP-Address", psuIPAddress)
                append("PSU-User-Agent", psuUserAgent)
                append("PSU-IP-Port", psuIPPort)
                append("PSU-Http-Method", psuHttpMethod.value)
                append("PSU-Device-ID", psuDeviceId)
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy