gnunet-svn
[Top][All Lists]
Advanced

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

[libeufin] branch master updated: Addressing 6394 (PAIN de- duplication)


From: gnunet
Subject: [libeufin] branch master updated: Addressing 6394 (PAIN de- duplication).
Date: Tue, 21 Jul 2020 14:25:01 +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 75d4f6d  Addressing 6394 (PAIN de- duplication).
75d4f6d is described below

commit 75d4f6dd9ff07884710e18ee2b2cdc980a178e5a
Author: MS <ms@taler.net>
AuthorDate: Tue Jul 21 14:23:39 2020 +0200

    Addressing 6394 (PAIN de- duplication).
    
    Changing the Table layout and getting the code
    to compile.  Actual tests to check whether the
    primary key works are still needed.
---
 .../src/main/kotlin/tech/libeufin/sandbox/DB.kt    | 24 ++------
 .../tech/libeufin/sandbox/EbicsProtocolBackend.kt  | 67 ++++++++++++++--------
 .../src/main/kotlin/tech/libeufin/sandbox/Main.kt  | 54 ++++++++++-------
 sandbox/src/test/kotlin/DBTest.kt                  | 34 +++++------
 util/src/main/kotlin/JSON.kt                       |  2 +-
 5 files changed, 99 insertions(+), 82 deletions(-)

diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
index b2f5369..7b54ef5 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
@@ -26,10 +26,7 @@ import org.jetbrains.exposed.dao.IntEntityClass
 import org.jetbrains.exposed.dao.id.EntityID
 import org.jetbrains.exposed.dao.id.IdTable
 import org.jetbrains.exposed.dao.id.IntIdTable
-import org.jetbrains.exposed.sql.Database
-import org.jetbrains.exposed.sql.SchemaUtils
-import org.jetbrains.exposed.sql.StdOutSqlLogger
-import org.jetbrains.exposed.sql.addLogger
+import org.jetbrains.exposed.sql.*
 import org.jetbrains.exposed.sql.transactions.TransactionManager
 import org.jetbrains.exposed.sql.transactions.transaction
 import java.sql.Connection
