libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 1ce76c52f15995d869f62e212f067e53e9369785
parent 159225a83bd263170f8ddfe0bb3ddb34c63abfa7
Author: ms <ms@taler.net>
Date:   Fri, 15 Jan 2021 16:53:28 +0100

Avoid stack-trace for double download of accounts.

Diffstat:
Mcli/bin/libeufin-cli | 3+--
Mnexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt | 11++++++++---
Mnexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt | 8++------
3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/cli/bin/libeufin-cli b/cli/bin/libeufin-cli @@ -320,8 +320,7 @@ def list_offered_bank_accounts(obj, connection_name): print("Could not reach nexus at " + url) exit(1) - - tell_user(resp) + tell_user(resp, withsuccess=True) @accounts.command(help="Schedules a new task") @click.argument("account-name") diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt @@ -40,7 +40,9 @@ import io.ktor.response.respond import io.ktor.response.respondText import io.ktor.routing.Route import io.ktor.routing.post +import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.insert +import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.statements.api.ExposedBlob import org.jetbrains.exposed.sql.transactions.transaction import tech.libeufin.nexus.* @@ -333,9 +335,7 @@ private fun getEbicsSubscriberDetails(bankConnectionId: String): EbicsClientSubs } suspend fun ebicsFetchAccounts(connId: String, client: HttpClient) { - val subscriberDetails = transaction { - getEbicsSubscriberDetails(connId) - } + val subscriberDetails = transaction { getEbicsSubscriberDetails(connId) } val response = doEbicsDownloadTransaction( client, subscriberDetails, "HTD", EbicsStandardOrderParams() ) @@ -352,6 +352,11 @@ suspend fun ebicsFetchAccounts(connId: String, client: HttpClient) { ) transaction { payload.value.partnerInfo.accountInfoList?.forEach { accountInfo -> + val isDuplicate = OfferedBankAccountsTable.select { + OfferedBankAccountsTable.bankConnection eq connId and ( + OfferedBankAccountsTable.offeredAccountId eq accountInfo.id) + }.firstOrNull() + if (isDuplicate != null) return@forEach OfferedBankAccountsTable.insert { newRow -> newRow[accountHolder] = accountInfo.accountHolder ?: "NOT GIVEN" newRow[iban] = accountInfo.accountNumberList?.filterIsInstance<EbicsTypes.GeneralAccountNumber>() diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt @@ -46,7 +46,6 @@ import io.ktor.response.respondText import io.ktor.routing.* import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty -import io.ktor.util.error import io.ktor.utils.io.ByteReadChannel import io.ktor.utils.io.jvm.javaio.toByteReadChannel import io.ktor.utils.io.jvm.javaio.toInputStream @@ -212,11 +211,8 @@ fun createLoopbackBankConnection(bankConnectionName: String, user: NexusUserEnti } fun requireBankConnectionInternal(connId: String): NexusBankConnectionEntity { - val conn = transaction { NexusBankConnectionEntity.findById(connId) } - if (conn == null) { - throw NexusError(HttpStatusCode.NotFound, "bank connection '$connId' not found") - } - return conn + return transaction { NexusBankConnectionEntity.findById(connId) } + ?: throw NexusError(HttpStatusCode.NotFound, "bank connection '$connId' not found") } fun requireBankConnection(call: ApplicationCall, parameterKey: String): NexusBankConnectionEntity {