libeufin

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

commit cd98976b6472a8e8bf5eecb0e1ee0f7b67445350
parent 8cdd76860d5b130ee4e001946a2702488f2be196
Author: Antoine A <>
Date:   Tue, 23 Jul 2024 12:14:58 +0200

common: clean SQL enum extraction logic

Diffstat:
Mbank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt | 8++++----
Mbank/src/main/kotlin/tech/libeufin/bank/db/CashoutDAO.kt | 2+-
Mbank/src/main/kotlin/tech/libeufin/bank/db/ConversionDAO.kt | 7++-----
Mbank/src/main/kotlin/tech/libeufin/bank/db/TanDAO.kt | 13++++++-------
Mbank/src/main/kotlin/tech/libeufin/bank/db/TokenDAO.kt | 9+++------
Mbank/src/main/kotlin/tech/libeufin/bank/db/TransactionDAO.kt | 4++--
Mbank/src/main/kotlin/tech/libeufin/bank/db/WithdrawalDAO.kt | 11++++-------
Mcommon/src/main/kotlin/db/types.kt | 8++++++++
Mnexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt | 2+-
9 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt @@ -282,7 +282,7 @@ class AccountDAO(private val db: Database) { oneOrNull { CurrentAccount( id = it.getLong("customer_id"), - channel = it.getString("tan_channel")?.run { TanChannel.valueOf(this) }, + channel = it.getOptEnum<TanChannel>("tan_channel"), phone = it.getString("phone"), email = it.getString("email"), name = it.getString("name"), @@ -540,7 +540,7 @@ class AccountDAO(private val db: Database) { email = Option.Some(it.getString("email")), phone = Option.Some(it.getString("phone")) ), - tan_channel = it.getString("tan_channel")?.run { TanChannel.valueOf(this) }, + tan_channel = it.getOptEnum<TanChannel>("tan_channel"), cashout_payto_uri = it.getString("cashout_payto"), payto_uri = it.getBankPayto("internal_payto_uri", "name", ctx), balance = Balance( @@ -556,7 +556,7 @@ 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 = AccountStatus.valueOf(it.getString("status")) + status = it.getEnum("status") ) } } @@ -661,7 +661,7 @@ 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_uri", "name", ctx), - status = AccountStatus.valueOf(it.getString("status")) + status = it.getEnum("status") ) } } \ No newline at end of file diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/CashoutDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/CashoutDAO.kt @@ -123,7 +123,7 @@ class CashoutDAO(private val db: Database) { 0L -> null else -> TalerProtocolTimestamp(timestamp.asInstant()) }, - tan_channel = it.getString("tan_channel")?.run { TanChannel.valueOf(this) }, + tan_channel = it.getOptEnum<TanChannel>("tan_channel"), tan_info = it.getString("tan_info"), ) } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/ConversionDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/ConversionDAO.kt @@ -23,10 +23,7 @@ import tech.libeufin.bank.ConversionRate import tech.libeufin.bank.RoundingMode import tech.libeufin.common.DecimalNumber import tech.libeufin.common.TalerAmount -import tech.libeufin.common.db.getAmount -import tech.libeufin.common.db.one -import tech.libeufin.common.db.oneOrNull -import tech.libeufin.common.db.withStatement +import tech.libeufin.common.db.* /** Data access logic for conversion */ class ConversionDAO(private val db: Database) { @@ -84,7 +81,7 @@ class ConversionDAO(private val db: Database) { 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.one { it.getEnum<RoundingMode>(1) } } val rate = ConversionRate( cashin_ratio = getRatio("cashin_ratio"), diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/TanDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/TanDAO.kt @@ -21,8 +21,7 @@ package tech.libeufin.bank.db import tech.libeufin.bank.Operation import tech.libeufin.bank.TanChannel -import tech.libeufin.common.db.one -import tech.libeufin.common.db.oneOrNull +import tech.libeufin.common.db.* import tech.libeufin.common.internalServerError import tech.libeufin.common.micros import java.time.Duration @@ -85,9 +84,9 @@ class TanDAO(private val db: Database) { one { when { it.getBoolean("out_no_op") -> TanSendResult.NotFound - else -> TanSendResult.Success( + else -> TanSendResult.Success( tanInfo = it.getString("out_tan_info"), - tanChannel = it.getString("out_tan_channel").run { TanChannel.valueOf(this) }, + tanChannel = it.getEnum("out_tan_channel"), tanCode = it.getString("out_tan_code") ) } @@ -139,8 +138,8 @@ class TanDAO(private val db: Database) { when { it.getBoolean("out_ok") -> TanSolveResult.Success( body = it.getString("out_body"), - op = Operation.valueOf(it.getString("out_op")), - channel = it.getString("out_channel")?.run { TanChannel.valueOf(this) }, + op = it.getEnum("out_op"), + channel = it.getOptEnum<TanChannel>("out_channel"), info = it.getString("out_info") ) it.getBoolean("out_no_op") -> TanSolveResult.NotFound @@ -176,7 +175,7 @@ class TanDAO(private val db: Database) { oneOrNull { Challenge( body = it.getString("body"), - channel = it.getString("tan_channel")?.run { TanChannel.valueOf(this) }, + channel = it.getOptEnum<TanChannel>("tan_channel"), info = it.getString("tan_info") ) } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/TokenDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/TokenDAO.kt @@ -24,10 +24,7 @@ import tech.libeufin.bank.TokenInfo import tech.libeufin.bank.TokenScope import tech.libeufin.common.PageParams import tech.libeufin.common.asInstant -import tech.libeufin.common.db.executeUpdateViolation -import tech.libeufin.common.db.getTalerTimestamp -import tech.libeufin.common.db.oneOrNull -import tech.libeufin.common.db.page +import tech.libeufin.common.db.* import tech.libeufin.common.micros import java.time.Instant @@ -93,7 +90,7 @@ class TokenDAO(private val db: Database) { creationTime = it.getLong("creation_time").asInstant(), expirationTime = it.getLong("expiration_time").asInstant(), login = it.getString("login"), - scope = TokenScope.valueOf(it.getString("scope")), + scope = it.getEnum("scope"), isRefreshable = it.getBoolean("is_refreshable") ) } @@ -134,7 +131,7 @@ class TokenDAO(private val db: Database) { TokenInfo( creation_time = it.getTalerTimestamp("creation_time"), expiration = it.getTalerTimestamp("expiration_time"), - scope = TokenScope.valueOf(it.getString("scope")), + scope = it.getEnum("scope"), isRefreshable = it.getBoolean("is_refreshable"), description = it.getString("description"), last_access = it.getTalerTimestamp("last_access"), diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/TransactionDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/TransactionDAO.kt @@ -185,7 +185,7 @@ class TransactionDAO(private val db: Database) { creditor_payto_uri = it.getBankPayto("creditor_payto_uri", "creditor_name", ctx), debtor_payto_uri = it.getBankPayto("debtor_payto_uri", "debtor_name", ctx), amount = it.getAmount("amount", db.bankCurrency), - direction = TransactionDirection.valueOf(it.getString("direction")), + direction = it.getEnum("direction"), subject = it.getString("subject"), date = it.getTalerTimestamp("transaction_date"), row_id = it.getLong("bank_transaction_id") @@ -220,7 +220,7 @@ class TransactionDAO(private val db: Database) { debtor_payto_uri = it.getBankPayto("debtor_payto_uri", "debtor_name", ctx), amount = it.getAmount("amount", db.bankCurrency), subject = it.getString("subject"), - direction = TransactionDirection.valueOf(it.getString("direction")) + direction = it.getEnum("direction") ) } } diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/WithdrawalDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/WithdrawalDAO.kt @@ -27,10 +27,7 @@ import tech.libeufin.bank.* import tech.libeufin.common.EddsaPublicKey import tech.libeufin.common.Payto import tech.libeufin.common.TalerAmount -import tech.libeufin.common.db.getAmount -import tech.libeufin.common.db.getOptAmount -import tech.libeufin.common.db.one -import tech.libeufin.common.db.oneOrNull +import tech.libeufin.common.db.* import tech.libeufin.common.micros import java.time.Instant import java.util.* @@ -191,7 +188,7 @@ class WithdrawalDAO(private val db: Database) { it.getBoolean("out_reserve_pub_reuse") -> WithdrawalSelectionResult.RequestPubReuse it.getBoolean("out_account_not_found") -> WithdrawalSelectionResult.UnknownAccount it.getBoolean("out_account_is_not_exchange") -> WithdrawalSelectionResult.AccountIsNotExchange - else -> WithdrawalSelectionResult.Success(WithdrawalStatus.valueOf(it.getString("out_status"))) + else -> WithdrawalSelectionResult.Success(it.getEnum("out_status")) } } } @@ -331,7 +328,7 @@ class WithdrawalDAO(private val db: Database) { setObject(1, uuid) oneOrNull { WithdrawalPublicInfo( - status = WithdrawalStatus.valueOf(it.getString("status")), + status = it.getEnum("status"), amount = it.getOptAmount("amount", db.bankCurrency), suggested_amount = it.getOptAmount("suggested_amount", db.bankCurrency), username = it.getString("login"), @@ -382,7 +379,7 @@ class WithdrawalDAO(private val db: Database) { setObject(3, uuid) oneOrNull { BankWithdrawalOperationStatus( - status = WithdrawalStatus.valueOf(it.getString("status")), + status = it.getEnum("status"), amount = it.getOptAmount("amount", db.bankCurrency), suggested_amount = it.getOptAmount("suggested_amount", db.bankCurrency), max_amount = it.getAmount("max_amount", db.bankCurrency), diff --git a/common/src/main/kotlin/db/types.kt b/common/src/main/kotlin/db/types.kt @@ -22,6 +22,14 @@ package tech.libeufin.common.db import tech.libeufin.common.* import java.sql.ResultSet +inline fun <reified T : kotlin.Enum<T>> ResultSet.getEnum(name: String): T + = java.lang.Enum.valueOf(T::class.java, getString(name)) +inline fun <reified T : kotlin.Enum<T>> ResultSet.getEnum(idx: Int): T + = java.lang.Enum.valueOf(T::class.java, getString(idx)) + +inline fun <reified T : kotlin.Enum<T>> ResultSet.getOptEnum(name: String): T? + = getString(name)?.run { java.lang.Enum.valueOf(T::class.java, this) } + fun ResultSet.getAmount(name: String, currency: String): TalerAmount { return TalerAmount( getLong("${name}_val"), diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/XmlCombinators.kt @@ -182,7 +182,7 @@ class XmlDestructor internal constructor(private val el: Element) { fun bool(): Boolean = el.textContent.toBoolean() fun date(): LocalDate = LocalDate.parse(text(), DateTimeFormatter.ISO_DATE) fun dateTime(): LocalDateTime = LocalDateTime.parse(text(), DateTimeFormatter.ISO_DATE_TIME) - inline fun <reified T : Enum<T>> enum(): T = java.lang.Enum.valueOf(T::class.java, text()) + inline fun <reified T : kotlin.Enum<T>> enum(): T = java.lang.Enum.valueOf(T::class.java, text()) fun attr(index: String): String = el.getAttribute(index)