gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] branch master updated: implement composite primary keys


From: gnunet
Subject: [libeufin] branch master updated: implement composite primary keys
Date: Mon, 29 Jun 2020 15:08:50 +0200

This is an automated email from the git hooks/post-receive script.

ms pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new f07a65e  implement composite primary keys
f07a65e is described below

commit f07a65e633b2961ef5f0447f086d85e1ec7f8f7d
Author: MS <ms@taler.net>
AuthorDate: Mon Jun 29 15:08:47 2020 +0200

    implement composite primary keys
---
 nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt    | 26 ++++------------------
 .../tech/libeufin/nexus/bankaccount/BankAccount.kt | 24 +++++++++++---------
 .../kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt | 14 +++++++-----
 .../tech/libeufin/nexus/server/NexusServer.kt      | 20 +++++++++++------
 4 files changed, 38 insertions(+), 46 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
index 5fcbc41..9d58ed2 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
@@ -210,32 +210,15 @@ class PaymentInitiationEntity(id: EntityID<Long>) : 
LongEntity(id) {
  * This table contains the bank accounts that are offered by the bank.
  * The bank account label (as assigned by the bank) is the primary key.
  */
-object OfferedBankAccountsTable : IdTable<String>() {
-    override val id = text("id").entityId()
+object OfferedBankAccountsTable : Table() {
+    val offeredAccountId = text("id")
     val bankConnection = reference("bankConnection", NexusBankConnectionsTable)
     val iban = text("iban")
     val bankCode = text("bankCode")
     val accountHolder = text("holderName")
     val imported = reference("imported", NexusBankAccountsTable).nullable()
-}
-
-class OfferedBankAccountEntity(id: EntityID<String>) : Entity<String>(id) {
-    companion object : EntityClass<String, 
OfferedBankAccountEntity>(OfferedBankAccountsTable)
-    var bankConnection by NexusBankConnectionEntity referencedOn 
OfferedBankAccountsTable.bankConnection
-    var iban by OfferedBankAccountsTable.iban
-    var bankCode by OfferedBankAccountsTable.bankCode
-    var accountHolder by OfferedBankAccountsTable.accountHolder
-    var imported by NexusBankAccountEntity optionalReferencedOn 
OfferedBankAccountsTable.imported
-}
 
-object AvailableConnectionsForAccountsTable : IntIdTable() {
-    val bankAccount = reference("bankAccount", NexusBankAccountsTable)
-    val bankConnection = reference("bankConnection", NexusBankConnectionsTable)
-}
-class AvailableConnectionForAccountEntity(id: EntityID<Int>) : IntEntity(id) {
-    companion object : 
IntEntityClass<AvailableConnectionForAccountEntity>(AvailableConnectionsForAccountsTable)
-    var bankAccount by NexusBankAccountEntity referencedOn 
AvailableConnectionsForAccountsTable.bankAccount
-    var bankConnection by NexusBankConnectionEntity referencedOn 
AvailableConnectionsForAccountsTable.bankConnection
+    override val primaryKey = PrimaryKey(offeredAccountId, bankConnection)
 }
 
 /**
@@ -415,8 +398,7 @@ fun dbCreateTables(dbName: String) {
             FacadesTable,
             TalerFacadeStateTable,
             NexusScheduledTasksTable,
-            OfferedBankAccountsTable,
-            AvailableConnectionsForAccountsTable
+            OfferedBankAccountsTable
         )
     }
 }
diff --git 
a/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
index 21954f8..9c92c9a 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/bankaccount/BankAccount.kt
@@ -26,9 +26,11 @@ import io.ktor.client.HttpClient
 import io.ktor.http.HttpStatusCode
 import org.jetbrains.exposed.sql.SortOrder
 import org.jetbrains.exposed.sql.and
+import org.jetbrains.exposed.sql.select
 import org.jetbrains.exposed.sql.transactions.transaction
 import org.w3c.dom.Document
 import tech.libeufin.nexus.*
+import tech.libeufin.nexus.OfferedBankAccountsTable.iban
 import tech.libeufin.nexus.ebics.fetchEbicsBySpec
 import tech.libeufin.nexus.ebics.submitEbicsPaymentInitiation
 import tech.libeufin.nexus.server.FetchSpecJson
@@ -305,16 +307,20 @@ suspend fun fetchBankAccountTransactions(
 fun importBankAccount(call: ApplicationCall, offeredBankAccountId: String, 
nexusBankAccountId: String) {
     transaction {
         val conn = requireBankConnection(call, "connid")
-        val offeredAccount = 
OfferedBankAccountEntity.findById(offeredBankAccountId) ?: throw NexusError(
-            HttpStatusCode.NotFound, "Could not found raw bank account 
'${offeredBankAccountId}'"
+        // first get handle of the offered bank account
+        val offeredAccount = OfferedBankAccountsTable.select {
+            OfferedBankAccountsTable.offeredAccountId eq offeredBankAccountId
+        }.firstOrNull() ?: throw NexusError(
+            HttpStatusCode.NotFound, "Could not find raw bank account 
'${offeredBankAccountId}'"
         )
         // detect name collisions first.
         NexusBankAccountEntity.findById(nexusBankAccountId).run {
             val importedAccount = when(this) {
                 is NexusBankAccountEntity -> {
-                    if (this.iban != offeredAccount.iban) {
+                    if (this.iban != 
offeredAccount[OfferedBankAccountsTable.iban]) {
                         throw NexusError(
                             HttpStatusCode.Conflict,
+                            // different accounts == different IBANs
                             "Cannot import two different accounts under one 
label: ${nexusBankAccountId}"
                         )
                     }
@@ -322,20 +328,16 @@ fun importBankAccount(call: ApplicationCall, 
offeredBankAccountId: String, nexus
                 }
                 else -> {
                     val newImportedAccount = 
NexusBankAccountEntity.new(nexusBankAccountId) {
-                        iban = offeredAccount.iban
-                        bankCode = offeredAccount.bankCode
+                        iban = offeredAccount[OfferedBankAccountsTable.iban]
+                        bankCode = 
offeredAccount[OfferedBankAccountsTable.bankCode]
                         defaultBankConnection = conn
                         highestSeenBankMessageId = 0
-                        accountHolder = offeredAccount.accountHolder
+                        accountHolder = 
offeredAccount[OfferedBankAccountsTable.accountHolder]
                     }
-                    offeredAccount.imported = newImportedAccount
+                    offeredAccount[OfferedBankAccountsTable.imported] = 
newImportedAccount
                     newImportedAccount
                 }
             }
-            AvailableConnectionForAccountEntity.new {
-                bankAccount = importedAccount
-                bankConnection = conn
-            }
         }
     }
 }
\ No newline at end of file
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
index 48546b2..f515083 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
@@ -43,6 +43,7 @@ import io.ktor.routing.Route
 import io.ktor.routing.get
 import io.ktor.routing.post
 import org.jetbrains.exposed.sql.and
+import org.jetbrains.exposed.sql.insert
 import org.jetbrains.exposed.sql.not
 import org.jetbrains.exposed.sql.statements.api.ExposedBlob
 import org.jetbrains.exposed.sql.transactions.transaction
@@ -344,19 +345,19 @@ suspend fun ebicsFetchAccounts(connId: String, client: 
HttpClient) {
                 response.orderData.toString(Charsets.UTF_8)
             )
             transaction {
-                payload.value.partnerInfo.accountInfoList?.forEach {
-                    OfferedBankAccountEntity.new(id = it.id) {
-                        accountHolder = it.accountHolder ?: "NOT-GIVEN"
-                        iban = 
it.accountNumberList?.filterIsInstance<EbicsTypes.GeneralAccountNumber>()
+                payload.value.partnerInfo.accountInfoList?.forEach { 
accountInfo ->
+                    OfferedBankAccountsTable.insert { newRow ->
+                        newRow[accountHolder] = accountInfo.accountHolder ?: 
"NOT GIVEN"
+                        newRow[iban] = 
accountInfo.accountNumberList?.filterIsInstance<EbicsTypes.GeneralAccountNumber>()
                             ?.find { it.international }?.value
                             ?: throw NexusError(HttpStatusCode.NotFound, 
reason = "bank gave no IBAN")
-                        bankCode = 
it.bankCodeList?.filterIsInstance<EbicsTypes.GeneralBankCode>()
+                        newRow[bankCode] = 
accountInfo.bankCodeList?.filterIsInstance<EbicsTypes.GeneralBankCode>()
                             ?.find { it.international }?.value
                             ?: throw NexusError(
                                 HttpStatusCode.NotFound,
                                 reason = "bank gave no BIC"
                             )
-                        bankConnection = requireBankConnectionInternal(connId)
+                        newRow[bankConnection] = 
requireBankConnectionInternal(connId).id
                     }
                 }
             }
@@ -373,6 +374,7 @@ fun Route.ebicsBankProtocolRoutes(client: HttpClient) {
     }
 }
 
+
 fun Route.ebicsBankConnectionRoutes(client: HttpClient) {
     post("/send-ini") {
         val subscriber = transaction {
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
index 4aa072f..f3431b1 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
@@ -49,9 +49,15 @@ import io.ktor.utils.io.ByteReadChannel
 import io.ktor.utils.io.jvm.javaio.toByteReadChannel
 import io.ktor.utils.io.jvm.javaio.toInputStream
 import org.jetbrains.exposed.sql.and
+import org.jetbrains.exposed.sql.select
 import org.jetbrains.exposed.sql.transactions.transaction
 import org.slf4j.event.Level
 import tech.libeufin.nexus.*
+import tech.libeufin.nexus.OfferedBankAccountsTable.accountHolder
+import tech.libeufin.nexus.OfferedBankAccountsTable.bankCode
+import tech.libeufin.nexus.OfferedBankAccountsTable.iban
+import tech.libeufin.nexus.OfferedBankAccountsTable.imported
+import tech.libeufin.nexus.OfferedBankAccountsTable.offeredAccountId
 import tech.libeufin.nexus.bankaccount.*
 import tech.libeufin.nexus.ebics.*
 import tech.libeufin.util.*
@@ -788,16 +794,16 @@ fun serverMain(dbName: String, host: String) {
                     val ret = mutableListOf<OfferedBankAccount>()
                     transaction {
                         val conn = requireBankConnection(call, "connid")
-                        OfferedBankAccountEntity.find {
+                        OfferedBankAccountsTable.select {
                             OfferedBankAccountsTable.bankConnection eq 
conn.id.value
-                        }.forEach {
+                        }.forEach {resultRow ->
                             ret.add(
                                 OfferedBankAccount(
-                                    ownerName = it.accountHolder,
-                                    iban = it.iban,
-                                    bic = it.bankCode,
-                                    offeredAccountId = it.id.value,
-                                    nexusBankAccountId = it.imported?.id?.value
+                                    ownerName = resultRow[accountHolder],
+                                    iban = resultRow[iban],
+                                    bic = resultRow[bankCode],
+                                    offeredAccountId = 
resultRow[offeredAccountId],
+                                    nexusBankAccountId = 
resultRow[imported]?.value // is 'value' the id?
                                 )
                             )
                         }

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]