refactor/moved getCurrentFxRateCached to LocalMappedConnectorInternal

This commit is contained in:
hongwei 2024-10-22 17:59:04 +02:00
parent eeba479be9
commit 36003c13fa
6 changed files with 41 additions and 90 deletions

View File

@ -1128,20 +1128,6 @@ trait Connector extends MdcLoggable {
def getCurrentCurrencies(bankId: BankId, callContext: Option[CallContext]): OBPReturnType[Box[List[String]]] = Future{Failure(setUnimplementedError(nameOf(getCurrentCurrencies _)))}
def getCurrentFxRate(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String): Box[FXRate] = Failure(setUnimplementedError(nameOf(getCurrentFxRate _)))
def getCurrentFxRateCached(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String): Box[FXRate] = {
/**
* Please note that "var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)"
* is just a temporary value field with UUID values in order to prevent any ambiguity.
* The real value will be assigned by Macro during compile time at this line of a code:
* https://github.com/OpenBankProject/scala-macros/blob/master/macros/src/main/scala/com/tesobe/CacheKeyFromArgumentsMacro.scala#L49
*/
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(TTL seconds) {
getCurrentFxRate(bankId, fromCurrencyCode, toCurrencyCode)
}
}
}
def createTransactionAfterChallengev300(
initiator: User,

View File

@ -404,7 +404,6 @@ object ConnectorBuilderUtil {
"createOrUpdateFXRate",
"accountOwnerExists",
"getCurrentFxRate",
"getCurrentFxRateCached",
"getTransactionRequestTypeCharges",
//"getPhysicalCardsForBankLegacy", // should not generate for Legacy methods
//"getBranchLegacy", // should not generate for Legacy methods

View File

@ -1,57 +1,42 @@
package code.bankconnectors
import java.util.Date
import java.util.UUID.randomUUID
import _root_.akka.http.scaladsl.model.HttpMethod
import code.DynamicData.DynamicDataProvider
import code.DynamicEndpoint.{DynamicEndpointProvider, DynamicEndpointT}
import code.accountapplication.AccountApplicationX
import code.accountattribute.AccountAttributeX
import code.accountholders.{AccountHolders, MapperAccountHolders}
import code.api.BerlinGroup.{AuthenticationType, ScaStatus}
import code.api.Constant
import code.api.Constant._
import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON
import code.api.attributedefinition.{AttributeDefinition, AttributeDefinitionDI}
import code.api.cache.Caching
import code.api.util.APIUtil.{OBPReturnType, _}
import code.api.util.ApiRole.canCreateAnyTransactionRequest
import code.api.util.ErrorMessages._
import code.api.util._
import code.api.v1_4_0.JSONFactory1_4_0.TransactionRequestAccountJsonV140
import code.api.v2_1_0._
import code.api.v4_0_0.{PostSimpleCounterpartyJson400, TransactionRequestBodySimpleJsonV400}
import code.atmattribute.{AtmAttribute, AtmAttributeX}
import code.atms.Atms.Atm
import code.atms.{Atms, MappedAtm}
import code.bankattribute.{BankAttribute, BankAttributeX}
import code.branches.Branches.Branch
import code.branches.MappedBranch
import code.cardattribute.CardAttributeX
import code.cards.MappedPhysicalCard
import code.context.{UserAuthContextProvider, UserAuthContextUpdateProvider}
import code.counterpartylimit.{CounterpartyLimit, CounterpartyLimitProvider, CounterpartyLimitTrait}
import code.counterpartylimit.CounterpartyLimitProvider
import code.customer._
import code.customeraccountlinks.CustomerAccountLinkTrait
import code.customeraddress.CustomerAddressX
import code.customerattribute.CustomerAttributeX
import code.directdebit.DirectDebits
import code.endpointTag.{EndpointTag, EndpointTagT}
import code.fx.fx.TTL
import code.fx.{MappedFXRate, fx}
import code.kycchecks.KycChecks
import code.kycdocuments.KycDocuments
import code.kycmedias.KycMedias
import code.kycstatuses.KycStatuses
import code.management.ImporterAPI.ImporterTransaction
import code.meetings.Meetings
import code.metadata.comments.Comments
import code.metadata.counterparties.Counterparties
import code.metadata.narrative.Narrative
import code.metadata.tags.Tags
import code.metadata.transactionimages.TransactionImages
import code.metadata.wheretags.WhereTags
import code.metrics.MappedMetric
import code.model._
import code.model.dataAccess.AuthUser.findAuthUserByUsernameLocallyLegacy
import code.model.dataAccess._
@ -64,51 +49,41 @@ import code.products.MappedProduct
import code.standingorders.{StandingOrderTrait, StandingOrders}
import code.taxresidence.TaxResidenceX
import code.transaction.MappedTransaction
import code.transactionChallenge.{Challenges, MappedExpectedChallengeAnswer}
import code.transactionChallenge.Challenges
import code.transactionRequestAttribute.TransactionRequestAttributeX
import code.transactionattribute.TransactionAttributeX
import com.openbankproject.commons.model.enums.TransactionRequestTypes._
import com.openbankproject.commons.model.enums.TransactionRequestTypes
import com.openbankproject.commons.model.enums.PaymentServiceTypes._
import com.openbankproject.commons.model.enums.PaymentServiceTypes
import code.transactionrequests._
import code.users.{UserAttribute, UserAttributeProvider, Users}
import code.util.Helper
import code.util.Helper._
import code.views.Views
import com.google.common.cache.CacheBuilder
import com.openbankproject.commons.ExecutionContext.Implicits.global
import com.openbankproject.commons.dto.{CustomerAndAttribute, GetProductsParam, ProductCollectionItemsTree}
import com.openbankproject.commons.model.enums.ChallengeType.OBP_TRANSACTION_REQUEST_CHALLENGE
import com.openbankproject.commons.model.enums.DynamicEntityOperation._
import com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SCA
import com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.SCAStatus
import com.openbankproject.commons.model.enums.SuppliedAnswerType
import com.openbankproject.commons.model.enums.{TransactionRequestStatus, _}
import com.openbankproject.commons.model.enums.TransactionRequestTypes._
import com.openbankproject.commons.model.enums.PaymentServiceTypes._
import com.openbankproject.commons.model.{AccountApplication, AccountAttribute, ConsentImplicitSCAT, DirectDebitTrait, FXRate, Product, ProductAttribute, ProductCollectionItem, TaxResidence, TransactionRequestCommonBodyJSON, _}
import com.openbankproject.commons.model.enums.{TransactionRequestStatus, _}
import com.openbankproject.commons.model._
import com.tesobe.CacheKeyFromArguments
import com.tesobe.model.UpdateBankAccount
import com.twilio.Twilio
import com.twilio.rest.api.v2010.account.Message
import com.twilio.`type`.PhoneNumber
import com.twilio.rest.api.v2010.account.Message
import net.liftweb.common._
import net.liftweb.json
import net.liftweb.json.JsonAST.JField
import net.liftweb.json.{JArray, JBool, JInt, JObject, JString, JValue}
import net.liftweb.mapper.{By, _}
import net.liftweb.json.{JArray, JBool, JObject, JValue}
import net.liftweb.mapper._
import net.liftweb.util.Helpers.{hours, now, time, tryo}
import net.liftweb.util.{Helpers, Mailer}
import net.liftweb.util.Mailer.{From, PlainMailBodyType, Subject, To}
import org.iban4j
import org.iban4j.{CountryCode, IbanFormat}
import net.liftweb.util.{Helpers, Mailer}
import org.mindrot.jbcrypt.BCrypt
import scalacache.ScalaCache
import scalikejdbc.{ConnectionPool, ConnectionPoolSettings, MultipleConnectionPoolContext}
import scalikejdbc.DB.CPContext
import scalikejdbc.{DB => scalikeDB, _}
import scalikejdbc.{ConnectionPool, ConnectionPoolSettings, MultipleConnectionPoolContext, DB => scalikeDB, _}
import java.util.Date
import java.util.UUID.randomUUID
import scala.collection.immutable.{List, Nil}
import scala.concurrent._
import scala.concurrent.duration._
@ -147,13 +122,7 @@ object LocalMappedConnector extends Connector with MdcLoggable {
}
override def validateAndCheckIbanNumber(iban: String, callContext: Option[CallContext]): OBPReturnType[Box[IbanChecker]] = Future {
import org.iban4j.CountryCode
import org.iban4j.Iban
import org.iban4j.IbanFormat
import org.iban4j.IbanFormatException
import org.iban4j.IbanUtil
import org.iban4j.InvalidCheckDigitException
import org.iban4j.UnsupportedCountryException
import org.iban4j.{IbanFormat, IbanFormatException, IbanUtil, InvalidCheckDigitException, UnsupportedCountryException}
if(getPropsAsBoolValue("validate_iban", false)) {
// Validate Iban
@ -5320,22 +5289,7 @@ object LocalMappedConnector extends Connector with MdcLoggable {
Full(res.nonEmpty)
}
override def getCurrentFxRateCached(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String): Box[FXRate] = {
/**
* Please note that "var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)"
* is just a temporary value field with UUID values in order to prevent any ambiguity.
* The real value will be assigned by Macro during compile time at this line of a code:
* https://github.com/OpenBankProject/scala-macros/blob/master/macros/src/main/scala/com/tesobe/CacheKeyFromArgumentsMacro.scala#L49
*/
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(TTL seconds) {
getCurrentFxRate(bankId, fromCurrencyCode, toCurrencyCode)
}
}
}
/**
* get transaction request type charges
*/

View File

@ -1,15 +1,17 @@
package code.bankconnectors
import code.fx.fx.TTL
import code.api.Constant._
import code.api.cache.Caching
import code.api.util.APIUtil._
import code.api.util.ErrorMessages._
import code.api.util._
import code.bankconnectors.LocalMappedConnector.{logger, _}
import code.branches.MappedBranch
import code.management.ImporterAPI.ImporterTransaction
import code.model.dataAccess.{BankAccountRouting, MappedBank, MappedBankAccount}
import code.transaction.MappedTransaction
import code.transactionrequests._
import com.tesobe.CacheKeyFromArguments
import code.util.Helper
import code.util.Helper._
import com.openbankproject.commons.ExecutionContext.Implicits.global
@ -25,8 +27,9 @@ import net.liftweb.util.Helpers
import net.liftweb.util.Helpers.tryo
import java.util.Date
import scala.collection.immutable.List
import java.util.UUID.randomUUID
import scala.concurrent._
import scala.concurrent.duration.DurationInt
import scala.language.postfixOps
import scala.util.Random
@ -184,7 +187,7 @@ object LocalMappedConnectorInternal extends MdcLoggable {
transactionRequest <- Future(transactionRequest.copy(challenge = null))
//save transaction_id into database
_ <- saveTransactionRequestTransaction(transactionRequest.id, createdTransactionId,callContext)
_ <- Connector.connector.vend.saveTransactionRequestTransaction(transactionRequest.id, createdTransactionId,callContext)
//update transaction_id field for variable 'transactionRequest'
transactionRequest <- Future(transactionRequest.copy(transaction_ids = createdTransactionId.value))
@ -264,7 +267,7 @@ object LocalMappedConnectorInternal extends MdcLoggable {
branchId: String,
accountRoutings: List[AccountRouting],
): Box[BankAccount] = {
getBankAccountLegacy(bankId, accountId, None).map(_._1) match {
Connector.connector.vend.getBankAccountLegacy(bankId, accountId, None).map(_._1) match {
case Full(a) =>
logger.debug(s"account with id $accountId at bank with id $bankId already exists. No need to create a new one.")
Full(a)
@ -379,8 +382,8 @@ object LocalMappedConnectorInternal extends MdcLoggable {
def updateAccountBalance(bankId: BankId, accountId: AccountId, newBalance: BigDecimal): Box[Boolean] = {
//this will be Full(true) if everything went well
val result = for {
(bank, _) <- getBankLegacy(bankId, None)
account <- getBankAccountLegacy(bankId, accountId, None).map(_._1).map(_.asInstanceOf[MappedBankAccount])
(bank, _) <- Connector.connector.vend.getBankLegacy(bankId, None)
account <- Connector.connector.vend.getBankAccountLegacy(bankId, accountId, None).map(_._1).map(_.asInstanceOf[MappedBankAccount])
} yield {
account.accountBalance(Helper.convertToSmallestCurrencyUnits(newBalance, account.currency)).save
setBankAccountLastUpdated(bank.nationalIdentifier, account.number, Helpers.now).openOrThrowException(attemptedToOpenAnEmptyBox)
@ -422,7 +425,7 @@ object LocalMappedConnectorInternal extends MdcLoggable {
): Box[BankAccount] = {
for {
(_, _) <- getBankLegacy(bankId, None) //bank is not really used, but doing this will ensure account creations fails if the bank doesn't
(_, _) <- Connector.connector.vend.getBankLegacy(bankId, None) //bank is not really used, but doing this will ensure account creations fails if the bank doesn't
balanceInSmallestCurrencyUnits = Helper.convertToSmallestCurrencyUnits(initialBalance, currency)
account <- LocalMappedConnectorInternal.createAccountIfNotExisting (
bankId,
@ -524,7 +527,7 @@ object LocalMappedConnectorInternal extends MdcLoggable {
)
//If it is empty, return the default value : "0.0000000" and set the BankAccount currency
case _ =>
val fromAccountCurrency: String = getBankAccountLegacy(bankId, accountId, None).map(_._1).openOrThrowException(attemptedToOpenAnEmptyBox).currency
val fromAccountCurrency: String = Connector.connector.vend.getBankAccountLegacy(bankId, accountId, None).map(_._1).openOrThrowException(attemptedToOpenAnEmptyBox).currency
TransactionRequestTypeChargeMock(transactionRequestType.value, bankId.value, fromAccountCurrency, "0.00", "Warning! Default value!")
}
@ -561,4 +564,19 @@ object LocalMappedConnectorInternal extends MdcLoggable {
)
Full(cardList)
}
def getCurrentFxRateCached(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String): Box[FXRate] = {
/**
* Please note that "var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)"
* is just a temporary value field with UUID values in order to prevent any ambiguity.
* The real value will be assigned by Macro during compile time at this line of a code:
* https://github.com/OpenBankProject/scala-macros/blob/master/macros/src/main/scala/com/tesobe/CacheKeyFromArgumentsMacro.scala#L49
*/
var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString)
CacheKeyFromArguments.buildCacheKey {
Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(TTL seconds) {
Connector.connector.vend.getCurrentFxRate(bankId, fromCurrencyCode, toCurrencyCode)
}
}
}
}

View File

@ -1,10 +1,9 @@
package code.fx
import java.util.UUID.randomUUID
import code.api.cache.Caching
import code.api.util.{APIUtil, CustomJsonFormats}
import code.bankconnectors.Connector
import code.bankconnectors.LocalMappedConnectorInternal
import code.util.Helper.MdcLoggable
import com.openbankproject.commons.model.BankId
import com.tesobe.CacheKeyFromArguments
@ -154,7 +153,7 @@ object fx extends MdcLoggable {
case None =>
getFallbackExchangeRateCached(fromCurrency, toCurrency).orElse(getFallbackExchangeRate2nd(fromCurrency, toCurrency))
case Some(id) =>
Connector.connector.vend.getCurrentFxRateCached(BankId(id), fromCurrency, toCurrency).map(_.conversionValue).toOption match {
LocalMappedConnectorInternal.getCurrentFxRateCached(BankId(id), fromCurrency, toCurrency).map(_.conversionValue).toOption match {
case None =>
getFallbackExchangeRateCached(fromCurrency, toCurrency).orElse(getFallbackExchangeRate2nd(fromCurrency, toCurrency))
case exchangeRate => exchangeRate

View File

@ -1292,11 +1292,6 @@ case class InBoundGetCurrentFxRate(status: Status, data: FXRateCommons) extends
override val inboundAdapterCallContext: InboundAdapterCallContext = InboundAdapterCallContext()
}
case class OutBoundGetCurrentFxRateCached(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String) extends TopicTrait
case class InBoundGetCurrentFxRateCached(status: Status, data: FXRateCommons) extends InBoundTrait[FXRateCommons] {
override val inboundAdapterCallContext: InboundAdapterCallContext = InboundAdapterCallContext()
}
case class OutBoundGetTransactionRequestTypeCharges(bankId: BankId, accountId: AccountId, viewId: ViewId, transactionRequestTypes: List[TransactionRequestType]) extends TopicTrait
case class InBoundGetTransactionRequestTypeCharges(status: Status, data: List[TransactionRequestTypeChargeCommons]) extends InBoundTrait[List[TransactionRequestTypeChargeCommons]] {
override val inboundAdapterCallContext: InboundAdapterCallContext = InboundAdapterCallContext()