[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated: Implementing /history API at Sandbox.
From: |
gnunet |
Subject: |
[libeufin] branch master updated: Implementing /history API at Sandbox. |
Date: |
Sat, 07 Dec 2019 03:10:31 +0100 |
This is an automated email from the git hooks/post-receive script.
marcello pushed a commit to branch master
in repository libeufin.
The following commit(s) were added to refs/heads/master by this push:
new 90db87f Implementing /history API at Sandbox.
90db87f is described below
commit 90db87fff2b98a1c2cfa7ec8ed6e353fbf288c5d
Author: Marcello Stanisci <address@hidden>
AuthorDate: Sat Dec 7 03:10:00 2019 +0100
Implementing /history API at Sandbox.
---
nexus/src/main/kotlin/JSON.kt | 9 +----
nexus/src/main/kotlin/Main.kt | 10 +++---
.../src/main/kotlin/tech/libeufin/sandbox/DB.kt | 7 ++--
.../src/main/kotlin/tech/libeufin/sandbox/JSON.kt | 16 +++++++++
.../src/main/kotlin/tech/libeufin/sandbox/Main.kt | 39 ++++++++++++++++++++--
sandbox/src/main/python/libeufin-cli | 22 +++++++++++-
sandbox/src/test/kotlin/DbTest.kt | 30 +++++++++++++++++
7 files changed, 116 insertions(+), 17 deletions(-)
diff --git a/nexus/src/main/kotlin/JSON.kt b/nexus/src/main/kotlin/JSON.kt
index 605bade..857e0d1 100644
--- a/nexus/src/main/kotlin/JSON.kt
+++ b/nexus/src/main/kotlin/JSON.kt
@@ -2,7 +2,7 @@ package tech.libeufin.nexus
import com.google.gson.annotations.JsonAdapter
import com.squareup.moshi.JsonClass
-
+import org.joda.time.DateTime
data class EbicsBackupRequest(
@@ -57,11 +57,4 @@ data class EbicsSubscriberInfoResponse(
*/
data class EbicsSubscribersResponse(
val ebicsSubscribers: List<EbicsSubscriberInfoResponse>
-)
-
-/**
- * Error message.
- */
-data class NexusError(
- val message: String
)
\ No newline at end of file
diff --git a/nexus/src/main/kotlin/Main.kt b/nexus/src/main/kotlin/Main.kt
index 21c3b6f..159368d 100644
--- a/nexus/src/main/kotlin/Main.kt
+++ b/nexus/src/main/kotlin/Main.kt
@@ -41,6 +41,7 @@ import io.ktor.server.netty.Netty
import org.apache.xml.security.binding.xmldsig.RSAKeyValueType
import org.apache.xml.security.binding.xmldsig.SignatureType
import org.jetbrains.exposed.sql.transactions.transaction
+import org.joda.time.DateTime
import org.slf4j.LoggerFactory
import tech.libeufin.sandbox.*
import tech.libeufin.schema.ebics_h004.*
@@ -197,11 +198,12 @@ fun main() {
val id = expectId(call.parameters["id"])
val body = call.receive<EbicsDateRange>()
- val startDate = LocalDate.parse(body.start)
- val endDate = LocalDate.parse(body.end)
+ val startDate = DateTime.parse(body.start)
+ val endDate = DateTime.parse(body.end)
// will throw DateTimeParseException if strings are malformed.
+
val subscriberData = transaction {
containerInit(EbicsSubscriberEntity.findById(id) ?: throw
SubscriberNotFoundError(HttpStatusCode.NotFound))
}
@@ -213,8 +215,8 @@ fun main() {
"C52",
getNonce(128),
getGregorianDate(),
- getGregorianDate(startDate.year, startDate.monthValue,
startDate.dayOfMonth),
- getGregorianDate(endDate.year, endDate.monthValue,
endDate.dayOfMonth)
+ getGregorianDate(startDate.year,
startDate.monthOfYear, startDate.dayOfMonth),
+ getGregorianDate(endDate.year, endDate.monthOfYear,
endDate.dayOfMonth)
),
subscriberData.customerAuthPriv
)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
index e97e3f0..fcdb36e 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
@@ -112,6 +112,7 @@ open class IntIdTableWithAmount : IntIdTable() {
override fun valueFromDB(value: Any): Any {
val valueFromDB = super.valueFromDB(value)
+
try {
return when (valueFromDB) {
is BigDecimal -> valueFromDB.setScale(SCALE_TWO,
RoundingMode.UNNECESSARY)
@@ -128,11 +129,9 @@ open class IntIdTableWithAmount : IntIdTable() {
e.printStackTrace()
throw BadAmount(value)
}
-
}
override fun valueToDB(value: Any?): Any? {
-
try {
(value as BigDecimal).setScale(SCALE_TWO,
RoundingMode.UNNECESSARY)
} catch (e: Exception) {
@@ -140,6 +139,10 @@ open class IntIdTableWithAmount : IntIdTable() {
throw BadAmount(value)
}
+ if ((value as BigDecimal).compareTo(BigDecimal.ZERO) == 0) {
+ logger.error("Cannot have transactions of ZERO amount")
+ throw BadAmount(value)
+ }
return super.valueToDB(value)
}
}
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
index 2f7bcd1..d006b92 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
@@ -54,6 +54,22 @@ data class CustomerEbicsInfo(
val userId: String
)
+data class CustomerHistoryRequest(
+ val start: String,
+ val end: String
+)
+
+data class CustomerHistoryResponseElement(
+ var amount: String,
+ val subject: String,
+ val counterpart: String,
+ val date: String
+)
+
+data class CustomerHistoryResponse(
+ var history: MutableList<CustomerHistoryResponseElement> = mutableListOf()
+)
+
/**
* Wrapper type around initialization letters
* for RSA keys.
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
index 2e0bec4..11ee7c6 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -38,7 +38,10 @@ import io.ktor.routing.post
import io.ktor.routing.routing
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
+import org.jetbrains.exposed.sql.GreaterEqOp
+import org.jetbrains.exposed.sql.LessEqOp
import org.jetbrains.exposed.sql.and
+import org.jetbrains.exposed.sql.dateTimeParam
import org.jetbrains.exposed.sql.transactions.transaction
import org.joda.time.DateTime
import org.slf4j.Logger
@@ -152,10 +155,10 @@ fun main() {
bankCustomer = customerEntity
}
- for (i in 1..10) {
+ for (i in IntRange(0, 4) + IntRange(6, 10)) {
BankTransactionEntity.new {
counterpart = "IBAN"
- amount = Amount(1)
+ amount = Amount(5 - i)
subject = "transaction $i"
date = DateTime.now()
localCustomer = customerEntity
@@ -191,6 +194,38 @@ fun main() {
}
routing {
+ post("/{id}/history") {
+
+ logger.debug("/history fired up")
+
+ val req = call.receive<CustomerHistoryRequest>()
+ val startDate = DateTime.parse(req.start)
+ val endDate = DateTime.parse(req.end)
+
+ logger.debug("Fetching history from ${startDate.toString()},
to ${endDate.toString()}")
+
+ val ret = CustomerHistoryResponse()
+
+ transaction {
+
+ BankTransactionEntity.find {
+ BankTransactionsTable.date.between(startDate, endDate)
+ }.forEach {
+ ret.history.add(
+ CustomerHistoryResponseElement(
+ subject = it.subject,
+ amount = "${it.amount.toString()} EUR",
+ counterpart = it.counterpart,
+ date = it.date.toString("Y-M-d")
+ )
+ )
+ }
+ }
+
+ call.respond(ret)
+ return@post
+ }
+
get("/{id}/balance") {
val (name, balance) = transaction {
val tmp: BankCustomerEntity =
findCustomer(call.parameters["id"])
diff --git a/sandbox/src/main/python/libeufin-cli
b/sandbox/src/main/python/libeufin-cli
index f66c47f..977adc7 100755
--- a/sandbox/src/main/python/libeufin-cli
+++ b/sandbox/src/main/python/libeufin-cli
@@ -280,7 +280,7 @@ def new(obj, user_id, partner_id, system_id, host_id,
ebics_url):
partner_id = "PARTNER{}".format(salt)
url = urljoin(obj["base_url"], "/ebics/subscribers")
- body = json=dict(
+ body = dict(
ebicsURL=obj["base_url"],
userID=user_id,
partnerID=partner_id,
@@ -298,6 +298,26 @@ def new(obj, user_id, partner_id, system_id, host_id,
ebics_url):
print(resp.content.decode("utf-8"))
+@nonebics.command(help="Ask the list of transactions related to one account")
+@click.pass_obj
+@click.option(
+ "--user-id",
+ help="ID of the bank customer (no EBICS correlation implied/needed)" ,
+ required=False,
+ default=1
+)
+def history(obj, user_id):
+
+ url = urljoin(obj["bank_base_url"], f"/{user_id}/history")
+ print(url)
+ try:
+ resp = post(url, json=dict(start="2000-01-01", end="2999-12-31"))
+ except Exception:
+ print("Could not reach the bank")
+ return
+
+ print(resp.content.decode("utf-8"))
+
@nonebics.command(help="Ask the balance for a given customer of the bank")
@click.pass_obj
diff --git a/sandbox/src/test/kotlin/DbTest.kt
b/sandbox/src/test/kotlin/DbTest.kt
index d191250..1d31536 100644
--- a/sandbox/src/test/kotlin/DbTest.kt
+++ b/sandbox/src/test/kotlin/DbTest.kt
@@ -14,6 +14,7 @@ import java.math.BigInteger
import java.math.MathContext
import java.math.RoundingMode
import kotlin.math.abs
+import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertTrue
@@ -87,4 +88,33 @@ class DbTest {
}
}
}
+
+ @Test
+ fun timeBasedQuery() {
+
+
+ val NQUERIES = 10
+
+ transaction {
+
+ for (i in 1..NQUERIES) {
+ BankTransactionEntity.new {
+ amount = Amount("1")
+ counterpart = "IBAN"
+ subject = "Salary"
+ date = DateTime.now()
+ localCustomer = BankCustomerEntity.new {
+ name = "employee"
+ }
+ }
+ }
+
+ assertEquals(
+ NQUERIES,
+ BankTransactionEntity.find {
+
BankTransactionsTable.date.between(DateTime.parse("1970-01-01"),
DateTime.parse("2999-12-31"))
+ }.count()
+ )
+ }
+ }
}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
address@hidden.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [libeufin] branch master updated: Implementing /history API at Sandbox.,
gnunet <=