fints4k/SampleApplications/WebApp/src/main/kotlin/Presenter.kt

66 lines
No EOL
2.9 KiB
Kotlin

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.dankito.banking.client.model.parameter.GetAccountDataParameter
import net.dankito.banking.client.model.parameter.TransferMoneyParameter
import net.dankito.banking.client.model.response.GetAccountDataResponse
import net.dankito.banking.client.model.response.TransferMoneyResponse
import net.dankito.banking.fints.FinTsClient
import net.dankito.banking.fints.callback.SimpleFinTsClientCallback
import net.dankito.banking.fints.model.*
import net.dankito.banking.fints.webclient.KtorWebClient
import net.dankito.banking.fints.webclient.ProxyingWebClient
import net.dankito.utils.multiplatform.log.LoggerFactory
open class Presenter {
companion object {
private val log = LoggerFactory.getLogger(Presenter::class)
}
// to circumvent CORS we have to use a CORS proxy like the SampleApplications.CorsProxy Application.kt or
// https://github.com/Rob--W/cors-anywhere. Set CORS proxy's URL here
protected open val fintsClient = FinTsClient(SimpleFinTsClientCallback { challenge -> enterTan(challenge) },
ProxyingWebClient("http://localhost:8082/", KtorWebClient()))
open var enterTanCallback: ((TanChallenge) -> Unit)? = null
open protected fun enterTan(tanChallenge: TanChallenge) {
enterTanCallback?.invoke(tanChallenge) ?: run { tanChallenge.userDidNotEnterTan() }
}
open fun retrieveAccountData(bankCode: String, loginName: String, password: String, retrievedResult: (GetAccountDataResponse) -> Unit) {
GlobalScope.launch(Dispatchers.Unconfined) {
val response = fintsClient.getAccountDataAsync(GetAccountDataParameter(bankCode, loginName, password))
log.info("Retrieved response from ${response.customerAccount?.bankName} for ${response.customerAccount?.customerName}")
withContext(Dispatchers.Main) {
retrievedResult(response)
}
}
}
open fun transferMoney(recipientName: String, recipientAccountIdentifier: String, recipientBankIdentifier: String?, reference: String?,
amount: String, instantPayment: Boolean = false, response: (TransferMoneyResponse) -> Unit) {
GlobalScope.launch(Dispatchers.Unconfined) {
// TODO: set your credentials here
val transferMoneyResponse = fintsClient.transferMoneyAsync(TransferMoneyParameter("", "", "", null, recipientName,
recipientAccountIdentifier, recipientBankIdentifier, Money(Amount(amount), Currency.DefaultCurrencyCode), reference, instantPayment))
if (transferMoneyResponse.successful) {
log.info("Successfully transferred $amount to $recipientName")
} else {
log.error("Could not transfer $amount to $recipientName: ${transferMoneyResponse.error} ${transferMoneyResponse.errorMessage}")
}
withContext(Dispatchers.Main) {
response(transferMoneyResponse)
}
}
}
}