libeufin

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

commit 8528c342174ba5fad1ba82fdc79a3571f8f69198
parent 4eb4986ada887082aab2d4a64a7094b8ea2a66c0
Author: Antoine A <>
Date:   Thu, 20 Mar 2025 19:53:03 +0100

bank: locked account status

Diffstat:
Mbank/src/main/kotlin/tech/libeufin/bank/Constants.kt | 2+-
Mbank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt | 1+
Mbank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt | 26+++++++++++++++-----------
Mbank/src/test/kotlin/CoreBankApiTest.kt | 2+-
4 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Constants.kt b/bank/src/main/kotlin/tech/libeufin/bank/Constants.kt @@ -39,6 +39,6 @@ const val MAX_TOKEN_CREATION_ATTEMPTS: Int = 5 const val MAX_ACTIVE_CHALLENGES: Int = 5 // API version -const val COREBANK_API_VERSION: String = "8:0:5" +const val COREBANK_API_VERSION: String = "8:1:5" const val CONVERSION_API_VERSION: String = "0:1:0" const val INTEGRATION_API_VERSION: String = "5:0:5" diff --git a/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt b/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt @@ -57,6 +57,7 @@ enum class WithdrawalStatus { enum class AccountStatus { active, + locked, deleted } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt @@ -548,9 +548,9 @@ class AccountDAO(private val db: Database) { ,(min_cashout).frac AS min_cashout_frac ,is_public ,is_taler_exchange - ,token_creation_counter ,CASE WHEN deleted_at IS NOT NULL THEN 'deleted' + WHEN token_creation_counter > ? THEN 'locked' ELSE 'active' END as status FROM customers @@ -559,9 +559,11 @@ class AccountDAO(private val db: Database) { WHERE username=? """ ) { - setString(1, username) - oneOrNull { + setInt(1, MAX_TOKEN_CREATION_ATTEMPTS) + setString(2, username) + oneOrNull { val name = it.getString("name") + val status: AccountStatus = it.getEnum("status") AccountData( name = name, contact_data = ChallengeContactData( @@ -584,8 +586,8 @@ class AccountDAO(private val db: Database) { min_cashout = it.getOptAmount("min_cashout", db.bankCurrency), is_public = it.getBoolean("is_public"), is_taler_exchange = it.getBoolean("is_taler_exchange"), - status = it.getEnum("status"), - is_locked = it.getInt("token_creation_counter") >= MAX_TOKEN_CREATION_ATTEMPTS + status = status, + is_locked = status == AccountStatus.locked ) } } @@ -656,9 +658,9 @@ class AccountDAO(private val db: Database) { ,is_taler_exchange ,internal_payto ,bank_account_id - ,token_creation_counter ,CASE WHEN deleted_at IS NOT NULL THEN 'deleted' + WHEN token_creation_counter > ? THEN 'locked' ELSE 'active' END as status FROM bank_accounts JOIN customers @@ -666,14 +668,16 @@ class AccountDAO(private val db: Database) { WHERE ${if (params.usernameFilter != null) "name LIKE ? AND" else ""} """, { + setInt(1, MAX_TOKEN_CREATION_ATTEMPTS) if (params.usernameFilter != null) { - setString(1, params.usernameFilter) - 1 + setString(2, params.usernameFilter) + 2 } else { - 0 + 1 } } ) { + val status: AccountStatus = it.getEnum("status") AccountMinimalData( username = it.getString("username"), row_id = it.getLong("bank_account_id"), @@ -691,8 +695,8 @@ class AccountDAO(private val db: Database) { is_public = it.getBoolean("is_public"), is_taler_exchange = it.getBoolean("is_taler_exchange"), payto_uri = it.getBankPayto("internal_payto", "name", db.ctx), - status = it.getEnum("status"), - is_locked = it.getInt("token_creation_counter") >= MAX_TOKEN_CREATION_ATTEMPTS + status = status, + is_locked = status == AccountStatus.locked ) } } \ No newline at end of file diff --git a/bank/src/test/kotlin/CoreBankApiTest.kt b/bank/src/test/kotlin/CoreBankApiTest.kt @@ -264,7 +264,7 @@ class CoreBankTokenApiTest { }.assertChallenge().assertNoContent() suspend fun blockAccount() { - var counter = MAX_TOKEN_CREATION_ATTEMPTS + var counter = MAX_TOKEN_CREATION_ATTEMPTS + 1 while (counter > 0) { val challenge = client.postPw("/accounts/merchant/token") { json { "scope" to "readonly" }