commit f1b7567a31e2a3496fe9d1a6887d3ea599414895
parent 0c6663d76ac97a741c47a710dd3def40c0921021
Author: MS <ms@taler.net>
Date: Mon, 10 Jul 2023 15:11:26 +0200
Fetching transactions from the bank.
Nexus can receive time ranges from its JSON interface.
Diffstat:
4 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
@@ -59,10 +59,7 @@ import tech.libeufin.util.ebics_h005.Ebics3Request
import java.io.ByteArrayOutputStream
import java.security.interfaces.RSAPrivateCrtKey
import java.security.interfaces.RSAPublicKey
-import java.time.Instant
-import java.time.LocalDateTime
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
+import java.time.*
import java.time.format.DateTimeFormatter
import java.util.*
import javax.crypto.EncryptedPrivateKeyInfo
@@ -676,6 +673,19 @@ class EbicsBankConnectionProtocol: BankConnectionProtocol {
}
// Figuring out what time range to put in the fetch instructions.
when (fetchSpec) {
+ is FetchSpecTimeRangeJson -> {
+ // the parse() method defaults to the YYYY-MM-DD format.
+ // If parsing fails, the global catcher intervenes.
+ val start: LocalDate = LocalDate.parse(fetchSpec.start)
+ val end: LocalDate = LocalDate.parse(fetchSpec.end)
+ val p = EbicsStandardOrderParams(
+ EbicsDateRange(
+ start = start.atStartOfDay().atZone(ZoneId.systemDefault()),
+ end = end.atStartOfDay().atZone(ZoneId.systemDefault())
+ )
+ )
+ addForLevel(fetchSpec.level, p)
+ }
is FetchSpecLatestJson -> {
val p = EbicsStandardOrderParams()
addForLevel(fetchSpec.level, p)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt
@@ -202,11 +202,14 @@ enum class FetchLevel(@get:JsonValue val jsonName: String) {
JsonSubTypes.Type(value = FetchSpecLatestJson::class, name = "latest"),
JsonSubTypes.Type(value = FetchSpecAllJson::class, name = "all"),
JsonSubTypes.Type(value = FetchSpecPreviousDaysJson::class, name = "previous-days"),
- JsonSubTypes.Type(value = FetchSpecSinceLastJson::class, name = "since-last")
+ JsonSubTypes.Type(value = FetchSpecSinceLastJson::class, name = "since-last"),
+ JsonSubTypes.Type(value = FetchSpecTimeRangeJson::class, name = "time-range")
)
abstract class FetchSpecJson(
val level: FetchLevel,
- val bankConnection: String?
+ val bankConnection: String?,
+ val start: String? = null,
+ val end: String? = null
)
@JsonTypeName("latest")
@@ -218,6 +221,14 @@ class FetchSpecAllJson(level: FetchLevel, bankConnection: String?) : FetchSpecJs
@JsonTypeName("since-last")
class FetchSpecSinceLastJson(level: FetchLevel, bankConnection: String?) : FetchSpecJson(level, bankConnection)
+@JsonTypeName("time-range")
+class FetchSpecTimeRangeJson(
+ level: FetchLevel,
+ start: String,
+ end: String,
+ bankConnection: String?
+) : FetchSpecJson(level, bankConnection)
+
@JsonTypeName("previous-days")
class FetchSpecPreviousDaysJson(level: FetchLevel, bankConnection: String?, val number: Int) :
FetchSpecJson(level, bankConnection)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/xlibeufinbank/XLibeufinBankNexus.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/xlibeufinbank/XLibeufinBankNexus.kt
@@ -27,6 +27,7 @@ import tech.libeufin.nexus.server.*
import tech.libeufin.util.*
import java.net.MalformedURLException
import java.net.URL
+import java.time.LocalDate
// Gets Sandbox URL and credentials, taking the connection name as input.
fun getXLibeufinBankCredentials(conn: NexusBankConnectionEntity): XLibeufinBankTransport {
@@ -235,7 +236,7 @@ class XlibeufinBankConnectionProtocol : BankConnectionProtocol {
}
override suspend fun fetchTransactions(
- fetchSpec: FetchSpecJson,
+ fetchSpec: FetchSpecJson, // FIXME: handle time range.
client: HttpClient,
bankConnectionId: String,
accountId: String
@@ -261,6 +262,13 @@ class XlibeufinBankConnectionProtocol : BankConnectionProtocol {
baseUrl.path.dropLastWhile { it == '/' },
"accounts/${credentials.username}/transactions")
when (fetchSpec) {
+ is FetchSpecTimeRangeJson -> {
+ // the parse() method defaults to the YYYY-MM-DD format.
+ val start: LocalDate = LocalDate.parse(fetchSpec.start)
+ val end: LocalDate = LocalDate.parse(fetchSpec.end)
+ this.parameters["from_ms"] = start.toString()
+ this.parameters["to_ms"] = end.toString()
+ }
// Gets the last 5 transactions
is FetchSpecLatestJson -> {
// Do nothing, the bare endpoint gets the last 5 txs by default.
diff --git a/util/src/main/kotlin/Ebics.kt b/util/src/main/kotlin/Ebics.kt
@@ -58,7 +58,10 @@ data class EbicsProtocolError(
val ebicsTechnicalCode: EbicsReturnCode? = null
) : Exception(reason)
-data class EbicsDateRange(val start: ZonedDateTime, val end: ZonedDateTime)
+data class EbicsDateRange(
+ val start: ZonedDateTime,
+ val end: ZonedDateTime
+)
sealed class EbicsOrderParams
data class EbicsStandardOrderParams(