[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] 04/05: API migration
From: |
gnunet |
Subject: |
[libeufin] 04/05: API migration |
Date: |
Sun, 10 May 2020 01:15:20 +0200 |
This is an automated email from the git hooks/post-receive script.
ms pushed a commit to branch master
in repository libeufin.
commit d0a36f7518e7a4a8b46c4f7464a6a180f52a4cb0
Author: Marcello Stanisci <address@hidden>
AuthorDate: Sat May 9 14:06:29 2020 +0200
API migration
---
nexus/build.gradle | 2 +-
nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt | 62 ++++++-----
.../src/main/kotlin/tech/libeufin/nexus/Helpers.kt | 114 ++++++++++-----------
nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt | 21 +++-
nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 81 +++++++++++----
.../kotlin/tech/libeufin/nexus/MainDeprecated.kt | 14 ++-
nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt | 4 +-
nexus/src/test/kotlin/PainGeneration.kt | 6 +-
8 files changed, 174 insertions(+), 130 deletions(-)
diff --git a/nexus/build.gradle b/nexus/build.gradle
index ff58a78..b2a264a 100644
--- a/nexus/build.gradle
+++ b/nexus/build.gradle
@@ -16,7 +16,7 @@ plugins {
sourceSets {
main.kotlin.srcDirs = ["src/main/kotlin"]
- main.kotlin.excludes = ["**/MainDeprecated.kt"]
+ main.kotlin.excludes = ["**/MainDeprecated.kt", "**/taler.kt"]
}
task installToPrefix(type: Copy) {
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
index ba5f7f8..8d47c84 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/DB.kt
@@ -5,8 +5,6 @@ import org.jetbrains.exposed.dao.*
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.TransactionManager
import org.jetbrains.exposed.sql.transactions.transaction
-import tech.libeufin.nexus.BankAccountsTable.entityId
-import tech.libeufin.nexus.BankAccountsTable.primaryKey
import tech.libeufin.util.amount
import java.sql.Connection
@@ -19,7 +17,7 @@ const val ID_MAX_LENGTH = 50
* in the PAIN-table.
*/
object TalerRequestedPayments: LongIdTable() {
- val preparedPayment = reference("payment", Pain001Table)
+ val preparedPayment = reference("payment", PreparedPaymentsTable)
val requestUId = text("request_uid")
val amount = text("amount")
val exchangeBaseUrl = text("exchange_base_url")
@@ -34,7 +32,7 @@ object TalerRequestedPayments: LongIdTable() {
class TalerRequestedPaymentEntity(id: EntityID<Long>) : LongEntity(id) {
companion object :
LongEntityClass<TalerRequestedPaymentEntity>(TalerRequestedPayments)
- var preparedPayment by Pain001Entity referencedOn
TalerRequestedPayments.preparedPayment
+ var preparedPayment by PreparedPaymentEntity referencedOn
TalerRequestedPayments.preparedPayment
var requestUId by TalerRequestedPayments.requestUId
var amount by TalerRequestedPayments.amount
var exchangeBaseUrl by TalerRequestedPayments.exchangeBaseUrl
@@ -91,11 +89,9 @@ object RawBankTransactionsTable : LongIdTable() {
val transactionType = text("transactionType") /* DBIT or CRDT */
val currency = text("currency")
val amount = text("amount")
- val creditorIban = text("creditorIban")
- val creditorName = text("creditorBic")
- val debitorIban = text("debitorIban")
- val debitorName = text("debitorName")
+ val counterpartIban = text("counterpartIban")
val counterpartBic = text("counterpartBic")
+ val counterpartName = text("counterpartName")
val bookingDate = long("bookingDate")
val status = text("status") // BOOK or other.
}
@@ -107,11 +103,9 @@ class RawBankTransactionEntity(id: EntityID<Long>) :
LongEntity(id) {
var transactionType by RawBankTransactionsTable.transactionType
var currency by RawBankTransactionsTable.currency
var amount by RawBankTransactionsTable.amount
- var debitorIban by RawBankTransactionsTable.debitorIban
- var debitorName by RawBankTransactionsTable.debitorName
- var creditorName by RawBankTransactionsTable.creditorName
- var creditorIban by RawBankTransactionsTable.creditorIban
+ var counterpartIban by RawBankTransactionsTable.counterpartIban
var counterpartBic by RawBankTransactionsTable.counterpartBic
+ var counterpartName by RawBankTransactionsTable.counterpartName
var bookingDate by RawBankTransactionsTable.bookingDate
var nexusUser by NexusUserEntity referencedOn
RawBankTransactionsTable.nexusUser
var status by RawBankTransactionsTable.status
@@ -119,10 +113,12 @@ class RawBankTransactionEntity(id: EntityID<Long>) :
LongEntity(id) {
/**
* Represent a prepare payment.
*/
-object Pain001Table : IdTable<String>() {
+object PreparedPaymentsTable : IdTable<String>() {
+ /** the UUID representing this payment in the system */
override val id = BankAccountsTable.varchar("id",
ID_MAX_LENGTH).entityId().primaryKey()
val paymentId = long("paymentId")
- val fileDate = long("fileDate")
+ val preparationDate = long("preparationDate")
+ val submissionDate = long("submissionDate").nullable()
val sum = amount("sum")
val currency = varchar("currency", length = 3).default("EUR")
val endToEndId = long("EndToEndId")
@@ -139,25 +135,27 @@ object Pain001Table : IdTable<String>() {
* this state can be reached when the payment gets listed in a CRZ
* response OR when the payment doesn't show up in a C52/C53 response */
val invalid = bool("invalid").default(false)
+ /** never really used, but it makes sure the user always exists */
val nexusUser = reference("nexusUser", NexusUsersTable)
}
-class Pain001Entity(id: EntityID<String>) : Entity<String>(id) {
- companion object : EntityClass<String, Pain001Entity>(Pain001Table)
- var paymentId by Pain001Table.paymentId
- var date by Pain001Table.fileDate
- var sum by Pain001Table.sum
- var currency by Pain001Table.currency
- var debitorIban by Pain001Table.debitorIban
- var debitorBic by Pain001Table.debitorBic
- var debitorName by Pain001Table.debitorName
- var endToEndId by Pain001Table.endToEndId
- var subject by Pain001Table.subject
- var creditorIban by Pain001Table.creditorIban
- var creditorBic by Pain001Table.creditorBic
- var creditorName by Pain001Table.creditorName
- var submitted by Pain001Table.submitted
- var invalid by Pain001Table.invalid
- var nexusUser by NexusUserEntity referencedOn Pain001Table.nexusUser
+class PreparedPaymentEntity(id: EntityID<String>) : Entity<String>(id) {
+ companion object : EntityClass<String,
PreparedPaymentEntity>(PreparedPaymentsTable)
+ var paymentId by PreparedPaymentsTable.paymentId
+ var preparationDate by PreparedPaymentsTable.preparationDate
+ var submissionDate by PreparedPaymentsTable.submissionDate
+ var sum by PreparedPaymentsTable.sum
+ var currency by PreparedPaymentsTable.currency
+ var debitorIban by PreparedPaymentsTable.debitorIban
+ var debitorBic by PreparedPaymentsTable.debitorBic
+ var debitorName by PreparedPaymentsTable.debitorName
+ var endToEndId by PreparedPaymentsTable.endToEndId
+ var subject by PreparedPaymentsTable.subject
+ var creditorIban by PreparedPaymentsTable.creditorIban
+ var creditorBic by PreparedPaymentsTable.creditorBic
+ var creditorName by PreparedPaymentsTable.creditorName
+ var submitted by PreparedPaymentsTable.submitted
+ var invalid by PreparedPaymentsTable.invalid
+ var nexusUser by NexusUserEntity referencedOn
PreparedPaymentsTable.nexusUser
}
/**
@@ -236,7 +234,7 @@ fun dbCreateTables() {
transaction {
addLogger(StdOutSqlLogger)
SchemaUtils.create(
- Pain001Table,
+ PreparedPaymentsTable,
EbicsSubscribersTable,
BankAccountsTable,
RawBankTransactionsTable,
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
index 7994558..2b5eb66 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
@@ -1,11 +1,9 @@
package tech.libeufin.nexus
-import io.ktor.application.ApplicationCall
import io.ktor.http.HttpStatusCode
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.transactions.transaction
import org.joda.time.DateTime
-import org.joda.time.format.DateTimeFormat
import tech.libeufin.util.Amount
import tech.libeufin.util.CryptoUtil
import tech.libeufin.util.EbicsClientSubscriberDetails
@@ -61,33 +59,19 @@ fun extractFirstBic(bankCodes:
List<EbicsTypes.AbstractBankCode>?): String? {
return null
}
-fun getBankAccount(id: String): BankAccountEntity {
- return transaction {
- BankAccountEntity.findById(id)
- } ?: throw NexusError(
- HttpStatusCode.NotFound,
- "Bank account '$id' not found"
- )
-}
-
/**
- * Given a nexus user id, returns the _list_ of bank accounts associated to it.
- *
- * @param id the subscriber id
- * @return the bank account associated with this user. Can/should be adapted
to
- * return multiple bank accounts.
+ * Retrieve bank account details, only if user owns it.
*/
-fun getBankAccountFromNexusUserId(id: String): BankAccountEntity {
- logger.debug("Looking up bank account of user '$id'")
- val map = transaction {
- BankAccountMapEntity.find {
- BankAccountMapsTable.nexusUser eq id
- }
- }.firstOrNull() ?: throw NexusError(
+fun getBankAccount(userId: String, accountId: String): BankAccountEntity {
+ return transaction {
+ val bankAccountMap = BankAccountMapEntity.find {
+ BankAccountMapsTable.nexusUser eq userId
+ }.firstOrNull() ?: throw NexusError(
HttpStatusCode.NotFound,
- "Such user '$id' does not have any bank account associated"
- )
- return map.bankAccount
+ "Bank account '$accountId' not found"
+ )
+ bankAccountMap.bankAccount
+ }
}
/**
@@ -165,7 +149,7 @@ fun getSubscriberDetailsFromNexusUserId(id: String):
EbicsClientSubscriberDetail
* Create a PAIN.001 XML document according to the input data.
* Needs to be called within a transaction block.
*/
-fun createPain001document(pain001Entity: Pain001Entity): String {
+fun createPain001document(paymentData: PreparedPaymentEntity): String {
/**
* Every PAIN.001 document contains at least three IDs:
*
@@ -181,8 +165,8 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
*/
val debitorBankAccountLabel = transaction {
val debitorBankAcount = BankAccountEntity.find {
- BankAccountsTable.iban eq pain001Entity.debitorIban and
- (BankAccountsTable.bankCode eq pain001Entity.debitorBic)
+ BankAccountsTable.iban eq paymentData.debitorIban and
+ (BankAccountsTable.bankCode eq paymentData.debitorBic)
}.firstOrNull() ?: throw NexusError(
HttpStatusCode.NotFound,
"Please download bank accounts details first (HTD)"
@@ -198,11 +182,11 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
element("CstmrCdtTrfInitn") {
element("GrpHdr") {
element("MsgId") {
- text(pain001Entity.id.value.toString())
+ text(paymentData.id.value.toString())
}
element("CreDtTm") {
val dateMillis = transaction {
- pain001Entity.date
+ paymentData.preparationDate
}
val dateFormatter =
DateTimeFormatter.ISO_OFFSET_DATE_TIME
val instant = Instant.ofEpochSecond(dateMillis / 1000)
@@ -213,7 +197,7 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
text("1")
}
element("CtrlSum") {
- text(pain001Entity.sum.toString())
+ text(paymentData.sum.toString())
}
element("InitgPty/Nm") {
text(debitorBankAccountLabel)
@@ -221,7 +205,7 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
}
element("PmtInf") {
element("PmtInfId") {
- text(pain001Entity.id.value.toString())
+ text(paymentData.id.value.toString())
}
element("PmtMtd") {
text("TRF")
@@ -233,14 +217,14 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
text("1")
}
element("CtrlSum") {
- text(pain001Entity.sum.toString())
+ text(paymentData.sum.toString())
}
element("PmtTpInf/SvcLvl/Cd") {
text("SEPA")
}
element("ReqdExctnDt") {
val dateMillis = transaction {
- pain001Entity.date
+ paymentData.preparationDate
}
text(DateTime(dateMillis).toString("Y-MM-dd"))
}
@@ -248,10 +232,10 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
text(debitorBankAccountLabel)
}
element("DbtrAcct/Id/IBAN") {
- text(pain001Entity.debitorIban)
+ text(paymentData.debitorIban)
}
element("DbtrAgt/FinInstnId/BIC") {
- text(pain001Entity.debitorBic)
+ text(paymentData.debitorBic)
}
element("ChrgBr") {
text("SLEV")
@@ -264,20 +248,20 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
}
}
element("Amt/InstdAmt") {
- attribute("Ccy", pain001Entity.currency)
- text(pain001Entity.sum.toString())
+ attribute("Ccy", paymentData.currency)
+ text(paymentData.sum.toString())
}
element("CdtrAgt/FinInstnId/BIC") {
- text(pain001Entity.creditorBic)
+ text(paymentData.creditorBic)
}
element("Cdtr/Nm") {
- text(pain001Entity.creditorName)
+ text(paymentData.creditorName)
}
element("CdtrAcct/Id/IBAN") {
- text(pain001Entity.creditorIban)
+ text(paymentData.creditorIban)
}
element("RmtInf/Ustrd") {
- text(pain001Entity.subject)
+ text(paymentData.subject)
}
}
}
@@ -287,6 +271,19 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
return s
}
+/**
+ * Retrieve prepared payment from database, raising exception
+ * if not found.
+ */
+fun getPreparedPayment(uuid: String): PreparedPaymentEntity {
+ return transaction {
+ PreparedPaymentEntity.findById(uuid)
+ } ?: throw NexusError(
+ HttpStatusCode.NotFound,
+ "Payment '$uuid' not found"
+ )
+}
+
/**
* Insert one row in the database, and leaves it marked as non-submitted.
* @param debtorAccountId the mnemonic id assigned by the bank to one bank
@@ -294,19 +291,20 @@ fun createPain001document(pain001Entity: Pain001Entity):
String {
* it will be the account whose money will pay the wire transfer being defined
* by this pain document.
*/
-fun createPain001entity(entry: Pain001Data, nexusUser: NexusUserEntity):
Pain001Entity {
+fun addPreparedPayment(paymentData: Pain001Data, nexusUser: NexusUserEntity):
PreparedPaymentEntity {
val randomId = Random().nextLong()
return transaction {
- Pain001Entity.new(randomId.toString()) {
- subject = entry.subject
- sum = entry.sum
- debitorIban = entry.debitorIban
- debitorBic = entry.debitorBic
- debitorName = entry.debitorName
- creditorName = entry.creditorName
- creditorBic = entry.creditorBic
- creditorIban = entry.creditorIban
- date = DateTime.now().millis
+ val debitorAccount = getBankAccount(nexusUser.id.value,
paymentData.debitorAccount)
+ PreparedPaymentEntity.new(randomId.toString()) {
+ subject = paymentData.subject
+ sum = paymentData.sum
+ debitorIban = debitorAccount.iban
+ debitorBic = debitorAccount.bankCode
+ debitorName = debitorAccount.accountHolder
+ creditorName = paymentData.creditorName
+ creditorBic = paymentData.creditorBic
+ creditorIban = paymentData.creditorIban
+ preparationDate = DateTime.now().millis
paymentId = randomId
endToEndId = randomId
this.nexusUser = nexusUser
@@ -331,14 +329,6 @@ fun extractNexusUser(param: String?): NexusUserEntity {
}
}
-/* Needs a transaction{} block to be called */
-fun expectAcctidTransaction(param: String?): BankAccountEntity {
- if (param == null) {
- throw NexusError(HttpStatusCode.BadRequest, "Null Acctid given")
- }
- return BankAccountEntity.findById(param) ?: throw
NexusError(HttpStatusCode.NotFound, "Account: $param not found")
-}
-
/**
* This helper function parses a Authorization:-header line, decode the
credentials
* and returns a pair made of username and hashed (sha256) password. The
hashed value
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
index eca9988..b0613b4 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
@@ -95,6 +95,19 @@ data class RawPayments(
* API types (used as requests/responses types) *
*************************************************/
+/** Response type of "GET /prepared-payments/{uuid}" */
+data class PaymentStatus(
+ val uuid: String,
+ val submitted: Boolean,
+ val creditorIban: String,
+ val creditorBic: String,
+ val creditorName: String,
+ val amount: String,
+ val subject: String,
+ val submissionDate: String,
+ val preparationDate: String
+)
+
/** Response type of "GET /collected-transactions" */
data class Transaction(
val account: String,
@@ -106,6 +119,10 @@ data class Transaction(
val date: String
)
+data class Transactions(
+ val transactions: MutableList<Transaction>
+)
+
/** Request type of "POST /prepared-payments/submit" */
data class SubmitPayment(
val uuid: String,
@@ -167,9 +184,7 @@ data class Pain001Data(
val creditorIban: String,
val creditorBic: String,
val creditorName: String,
- val debitorIban: String,
- val debitorBic: String,
- val debitorName: String,
+ val debitorAccount: String,
val sum: Amount,
val currency: String,
val subject: String
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
index cdb19f7..1a33c5f 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
@@ -50,12 +50,8 @@ import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.slf4j.event.Level
import tech.libeufin.util.*
-import tech.libeufin.util.ebics_h004.HTDResponseOrderData
import java.text.DateFormat
-import java.text.SimpleDateFormat
-import java.util.*
import java.util.zip.InflaterInputStream
-import javax.crypto.EncryptedPrivateKeyInfo
import javax.sql.rowset.serial.SerialBlob
data class NexusError(val statusCode: HttpStatusCode, val reason: String) :
Exception()
@@ -187,11 +183,10 @@ fun main() {
post("/bank-accounts/{accountid}/prepared-payments/submit") {
val userId =
authenticateRequest(call.request.headers["Authorization"])
val body = call.receive<SubmitPayment>()
- val preparedPayment = transaction {
- Pain001Entity.findById(body.uuid)
- } ?: throw NexusError(
- HttpStatusCode.NotFound,
- "Could not find prepared payment: ${body.uuid}"
+ val preparedPayment = getPreparedPayment(body.uuid)
+ if (preparedPayment.nexusUser.id.value != userId) throw
NexusError(
+ HttpStatusCode.Forbidden,
+ "No rights over such payment"
)
if (preparedPayment.submitted) {
throw NexusError(
@@ -213,7 +208,7 @@ fun main() {
)
/** mark payment as 'submitted' */
transaction {
- val payment = Pain001Entity.findById(body.uuid) ?:
throw NexusError(
+ val payment =
PreparedPaymentEntity.findById(body.uuid) ?: throw NexusError(
HttpStatusCode.InternalServerError,
"Severe internal error: could not find payment
in DB after having submitted it to the bank"
)
@@ -224,6 +219,7 @@ fun main() {
ContentType.Text.Plain,
HttpStatusCode.OK
)
+ preparedPayment.submissionDate = DateTime.now().millis
}
else -> throw NexusError(
HttpStatusCode.NotImplemented,
@@ -236,6 +232,25 @@ fun main() {
* Shows information about one particular prepared payment.
*/
get("/bank-accounts/{accountid}/prepared-payments/{uuid}") {
+ val userId =
authenticateRequest(call.request.headers["Authorization"])
+ val preparedPayment =
getPreparedPayment(expectId(call.parameters["uuid"]))
+ if (preparedPayment.nexusUser.id.value != userId) throw
NexusError(
+ HttpStatusCode.Forbidden,
+ "No rights over such payment"
+ )
+ call.respond(
+ PaymentStatus(
+ uuid = preparedPayment.id.value,
+ submitted = preparedPayment.submitted,
+ creditorName = preparedPayment.creditorName,
+ creditorBic = preparedPayment.creditorBic,
+ creditorIban = preparedPayment.creditorIban,
+ amount =
"${preparedPayment.sum}:${preparedPayment.currency}",
+ subject = preparedPayment.subject,
+ submissionDate =
DateTime(preparedPayment.submissionDate).toDashedDate(),
+ preparationDate =
DateTime(preparedPayment.preparationDate).toDashedDate()
+ )
+ )
return@get
}
/**
@@ -243,17 +258,15 @@ fun main() {
*/
post("/bank-accounts/{accountid}/prepared-payments") {
val userId =
authenticateRequest(call.request.headers["Authorization"])
+ val bankAccount = getBankAccount(userId,
expectId(call.parameters["accountid"]))
val body = call.receive<PreparedPaymentRequest>()
- val debitBankAccount =
getBankAccount(expectId(call.parameters["accountid"]))
val amount = parseAmount(body.amount)
- val paymentEntity = createPain001entity(
+ val paymentEntity = addPreparedPayment(
Pain001Data(
creditorIban = body.iban,
creditorBic = body.bic,
creditorName = body.name,
- debitorIban = debitBankAccount.iban,
- debitorBic = debitBankAccount.bankCode,
- debitorName = debitBankAccount.accountHolder,
+ debitorAccount = bankAccount.id.value,
sum = amount.amount,
currency = amount.currency,
subject = body.subject
@@ -304,10 +317,24 @@ fun main() {
status =
camt53doc.pickString("//*[local-name()='Ntry']//*[local-name()='Sts']")
bookingDate =
parseDashedDate(camt53doc.pickString("//*[local-name()='BookgDt']//*[local-name()='Dt']")).millis
nexusUser =
extractNexusUser(userId)
- creditorName =
camt53doc.pickString("//*[local-name()='RltdPties']//*[local-name()='Dbtr']//*[local-name()='Nm']")
- creditorIban =
camt53doc.pickString("//*[local-name()='CdtrAcct']//*[local-name()='IBAN']")
- debitorName =
camt53doc.pickString("//*[local-name()='RltdPties']//*[local-name()='Dbtr']//*[local-name()='Nm']")
- debitorIban =
camt53doc.pickString("//*[local-name()='DbtrAcct']//*[local-name()='IBAN']")
+ counterpartIban =
camt53doc.pickString(
+ if (this.transactionType ==
"DBIT") {
+ // counterpart is credit
+
"//*[local-name()='CdtrAcct']//*[local-name()='IBAN']"
+ } else {
+ // counterpart is debit
+
"//*[local-name()='DbtrAcct']//*[local-name()='IBAN']"
+ }
+ )
+ counterpartName =
camt53doc.pickString(
+
"//*[local-name()='RltdPties']//*[local-name()='${
+ if (this.transactionType ==
"DBIT") {
+ "Cdtr"
+ } else {
+ "Dbtr"
+ }
+ }']//*[local-name()='Nm']"
+ )
counterpartBic =
camt53doc.pickString("//*[local-name()='RltdAgts']//*[local-name()='BIC']")
}
}
@@ -345,7 +372,23 @@ fun main() {
val userId =
authenticateRequest(call.request.headers["Authorization"])
val start = call.request.queryParameters["start"]
val end = call.request.queryParameters["end"]
+ val ret = Transactions()
+ transaction {
+ RawBankTransactionEntity.find {
+ RawBankTransactionsTable.nexusUser eq userId and
+ RawBankTransactionsTable.bookingDate.between(
+ parseDashedDate(start ?: "1970-01-01"),
+ parseDashedDate(end ?:
DateTime.now().toDashedDate())
+ )
+ }.forEach {
+ ret.transactions.add(
+ Transaction(
+ account = it.
+ )
+ )
+ }
+ }
return@get
}
/**
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
index 547f0b2..f589d76 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
@@ -46,8 +46,6 @@ import kotlinx.io.core.ExperimentalIoApi
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.transactions.transaction
import org.joda.time.DateTime
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
import org.slf4j.event.Level
import tech.libeufin.util.*
import tech.libeufin.util.ebics_h004.HTDResponseOrderData
@@ -258,8 +256,8 @@ fun main() {
BankAccountMapsTable.nexusUser eq nexusUser.id
}
bankAccountsMap.forEach {
- Pain001Entity.find {
- Pain001Table.debitorIban eq it.bankAccount.iban
+ PreparedPaymentEntity.find {
+ PreparedPaymentsTable.debitorIban eq
it.bankAccount.iban
}.forEach {
ret.payments.add(
RawPayment(
@@ -287,7 +285,7 @@ fun main() {
)
}
}
- createPain001entity(pain001data, nexusUser)
+ addPreparedPayment(pain001data, nexusUser)
call.respondText(
"Payment instructions persisted in DB",
ContentType.Text.Plain, HttpStatusCode.OK
@@ -560,8 +558,8 @@ fun main() {
post("/ebics/execute-payments") {
val (paymentRowId, painDoc, subscriber) = transaction {
- val entity = Pain001Entity.find {
- (Pain001Table.submitted eq false) and
(Pain001Table.invalid eq false)
+ val entity = PreparedPaymentEntity.find {
+ (PreparedPaymentsTable.submitted eq false) and
(PreparedPaymentsTable.invalid eq false)
}.firstOrNull() ?: throw
NexusError(HttpStatusCode.Accepted, reason = "No ready payments found")
Triple(entity.id, createPain001document(entity),
entity.nexusUser.ebicsSubscriber)
}
@@ -581,7 +579,7 @@ fun main() {
)
/* flow here == no errors occurred */
transaction {
- val payment = Pain001Entity.findById(paymentRowId) ?:
throw NexusError(
+ val payment = PreparedPaymentEntity.findById(paymentRowId)
?: throw NexusError(
HttpStatusCode.InternalServerError,
"Severe internal error: could not find payment in DB
after having submitted it to the bank"
)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
index 766e4b4..8a97107 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
@@ -243,7 +243,7 @@ class Taler(app: Route) {
)
}
}
- val pain001 = createPain001entity(
+ val pain001 = addPreparedPayment(
Pain001Data(
creditorIban = creditorData.iban,
creditorBic = creditorData.bic,
@@ -368,7 +368,7 @@ class Taler(app: Route) {
TalerIncomingPaymentEntity.find {
TalerIncomingPayments.refunded eq false and
(TalerIncomingPayments.valid eq false)
}.forEach {
- createPain001entity(
+ addPreparedPayment(
Pain001Data(
creditorName = it.payment.debitorName,
creditorIban = it.payment.debitorIban,
diff --git a/nexus/src/test/kotlin/PainGeneration.kt
b/nexus/src/test/kotlin/PainGeneration.kt
index 4eef6d8..e257c50 100644
--- a/nexus/src/test/kotlin/PainGeneration.kt
+++ b/nexus/src/test/kotlin/PainGeneration.kt
@@ -14,14 +14,14 @@ class PainTest {
Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver =
"org.h2.Driver")
transaction {
SchemaUtils.create(BankAccountsTable)
- SchemaUtils.create(Pain001Table)
+ SchemaUtils.create(PreparedPaymentsTable)
SchemaUtils.create(NexusUsersTable)
BankAccountEntity.new(id = "acctid") {
accountHolder = "Account Holder"
iban = "DEBIT IBAN"
bankCode = "DEBIT BIC"
}
- Pain001Entity.new {
+ PreparedPaymentEntity.new {
sum = Amount(1)
debitorIban = "DEBIT IBAN"
debitorBic = "DEBIT BIC"
@@ -42,7 +42,7 @@ class PainTest {
@Test
fun testPain001document() {
transaction {
- val s = createPain001document(Pain001Entity.all().first())
+ val s = createPain001document(PreparedPaymentEntity.all().first())
println(s)
}
}
--
To stop receiving notification emails like this one, please contact
address@hidden.