@@ -249,7 +246,7 @@ class EbicsUploadTransactionChunkEntity(id: 
EntityID<String>) : Entity<String>(i
 /**
  * Table that keeps all the payments initiated by PAIN.001.
  */
-object PaymentsTable : IntIdTable() {
+object PaymentsTable : Table() {
     val creditorIban = text("creditorIban")
     val creditorBic = text("creditorBic").nullable()
     val creditorName = text("creditorName")
@@ -260,21 +257,10 @@ object PaymentsTable : IntIdTable() {
     val amount = text("amount")
     val currency = text("currency")
     val date = long("date")
-}
+    val pmtInfId = text("pmtInfId")
+    val msgId = text("msgId")
 
-class PaymentEntity(id: EntityID<Int>) : IntEntity(id) {
-    companion object : IntEntityClass<PaymentEntity>(PaymentsTable)
-
-    var creditorIban by PaymentsTable.creditorIban
-    var creditorBic by PaymentsTable.creditorBic
-    var creditorName by PaymentsTable.creditorName
-    var debitorIban by PaymentsTable.debitorIban
-    var debitorBic by PaymentsTable.debitorBic
-    var debitorName by PaymentsTable.debitorName
-    var subject by PaymentsTable.subject
-    var amount by PaymentsTable.amount
-    var currency by PaymentsTable.currency
-    var date by PaymentsTable.date
+    override val primaryKey = PrimaryKey(pmtInfId, msgId)
 }
 
 /**
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
index ca952f0..51e8259 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt
@@ -32,6 +32,17 @@ import org.jetbrains.exposed.sql.statements.api.ExposedBlob
 import org.jetbrains.exposed.sql.transactions.transaction
 import org.w3c.dom.Document
 import tech.libeufin.sandbox.PaymentsTable.amount
+import tech.libeufin.sandbox.PaymentsTable.creditorBic
+import tech.libeufin.sandbox.PaymentsTable.creditorIban
+import tech.libeufin.sandbox.PaymentsTable.creditorName
+import tech.libeufin.sandbox.PaymentsTable.currency
+import tech.libeufin.sandbox.PaymentsTable.date
+import tech.libeufin.sandbox.PaymentsTable.debitorBic
+import tech.libeufin.sandbox.PaymentsTable.debitorIban
+import tech.libeufin.sandbox.PaymentsTable.debitorName
+import tech.libeufin.sandbox.PaymentsTable.msgId
+import tech.libeufin.sandbox.PaymentsTable.pmtInfId
+import tech.libeufin.sandbox.PaymentsTable.subject
 import tech.libeufin.util.*
 import tech.libeufin.util.XMLUtil.Companion.signEbicsResponse
 import tech.libeufin.util.ebics_h004.*
@@ -54,7 +65,9 @@ data class PainParseResult(
     val debitorName: String,
     val subject: String,
     val amount: Amount,
-    val currency: String
+    val currency: String,
+    val pmtInfId: String,
+    val msgId: String
 )
 
 open class EbicsRequestError(errorText: String, errorCode: String) :
@@ -445,7 +458,7 @@ private fun constructCamtResponse(
     val bankAccount = getBankAccountFromSubscriber(subscriber)
     transaction {
         logger.debug("Querying transactions involving: ${bankAccount.iban}")
-        PaymentEntity.find {
+        PaymentsTable.select {
             PaymentsTable.creditorIban eq bankAccount.iban or
                     (PaymentsTable.debitorIban eq bankAccount.iban)
             /**
@@ -455,17 +468,17 @@ private fun constructCamtResponse(
         }.forEach {
             history.add(
                 RawPayment(
-                    subject = it.subject,
-                    creditorIban = it.creditorIban,
-                    creditorBic = it.creditorBic,
-                    creditorName = it.creditorName,
-                    debitorIban = it.debitorIban,
-                    debitorBic = it.debitorBic,
-                    debitorName = it.debitorName,
-                    date = importDateFromMillis(it.date).toDashedDate(),
-                    amount = it.amount,
-                    currency = it.currency,
-                    uid = it.id.value
+                    subject = it[subject],
+                    creditorIban = it[creditorIban],
+                    creditorBic = it[creditorBic],
+                    creditorName = it[creditorName],
+                    debitorIban = it[debitorIban],
+                    debitorBic = it[debitorBic],
+                    debitorName = it[debitorName],
+                    date = importDateFromMillis(it[date]).toDashedDate(),
+                    amount = it[amount],
+                    currency = it[currency],
+                    uid = "${it[pmtInfId]}-${it[msgId]}"
                 )
             )
         }
@@ -496,7 +509,11 @@ private fun parsePain001(paymentRequest: String, 
initiatorName: String): PainPar
     return destructXml(painDoc) {
         requireRootElement("Document") {
             requireUniqueChildNamed("CstmrCdtTrfInitn") {
+                val msgId = requireOnlyChild {
+                    requireUniqueChildNamed("MsgId") { 
focusElement.textContent }
+                }
                 requireUniqueChildNamed("PmtInf") {
+                    val pmtInfId = requireUniqueChildNamed("PmtInfId") { 
focusElement.textContent }
                     val creditorIban = requireUniqueChildNamed("CdtTrfTxInf") {
                         requireUniqueChildNamed("CdtrAcct") {
                             requireUniqueChildNamed("id") {
@@ -527,7 +544,9 @@ private fun parsePain001(paymentRequest: String, 
initiatorName: String): PainPar
                         debitorIban = debitorIban,
                         debitorName = initiatorName,
                         creditorName = creditorName,
-                        creditorIban = creditorIban
+                        creditorIban = creditorIban,
+                        pmtInfId = pmtInfId,
+                        msgId = msgId
                     )
                 }
             }
@@ -542,15 +561,17 @@ private fun handleCct(paymentRequest: String, 
initiatorName: String) {
     val parseResult = parsePain001(paymentRequest, initiatorName)
 
     transaction {
-        PaymentEntity.new {
-            this.creditorIban = parseResult.creditorIban
-            this.creditorName = parseResult.creditorName
-            this.debitorIban = parseResult.debitorIban
-            this.debitorName = parseResult.debitorName
-            this.subject = parseResult.subject
-            this.amount = parseResult.amount.toString()
-            this.currency = parseResult.currency
-            this.date = Instant.now().toEpochMilli()
+        PaymentsTable.insert {
+            it[creditorIban] = parseResult.creditorIban
+            it[creditorName] = parseResult.creditorName
+            it[debitorIban] = parseResult.debitorIban
+            it[debitorName] = parseResult.debitorName
+            it[subject] = parseResult.subject
+            it[amount] = parseResult.amount.toString()
+            it[currency] = parseResult.currency
+            it[date] = Instant.now().toEpochMilli()
+            it[pmtInfId] = parseResult.pmtInfId
+            it[msgId] = parseResult.msgId
         }
     }
 }
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
index c1fe3d4..40c5add 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -61,6 +61,16 @@ import com.github.ajalt.clikt.core.CliktCommand
 import com.github.ajalt.clikt.core.subcommands
 import com.github.ajalt.clikt.parameters.options.default
 import com.github.ajalt.clikt.parameters.options.option
+import tech.libeufin.sandbox.PaymentsTable
+import tech.libeufin.sandbox.PaymentsTable.amount
+import tech.libeufin.sandbox.PaymentsTable.creditorBic
+import tech.libeufin.sandbox.PaymentsTable.creditorIban
+import tech.libeufin.sandbox.PaymentsTable.creditorName
+import tech.libeufin.sandbox.PaymentsTable.currency
+import tech.libeufin.sandbox.PaymentsTable.date
+import tech.libeufin.sandbox.PaymentsTable.debitorBic
+import tech.libeufin.sandbox.PaymentsTable.debitorIban
+import tech.libeufin.sandbox.PaymentsTable.debitorName
 import tech.libeufin.util.*
 
 class CustomerNotFound(id: String?) : Exception("Customer ${id} not found")
@@ -210,19 +220,19 @@ fun serverMain(dbName: String) {
             get("/admin/payments") {
                 val ret = PaymentsResponse()
                 transaction {
-                    PaymentEntity.all().forEach {
+                    PaymentsTable.selectAll().forEach {
                         ret.payments.add(
                             RawPayment(
-                                creditorIban = it.creditorIban,
-                                debitorIban = it.debitorIban,
-                                subject = it.subject,
-                                date = it.date.toHttpDateString(),
-                                amount = it.amount,
-                                creditorBic = it.creditorBic,
-                                creditorName = it.creditorName,
-                                debitorBic = it.debitorBic,
-                                debitorName = it.debitorName,
-                                currency = it.currency
+                                creditorIban = it[creditorIban],
+                                debitorIban = it[debitorIban],
+                                subject = it[PaymentsTable.subject],
+                                date = it[date].toHttpDateString(),
+                                amount = it[amount],
+                                creditorBic = it[creditorBic],
+                                creditorName = it[creditorName],
+                                debitorBic = it[debitorBic],
+                                debitorName = it[debitorName],
+                                currency = it[currency]
                             )
                         )
                     }
@@ -237,17 +247,17 @@ fun serverMain(dbName: String) {
             post("/admin/payments") {
                 val body = call.receive<RawPayment>()
                 transaction {
-                   PaymentEntity.new {
-                       creditorIban = body.creditorIban
-                       creditorBic = body.creditorBic
-                       creditorName = body.creditorName
-                       debitorIban = body.debitorIban
-                       debitorBic = body.debitorBic
-                       debitorName = body.debitorName
-                       subject = body.subject
-                       amount = body.amount
-                       currency = body.currency
-                       date = Instant.now().toEpochMilli()
+                   PaymentsTable.insert {
+                       it[creditorIban] = body.creditorIban
+                       it[creditorBic] = body.creditorBic
+                       it[creditorName] = body.creditorName
+                       it[debitorIban] = body.debitorIban
+                       it[debitorBic] = body.debitorBic
+                       it[debitorName] = body.debitorName
+                       it[subject] = body.subject
+                       it[amount] = body.amount
+                       it[currency] = body.currency
+                       it[date] = Instant.now().toEpochMilli()
                    }
                 }
                 call.respondText("Payment created")
diff --git a/sandbox/src/test/kotlin/DBTest.kt 
b/sandbox/src/test/kotlin/DBTest.kt
index 71c6ea4..2de42b6 100644
--- a/sandbox/src/test/kotlin/DBTest.kt
+++ b/sandbox/src/test/kotlin/DBTest.kt
@@ -17,15 +17,13 @@
  * <http://www.gnu.org/licenses/>
  */
 
-import org.jetbrains.exposed.sql.Database
-import org.jetbrains.exposed.sql.SchemaUtils
-import org.jetbrains.exposed.sql.StdOutSqlLogger
-import org.jetbrains.exposed.sql.addLogger
+import org.jetbrains.exposed.sql.*
 import org.jetbrains.exposed.sql.transactions.TransactionManager
 import org.jetbrains.exposed.sql.transactions.transaction
 import org.junit.Test
-import tech.libeufin.sandbox.PaymentEntity
 import tech.libeufin.sandbox.PaymentsTable
+import tech.libeufin.sandbox.PaymentsTable.msgId
+import tech.libeufin.sandbox.PaymentsTable.pmtInfId
 import tech.libeufin.util.millis
 import tech.libeufin.util.parseDashedDate
 import java.io.File
@@ -68,22 +66,24 @@ class DBTest {
         withTestDatabase {
             transaction {
                 SchemaUtils.create(PaymentsTable)
-                PaymentEntity.new {
-                    creditorIban = "earns"
-                    creditorBic = "BIC"
-                    creditorName = "Creditor Name"
-                    debitorIban = "spends"
-                    debitorBic = "BIC"
-                    debitorName = "Debitor Name"
-                    subject = "deal"
-                    amount = "EUR:1"
-                    date = LocalDateTime.now().millis()
-                    currency = "EUR"
+                PaymentsTable.insert {
+                    it[creditorIban] = "earns"
+                    it[creditorBic] = "BIC"
+                    it[creditorName] = "Creditor Name"
+                    it[debitorIban] = "spends"
+                    it[debitorBic] = "BIC"
+                    it[debitorName] = "Debitor Name"
+                    it[subject] = "deal"
+                    it[amount] = "EUR:1"
+                    it[date] = LocalDateTime.now().millis()
+                    it[currency] = "EUR"
+                    it[pmtInfId] = "0"
+                    it[msgId] = "0"
                 }
             }
             val result = transaction {
                 addLogger(StdOutSqlLogger)
-                PaymentEntity.find {
+                PaymentsTable.select {
                     PaymentsTable.date.between(
                         parseDashedDate(
                             "1970-01-01"
diff --git a/util/src/main/kotlin/JSON.kt b/util/src/main/kotlin/JSON.kt
index 0874f67..d7ddd89 100644
--- a/util/src/main/kotlin/JSON.kt
+++ b/util/src/main/kotlin/JSON.kt
@@ -38,5 +38,5 @@ data class RawPayment(
     // this (uid) field is null when RawPayment is a _requested_ payment
     // over the admin API, and it's not null when RawPayment represent
     // a database row of a settled payment.
-    val uid: Int? = null
+    val uid: String? = null
 )
\ No newline at end of file

-- 
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]