commit 77327820d687256ed93f1cfd994955c2c2e20911
parent 0a41f246213293f159f66929000b2cd7fa92764d
Author: Antoine A <>
Date: Tue, 11 Jun 2024 09:51:06 +0200
bank: improve support for suggested_amount
Diffstat:
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)
+ }
}
}