libeufin

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

commit 77327820d687256ed93f1cfd994955c2c2e20911
parent 0a41f246213293f159f66929000b2cd7fa92764d
Author: Antoine A <>
Date:   Tue, 11 Jun 2024 09:51:06 +0200

bank: improve support for suggested_amount

Diffstat:
MAPI_CHANGES.md | 2++
Mbank/src/main/kotlin/tech/libeufin/bank/Constants.kt | 2+-
Mbank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt | 6+++---
Mbank/src/main/kotlin/tech/libeufin/bank/api/BankIntegrationApi.kt | 1+
Mbank/src/main/kotlin/tech/libeufin/bank/api/CoreBankApi.kt | 6------
Mbank/src/main/kotlin/tech/libeufin/bank/db/WithdrawalDAO.kt | 5++++-
Mbank/src/test/kotlin/CoreBankApiTest.kt | 25+++++++++++++++++++------
7 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/API_CHANGES.md b/API_CHANGES.md @@ -57,6 +57,8 @@ This files contains all the API changes for the current release: - GET /accounts: add min_cashout field for the custom minimum cashout amount - GET /accounts/USERNAME: add min_cashout field for the custom minimum cashout amount - GET /config: new wire_transfer_fees field for transaction fees +- POST /accounts/USERNAME/withdrawals: drop card_fees field +- GET /withdrawals/WITHDRAWAL_ID: make amount optional and add suggested_amount ## bank cli diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Constants.kt b/bank/src/main/kotlin/tech/libeufin/bank/Constants.kt @@ -37,6 +37,6 @@ val RESERVED_ACCOUNTS = setOf("admin", "bank") const val IBAN_ALLOCATION_RETRY_COUNTER: Int = 5 // API version -const val COREBANK_API_VERSION: String = "4:9:1" +const val COREBANK_API_VERSION: String = "4:10:1" const val CONVERSION_API_VERSION: String = "0:1:0" const val INTEGRATION_API_VERSION: String = "2:0:3" diff --git a/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt b/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt @@ -418,8 +418,7 @@ data class BankAccountTransactionsResponse( @Serializable data class BankAccountCreateWithdrawalRequest( val amount: TalerAmount? = null, - val suggested_amount: TalerAmount? = null, - val card_fees: TalerAmount? = null + val suggested_amount: TalerAmount? = null ) // Taler withdrawal response. @@ -432,7 +431,8 @@ data class BankAccountCreateWithdrawalResponse( @Serializable data class WithdrawalPublicInfo ( val status: WithdrawalStatus, - val amount: TalerAmount, + val amount: TalerAmount? = null, + val suggested_amount: TalerAmount? = null, val username: String, val selected_reserve_pub: EddsaPublicKey? = null, val selected_exchange_account: String? = null, diff --git a/bank/src/main/kotlin/tech/libeufin/bank/api/BankIntegrationApi.kt b/bank/src/main/kotlin/tech/libeufin/bank/api/BankIntegrationApi.kt @@ -60,6 +60,7 @@ fun Routing.bankIntegrationApi(db: Database, ctx: BankConfig) { val res = db.withdrawal.setDetails( uuid, req.selected_exchange, req.reserve_pub, req.amount ) + // TODO check amount when (res) { WithdrawalSelectionResult.UnknownOperation -> throw notFound( "Withdrawal operation '$uuid' not found", diff --git a/bank/src/main/kotlin/tech/libeufin/bank/api/CoreBankApi.kt b/bank/src/main/kotlin/tech/libeufin/bank/api/CoreBankApi.kt @@ -493,12 +493,6 @@ private fun Routing.coreBankWithdrawalApi(db: Database, ctx: BankConfig) { val req = call.receive<BankAccountCreateWithdrawalRequest>() req.amount?.run(ctx::checkRegionalCurrency) req.suggested_amount?.run(ctx::checkRegionalCurrency) - if (req.card_fees != null) { - throw conflict( - "card_fees differ from wire_transfer_fees", - TalerErrorCode.END - ) - } val opId = UUID.randomUUID() when (db.withdrawal.create( username, diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/WithdrawalDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/WithdrawalDAO.kt @@ -274,6 +274,8 @@ class WithdrawalDAO(private val db: Database) { END as status ,(amount).val as amount_val ,(amount).frac as amount_frac + ,(suggested_amount).val as suggested_amount_val + ,(suggested_amount).frac as suggested_amount_frac ,selection_done ,aborted ,confirmation_done @@ -289,7 +291,8 @@ class WithdrawalDAO(private val db: Database) { stmt.oneOrNull { WithdrawalPublicInfo( status = WithdrawalStatus.valueOf(it.getString("status")), - amount = it.getAmount("amount", db.bankCurrency), + amount = it.getOptAmount("amount", db.bankCurrency), + suggested_amount = it.getOptAmount("suggested_amount", db.bankCurrency), username = it.getString("login"), selected_exchange_account = it.getString("selected_exchange_payto"), selected_reserve_pub = it.getBytes("reserve_pub")?.run(::EddsaPublicKey) diff --git a/bank/src/test/kotlin/CoreBankApiTest.kt b/bank/src/test/kotlin/CoreBankApiTest.kt @@ -1227,13 +1227,26 @@ class CoreBankWithdrawalApiTest { // GET /withdrawals/withdrawal_id @Test fun get() = bankSetup { - val amount = TalerAmount("KUDOS:9.0") // Check OK - client.postA("/accounts/merchant/withdrawals") { - json { "amount" to amount} - }.assertOkJson<BankAccountCreateWithdrawalResponse> { - client.get("/withdrawals/${it.withdrawal_id}").assertOkJson<WithdrawalPublicInfo> { - assertEquals(amount, it.amount) + for (valid in listOf( + Pair(null, null), + Pair("KUDOS:1.0", null), + Pair(null, "KUDOS:2.0") , + Pair("KUDOS:3.0", "KUDOS:4.0") + )) { + val amount = valid.first?.run(::TalerAmount) + val suggested = valid.second?.run(::TalerAmount) + client.postA("/accounts/merchant/withdrawals") { + json { + "amount" to amount + "suggested_amount" to suggested + } + }.assertOkJson<BankAccountCreateWithdrawalResponse> { + client.get("/withdrawals/${it.withdrawal_id}") + .assertOkJson<WithdrawalPublicInfo> { + assertEquals(amount, it.amount) + assertEquals(suggested, it.suggested_amount) + } } }