libeufin

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

commit 0546e80049a72fce9fb9a1a79423634d5bb31fc1
parent fec2ef057222d3f2a9c2784c8d45a42a48ad6fb0
Author: Antoine A <>
Date:   Fri, 24 Nov 2023 21:13:58 +0000

Fix conversion info API /config crash

Diffstat:
Mbank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt | 2++
Mbank/src/main/kotlin/tech/libeufin/bank/db/ConversionDAO.kt | 32+++++++++++++++++---------------
Mbank/src/test/kotlin/ConversionApiTest.kt | 2++
Mdatabase-versioning/libeufin-conversion-setup.sql | 1+
4 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt b/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt @@ -228,7 +228,9 @@ data class Config( ) { val name: String = "libeufin-bank" val version: String = "0:0:0" + // TODO as a config field val bank_name: String = "Stater Bank" + // TODO spa file config ? val show_demo_nav: Boolean = false } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/ConversionDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/ConversionDAO.kt @@ -65,28 +65,30 @@ class ConversionDAO(private val db: Database) { /** Get in-db conversion config */ suspend fun getConfig(regional: String, fiat: String): ConversionRate? = db.conn { it.transaction { conn -> + val check = conn.prepareStatement("select exists(select 1 from config where key='cashin_ratio')").oneOrNull { it.getBoolean(1) }!! + if (!check) return@transaction null val amount = conn.prepareStatement("SELECT (amount).val as amount_val, (amount).frac as amount_frac FROM config_get_amount(?) as amount"); val roundingMode = conn.prepareStatement("SELECT config_get_rounding_mode(?)"); - fun getAmount(name: String, currency: String): TalerAmount? { + fun getAmount(name: String, currency: String): TalerAmount { amount.setString(1, name) - return amount.oneOrNull { it.getAmount("amount", currency) } + return amount.oneOrNull { it.getAmount("amount", currency) }!! } - fun getRatio(name: String): DecimalNumber? = getAmount(name, "")?.run { DecimalNumber(value, frac) } - fun getMode(name: String): RoundingMode? { + fun getRatio(name: String): DecimalNumber = getAmount(name, "").run { DecimalNumber(value, frac) } + fun getMode(name: String): RoundingMode { roundingMode.setString(1, name) - return roundingMode.oneOrNull { RoundingMode.valueOf(it.getString(1)) } + return roundingMode.oneOrNull { RoundingMode.valueOf(it.getString(1)) }!! } ConversionRate( - cashin_ratio = getRatio("cashin_ratio") ?: return@transaction null, - cashin_fee = getAmount("cashin_fee", regional) ?: return@transaction null, - cashin_tiny_amount = getAmount("cashin_tiny_amount", regional) ?: return@transaction null, - cashin_rounding_mode = getMode("cashin_rounding_mode") ?: return@transaction null, - cashin_min_amount = getAmount("cashin_min_amount", fiat) ?: return@transaction null, - cashout_ratio = getRatio("cashout_ratio") ?: return@transaction null, - cashout_fee = getAmount("cashout_fee", fiat) ?: return@transaction null, - cashout_tiny_amount = getAmount("cashout_tiny_amount", fiat) ?: return@transaction null, - cashout_rounding_mode = getMode("cashout_rounding_mode") ?: return@transaction null, - cashout_min_amount = getAmount("cashout_min_amount", regional) ?: return@transaction null, + cashin_ratio = getRatio("cashin_ratio"), + cashin_fee = getAmount("cashin_fee", regional), + cashin_tiny_amount = getAmount("cashin_tiny_amount", regional), + cashin_rounding_mode = getMode("cashin_rounding_mode"), + cashin_min_amount = getAmount("cashin_min_amount", fiat), + cashout_ratio = getRatio("cashout_ratio"), + cashout_fee = getAmount("cashout_fee", fiat), + cashout_tiny_amount = getAmount("cashout_tiny_amount", fiat), + cashout_rounding_mode = getMode("cashout_rounding_mode"), + cashout_min_amount = getAmount("cashout_min_amount", regional), ) } } diff --git a/bank/src/test/kotlin/ConversionApiTest.kt b/bank/src/test/kotlin/ConversionApiTest.kt @@ -111,6 +111,8 @@ class ConversionApiTest { @Test fun noRate() = bankSetup { db -> db.conversion.clearConfig() + client.get("/conversion-info/config") + .assertNotImplemented() client.get("/conversion-info/cashin-rate") .assertBadRequest() client.get("/conversion-info/cashout-rate") diff --git a/database-versioning/libeufin-conversion-setup.sql b/database-versioning/libeufin-conversion-setup.sql @@ -8,6 +8,7 @@ LANGUAGE plpgsql AS $$ now_date BIGINT; payto_uri TEXT; BEGIN + -- TODO should send to an exchange IF NEW.local_transaction IS NOT NULL THEN SELECT transaction_date INTO now_date FROM libeufin_bank.bank_account_transactions