libeufin

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

commit d11290fa475eb5bde452be09850738c6320feff3
parent 433c4415be8a025dfe558a9afa003703309ad9c8
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date:   Wed,  8 Apr 2020 18:53:25 +0200

payto / amount parsers (untested)

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/taler.kt | 34+++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt @@ -3,6 +3,7 @@ package tech.libeufin.nexus import io.ktor.application.call import io.ktor.http.ContentType import io.ktor.http.HttpStatusCode +import io.ktor.request.receive import io.ktor.response.respond import io.ktor.response.respondText import io.ktor.routing.Route @@ -13,7 +14,9 @@ import org.jetbrains.exposed.sql.* 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 java.util.* import kotlin.math.abs class Taler(app: Route) { @@ -69,8 +72,33 @@ class Taler(app: Route) { val row_id: Long ) + /** Helper data structures. */ + data class Payto( + val name: String, + val iban: String, + val bic: String? + ) + data class AmountWithCurrency( + val currency: String, + val amount: Amount + ) + /** Helper functions */ + fun parsePayto(paytoUri: String): Payto { + val match = Regex("payto://.*/([A-Z0-9]+)/([A-Z0-9]+)?\\?name=(\\w+)").find(paytoUri) ?: throw + NexusError(HttpStatusCode.BadRequest, "invalid payto URI ($paytoUri)") + val (iban, bic, name) = match.destructured + return Payto(name, iban, bic) + } + + fun parseAmount(amount: String): AmountWithCurrency { + val match = Regex("([A-Z][A-Z][A-Z]):([0-9]+(\\.[0-9]+)?)").find(amount) ?: throw + NexusError(HttpStatusCode.BadRequest, "invalid payto URI ($amount)") + val (currency, number) = match.destructured + return AmountWithCurrency(currency, Amount(number)) + } + private fun <T : Entity<Long>> SizedIterable<T>.orderTaler(delta: Int): List<T> { return if (delta < 0) { this.sortedByDescending { it.id } @@ -122,7 +150,11 @@ class Taler(app: Route) { /** attaches Taler endpoints to the main Web server */ init { - app.post("/taler/transfer") { + app.post("/taler/admin/add-incoming") { + val addIncomingData = call.receive<TalerAdminAddIncoming>() + /** Decompose amount and payto fields. */ + + call.respond(HttpStatusCode.OK, NexusErrorJson("Not implemented")) return@post }