libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

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:
Mnexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt | 18++++++++++++++----
Mnexus/src/main/kotlin/tech/libeufin/nexus/server/JSON.kt | 15+++++++++++++--
Mnexus/src/main/kotlin/tech/libeufin/nexus/xlibeufinbank/XLibeufinBankNexus.kt | 10+++++++++-
Mutil/src/main/kotlin/Ebics.kt | 5++++-
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(