libeufin

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

commit ac9f2f33489d4a40e1984d28e7eccc6e6c6bd9d1
parent 28d3c8f0608632174cb88379a75742a6c0b1d375
Author: Antoine A <>
Date:   Tue, 21 Nov 2023 14:57:08 +0000

Fix currency and currency_specification

Diffstat:
Mbank/src/main/kotlin/tech/libeufin/bank/BankIntegrationApi.kt | 3++-
Mbank/src/main/kotlin/tech/libeufin/bank/Config.kt | 30+++++++++++++++++-------------
Mbank/src/main/kotlin/tech/libeufin/bank/ConversionApi.kt | 4+++-
Mbank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt | 3++-
Mbank/src/main/kotlin/tech/libeufin/bank/Error.kt | 8++++----
Mbank/src/main/kotlin/tech/libeufin/bank/Main.kt | 4++--
Mbank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt | 13++++++++-----
Mbank/src/main/kotlin/tech/libeufin/bank/WireGatewayApi.kt | 2+-
Mbank/src/test/kotlin/helpers.kt | 2+-
9 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/bank/src/main/kotlin/tech/libeufin/bank/BankIntegrationApi.kt b/bank/src/main/kotlin/tech/libeufin/bank/BankIntegrationApi.kt @@ -32,7 +32,8 @@ import tech.libeufin.bank.WithdrawalDAO.* fun Routing.bankIntegrationApi(db: Database, ctx: BankConfig) { get("/taler-integration/config") { call.respond(TalerIntegrationConfigResponse( - currency = ctx.regional_currency + currency = ctx.regionalCurrency, + currency_specification = ctx.regionalCurrencySpec )) } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Config.kt b/bank/src/main/kotlin/tech/libeufin/bank/Config.kt @@ -37,7 +37,8 @@ data class BankConfig( /** * Main, regional currency of the bank. */ - val regional_currency: CurrencySpecification, + val regionalCurrency: String, + val regionalCurrencySpec: CurrencySpecification, /** * Restrict account registration to the administrator. */ @@ -76,7 +77,8 @@ data class BankConfig( */ val spaCaptchaURL: String?, val allowConversion: Boolean, - val fiatCurrency: CurrencySpecification?, + val fiatCurrency: String?, + val fiatCurrencySpec: CurrencySpecification?, val conversionInfo: ConversionInfo?, val tanSms: String?, val tanEmail: String?, @@ -122,27 +124,30 @@ fun TalerConfig.loadServerConfig(): ServerConfig = catchError { } fun TalerConfig.loadBankConfig(): BankConfig = catchError { - val currency = requireString("libeufin-bank", "currency") - var fiatCurrencySpecification: CurrencySpecification? = null + val regionalCurrency = requireString("libeufin-bank", "currency") + var fiatCurrency: String? = null; + var fiatCurrencySpec: CurrencySpecification? = null var conversionInfo: ConversionInfo? = null; val allowConversion = lookupBoolean("libeufin-bank", "allow_conversion") ?: false; if (allowConversion) { - val fiatCurrency = requireString("libeufin-bank", "fiat_currency"); - fiatCurrencySpecification = currencySpecificationFor(fiatCurrency) - conversionInfo = loadConversionInfo(currency, fiatCurrency) + fiatCurrency = requireString("libeufin-bank", "fiat_currency"); + fiatCurrencySpec = currencySpecificationFor(fiatCurrency) + conversionInfo = loadConversionInfo(regionalCurrency, fiatCurrency) } BankConfig( - regional_currency = currencySpecificationFor(currency), + regionalCurrency = regionalCurrency, + regionalCurrencySpec = currencySpecificationFor(regionalCurrency), restrictRegistration = lookupBoolean("libeufin-bank", "restrict_registration") ?: false, - defaultCustomerDebtLimit = requireAmount("libeufin-bank", "default_customer_debt_limit", currency), + defaultCustomerDebtLimit = requireAmount("libeufin-bank", "default_customer_debt_limit", regionalCurrency), registrationBonusEnabled = lookupBoolean("libeufin-bank", "registration_bonus_enabled") ?: false, - registrationBonus = requireAmount("libeufin-bank", "registration_bonus", currency), + registrationBonus = requireAmount("libeufin-bank", "registration_bonus", regionalCurrency), suggestedWithdrawalExchange = lookupString("libeufin-bank", "suggested_withdrawal_exchange"), - defaultAdminDebtLimit = requireAmount("libeufin-bank", "default_admin_debt_limit", currency), + defaultAdminDebtLimit = requireAmount("libeufin-bank", "default_admin_debt_limit", regionalCurrency), spaCaptchaURL = lookupString("libeufin-bank", "spa_captcha_url"), restrictAccountDeletion = lookupBoolean("libeufin-bank", "restrict_account_deletion") ?: true, allowConversion = allowConversion, - fiatCurrency = fiatCurrencySpecification, + fiatCurrency = fiatCurrency, + fiatCurrencySpec = fiatCurrencySpec, conversionInfo = conversionInfo, tanSms = lookupPath("libeufin-bank", "tan_sms"), tanEmail = lookupPath("libeufin-bank", "tan_email"), @@ -173,7 +178,6 @@ private fun TalerConfig.loadConversionInfo(currency: String, fiatCurrency: Strin private fun TalerConfig.loadCurrencySpecification(section: String): CurrencySpecification = catchError { CurrencySpecification( name = requireString(section, "name"), - currency = requireString(section, "code"), num_fractional_input_digits = requireNumber(section, "fractional_input_digits"), num_fractional_normal_digits = requireNumber(section, "fractional_normal_digits"), num_fractional_trailing_zero_digits = requireNumber(section, "fractional_trailing_zero_digits"), diff --git a/bank/src/main/kotlin/tech/libeufin/bank/ConversionApi.kt b/bank/src/main/kotlin/tech/libeufin/bank/ConversionApi.kt @@ -31,8 +31,10 @@ fun Routing.conversionApi(db: Database, ctx: BankConfig) = conditional(ctx.allow get("/conversion-info/config") { call.respond( ConversionConfig( - regional_currency = ctx.regional_currency, + regional_currency = ctx.regionalCurrency, + regional_currency_specification = ctx.regionalCurrencySpec, fiat_currency = ctx.fiatCurrency!!, + fiat_currency_specification = ctx.fiatCurrencySpec!!, cashin_ratio = ctx.conversionInfo!!.cashin_ratio, cashin_fee = ctx.conversionInfo.cashin_fee, cashin_tiny_amount = ctx.conversionInfo.cashin_tiny_amount, diff --git a/bank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt b/bank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt @@ -48,7 +48,8 @@ fun Routing.coreBankApi(db: Database, ctx: BankConfig) { get("/config") { call.respond( Config( - currency = ctx.regional_currency, + currency = ctx.regionalCurrency, + currency_specification = ctx.regionalCurrencySpec, allow_conversion = ctx.allowConversion, allow_registrations = !ctx.restrictRegistration, allow_deletions = !ctx.restrictAccountDeletion diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Error.kt b/bank/src/main/kotlin/tech/libeufin/bank/Error.kt @@ -86,15 +86,15 @@ fun badRequest( fun BankConfig.checkRegionalCurrency(amount: TalerAmount) { - if (amount.currency != regional_currency.currency) throw badRequest( - "Wrong currency: expected regional currency ${regional_currency.currency} got ${amount.currency}", + if (amount.currency != regionalCurrency) throw badRequest( + "Wrong currency: expected regional currency $regionalCurrency got ${amount.currency}", TalerErrorCode.GENERIC_CURRENCY_MISMATCH ) } fun BankConfig.checkFiatCurrency(amount: TalerAmount) { - if (amount.currency != fiatCurrency?.currency) throw badRequest( - "Wrong currency: expected fiat currency ${fiatCurrency?.currency} got ${amount.currency}", + if (amount.currency != fiatCurrency) throw badRequest( + "Wrong currency: expected fiat currency $fiatCurrency got ${amount.currency}", TalerErrorCode.GENERIC_CURRENCY_MISMATCH ) } \ No newline at end of file diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Main.kt b/bank/src/main/kotlin/tech/libeufin/bank/Main.kt @@ -312,7 +312,7 @@ class ServeBank : CliktCommand("Run libeufin-bank HTTP server", name = "serve") logger.info("Can only serve libeufin-bank via TCP") exitProcess(1) } - val db = Database(dbCfg.dbConnStr, ctx.regional_currency.currency, ctx.fiatCurrency?.currency) + val db = Database(dbCfg.dbConnStr, ctx.regionalCurrency, ctx.fiatCurrency) runBlocking { if (!maybeCreateAdminAccount(db, ctx)) // logs provided by the helper exitProcess(1) @@ -335,7 +335,7 @@ class ChangePw : CliktCommand("Change account password", name = "passwd") { val cfg = talerConfig(configFile) val ctx = cfg.loadBankConfig() val dbCfg = cfg.loadDbConfig() - val db = Database(dbCfg.dbConnStr, ctx.regional_currency.currency, ctx.fiatCurrency?.currency) + val db = Database(dbCfg.dbConnStr, ctx.regionalCurrency, ctx.fiatCurrency) runBlocking { if (!maybeCreateAdminAccount(db, ctx)) // logs provided by the helper exitProcess(1) diff --git a/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt b/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt @@ -213,7 +213,8 @@ data class BearerToken( @Serializable data class Config( - val currency: CurrencySpecification, + val currency: String, + val currency_specification: CurrencySpecification, val allow_conversion: Boolean, val allow_registrations: Boolean, val allow_deletions: Boolean @@ -224,8 +225,10 @@ data class Config( @Serializable data class ConversionConfig( - val regional_currency: CurrencySpecification, - val fiat_currency: CurrencySpecification, + val regional_currency: String, + val regional_currency_specification: CurrencySpecification, + val fiat_currency: String, + val fiat_currency_specification: CurrencySpecification, val cashin_ratio: DecimalNumber, val cashin_fee: TalerAmount, val cashin_tiny_amount: TalerAmount, @@ -243,7 +246,8 @@ data class ConversionConfig( @Serializable data class TalerIntegrationConfigResponse( - val currency: CurrencySpecification, + val currency: String, + val currency_specification: CurrencySpecification ) { val name: String = "taler-bank-integration"; val version: String = "0:0:0"; @@ -348,7 +352,6 @@ data class BankAccountGetWithdrawalResponse( @Serializable data class CurrencySpecification( val name: String, - val currency: String, val num_fractional_input_digits: Int, val num_fractional_normal_digits: Int, val num_fractional_trailing_zero_digits: Int, diff --git a/bank/src/main/kotlin/tech/libeufin/bank/WireGatewayApi.kt b/bank/src/main/kotlin/tech/libeufin/bank/WireGatewayApi.kt @@ -38,7 +38,7 @@ private val logger: Logger = LoggerFactory.getLogger("tech.libeufin.nexus") fun Routing.wireGatewayApi(db: Database, ctx: BankConfig) { get("/taler-wire-gateway/config") { call.respond(TWGConfigResponse( - currency = ctx.regional_currency.currency + currency = ctx.regionalCurrency )) return@get } diff --git a/bank/src/test/kotlin/helpers.kt b/bank/src/test/kotlin/helpers.kt @@ -55,7 +55,7 @@ fun setup( resetDatabaseTables(dbCfg, "libeufin-bank") initializeDatabaseTables(dbCfg, "libeufin-bank") val ctx = config.loadBankConfig() - Database(dbCfg.dbConnStr, ctx.regional_currency.currency, ctx.fiatCurrency?.currency).use { + Database(dbCfg.dbConnStr, ctx.regionalCurrency, ctx.fiatCurrency).use { runBlocking { ctx.conversionInfo?.run { it.conversion.updateConfig(this) } lambda(it, ctx)