[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] 02/05: POST ../collected-transactions
From: |
gnunet |
Subject: |
[libeufin] 02/05: POST ../collected-transactions |
Date: |
Sun, 10 May 2020 01:15:18 +0200 |
This is an automated email from the git hooks/post-receive script.
ms pushed a commit to branch master
in repository libeufin.
commit ce6538949e057eb9b6ba7ebff403f1f6becf21d0
Author: Marcello Stanisci <address@hidden>
AuthorDate: Fri May 8 23:46:14 2020 +0200
POST ../collected-transactions
---
nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt | 14 +++--
nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 67 +++++++++++++++++++++++
2 files changed, 75 insertions(+), 6 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
index c80ac05..4f1de25 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt
@@ -12,9 +12,7 @@ data class NexusErrorJson(
val message: String
)
-data class EbicsStandardOrderParamsJson(
- val dateRange: EbicsDateRangeJson?
-) {
+data class EbicsStandardOrderParamsJson(val dateRange: EbicsDateRangeJson?) {
fun toOrderParams(): EbicsOrderParams {
var dateRange: EbicsDateRange? = if (this.dateRange != null) {
EbicsDateRange(
@@ -29,9 +27,7 @@ data class EbicsStandardOrderParamsJson(
}
data class EbicsDateRangeJson(
- /**
- * ISO 8601 calendar dates: YEAR-MONTH(01-12)-DAY(1-31)
- */
+ /** ISO 8601 calendar dates: YEAR-MONTH(01-12)-DAY(1-31) */
val start: String?,
val end: String?
)
@@ -173,4 +169,10 @@ data class RawPayments(
data class SubmitPayment(
val uuid: String,
val transport: String?
+)
+
+data class CollectedTransaction(
+ val transport: String?,
+ val start: String?,
+ val end: String?
)
\ No newline at end of file
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
index 2d83a61..d330465 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
@@ -270,6 +270,72 @@ fun main() {
* Downloads new transactions from the bank.
*/
post("/bank-accounts/{accountid}/collected-transactions") {
+ val userId =
authenticateRequest(call.request.headers["Authorization"])
+ val body = call.receive<CollectedTransaction>()
+ when (body.transport) {
+ "ebics" -> {
+ val orderParams = EbicsStandardOrderParamsJson(
+ EbicsDateRangeJson(
+ body.start,
+ body.end
+ )
+ ).toOrderParams()
+ val subscriberData =
getSubscriberDetailsFromNexusUserId(userId)
+ when (val response =
doEbicsDownloadTransaction(client, subscriberData, "C53", orderParams)) {
+ is EbicsDownloadSuccessResult -> {
+ /**
+ * The current code is _heavily_ dependent on
the way GLS returns
+ * data. For example, GLS makes one ZIP entry
for each "Ntry" element
+ * (a bank transfer), but per the
specifications one bank can choose to
+ * return all the "Ntry" elements into one
single ZIP entry, or even unzipped
+ * at all.
+ */
+ response.orderData.unzipWithLambda {
+ logger.debug("C53 entry: ${it.second}")
+ val fileName = it.first
+ val camt53doc =
XMLUtil.parseStringIntoDom(it.second)
+ transaction {
+ RawBankTransactionEntity.new {
+ sourceFileName = fileName
+ unstructuredRemittanceInformation
= camt53doc.pickString("//*[local-name()='Ntry']//*[local-name()='Ustrd']")
+ transactionType =
camt53doc.pickString("//*[local-name()='Ntry']//*[local-name()='CdtDbtInd']")
+ currency =
camt53doc.pickString("//*[local-name()='Ntry']//*[local-name()='Amt']/@Ccy")
+ amount =
camt53doc.pickString("//*[local-name()='Ntry']//*[local-name()='Amt']")
+ 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']")
+ counterpartBic =
camt53doc.pickString("//*[local-name()='RltdAgts']//*[local-name()='BIC']")
+ }
+ }
+ }
+ call.respondText(
+ "C53 data persisted into the database
(WIP).",
+ ContentType.Text.Plain,
+ HttpStatusCode.OK
+ )
+ }
+ is EbicsDownloadBankErrorResult -> {
+ call.respond(
+ HttpStatusCode.BadGateway,
+ EbicsErrorJson(
+ EbicsErrorDetailJson(
+ "bankError",
+ response.returnCode.errorCode
+ )
+ )
+ )
+ }
+ }
+ }
+ else -> throw NexusError(
+ HttpStatusCode.NotImplemented,
+ "Bank transport ${body.transport} is not implemented"
+ )
+ }
return@post
}
/**
@@ -298,6 +364,7 @@ fun main() {
post("/bank-transports/{transportName}/sync{MSG}") {
return@post
}
+
/**
* Hello endpoint.
*/
--
To stop receiving notification emails like this one, please contact
address@hidden.