From 1d6c9d0ea40228342874974895a1793142ca697b Mon Sep 17 00:00:00 2001 From: sorinmanole Date: Wed, 3 Aug 2016 12:24:51 +0200 Subject: [PATCH] issue #123 --- .../resources/props/sample.props.template | 1 + .../scala/code/api/v2_0_0/APIMethods200.scala | 7 ++- .../scala/code/api/v2_1_0/APIMethods210.scala | 48 ++++++++++++++++++- .../code/api/v2_1_0/JSONFactory2.1.0.scala | 12 +++++ .../scala/code/api/v2_1_0/OBPAPI2_1_0.scala | 3 +- .../bankconnectors/LocalMappedConnector.scala | 4 +- 6 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/main/resources/props/sample.props.template b/src/main/resources/props/sample.props.template index 7a5242415..f19b28ffe 100644 --- a/src/main/resources/props/sample.props.template +++ b/src/main/resources/props/sample.props.template @@ -103,6 +103,7 @@ payments_enabled=true #transaction requests are replacing simple payments starting from 1.4.0 transactionRequests_enabled=true transactionRequests_connector=mapped +transactionRequests_supported_types=SANDBOX_TAN,INTRABANK # For video conference meetings (createMeeting) diff --git a/src/main/scala/code/api/v2_0_0/APIMethods200.scala b/src/main/scala/code/api/v2_0_0/APIMethods200.scala index 25111ea1e..2af801d37 100644 --- a/src/main/scala/code/api/v2_0_0/APIMethods200.scala +++ b/src/main/scala/code/api/v2_0_0/APIMethods200.scala @@ -1194,8 +1194,11 @@ trait APIMethods200 { toAccountId <- tryo(AccountId(transBodyJson.to.account_id)) toAccount <- BankAccount(toBankId, toAccountId) ?~! {ErrorMessages.CounterpartyNotFound} // Prevent default value for transaction request type (at least). - // Consider: Add valid list of Transaction Request Types to Props "transactionRequests_supported_types" and use that below - isValidTransactionRequestType <- tryo(assert(transactionRequestType.value != "TRANSACTION_REQUEST_TYPE")) ?~! s"${ErrorMessages.InvalidTransactionRequestType} : Invalid value is: '${transactionRequestType.value}' Valid values are: ${TransactionRequests.CHALLENGE_SANDBOX_TAN}" + // Get Transaction Request Types from Props "transactionRequests_supported_types". Default is empty string + validTransactionRequestTypes <- tryo{Props.get("transactionRequests_supported_types", "")} + // Use a list instead of a string to avoid partial matches + validTransactionRequestTypesList <- tryo{validTransactionRequestTypes.split(",")} + isValidTransactionRequestType <- tryo(assert(transactionRequestType.value != "TRANSACTION_REQUEST_TYPE" && validTransactionRequestTypesList.contains(transactionRequestType.value))) ?~! s"${ErrorMessages.InvalidTransactionRequestType} : Invalid value is: '${transactionRequestType.value}' Valid values are: ${validTransactionRequestTypes}" transferCurrencyEqual <- tryo(assert(transBodyJson.value.currency == fromAccount.currency)) ?~! {"Transfer body currency and holder account currency must be the same."} createdTransactionRequest <- Connector.connector.vend.createTransactionRequestv200(u, fromAccount, toAccount, transactionRequestType, transBody) } yield { diff --git a/src/main/scala/code/api/v2_1_0/APIMethods210.scala b/src/main/scala/code/api/v2_1_0/APIMethods210.scala index 516165496..56ff4f8bd 100644 --- a/src/main/scala/code/api/v2_1_0/APIMethods210.scala +++ b/src/main/scala/code/api/v2_1_0/APIMethods210.scala @@ -3,9 +3,11 @@ package code.api.v2_1_0 import java.text.SimpleDateFormat import code.api.util.ApiRole._ import code.api.util.ErrorMessages +import code.api.v2_1_0.JSONFactory210 import code.model._ import net.liftweb.http.Req +import net.liftweb.json.Extraction import net.liftweb.json.JsonAST.JValue import net.liftweb.util.Props @@ -71,7 +73,7 @@ trait APIMethods210 { lazy val sandboxDataImport: PartialFunction[Req, Box[User] => Box[JsonResponse]] = { - //import data into the sandbox + // Import data into the sandbox case "sandbox" :: "data-import" :: Nil JsonPost json -> _ => { user => for { @@ -86,6 +88,50 @@ trait APIMethods210 { } } } + + + val getTransactionRequestTypesIsPublic = Props.getBool("apiOptions.getTransactionRequestTypesIsPublic", true) + + resourceDocs += ResourceDoc( + getTransactionRequestTypesSupportedByBank, + apiVersion, + "getTransactionRequestTypesSupportedByBank", + "GET", + "/banks/BANK_ID/transaction-request-types", + "Get the Transaction Request Types supported by the bank", + s"""Get the list of the Transaction Request Types supported by the bank. + | + |${authenticationRequiredMessage(!getTransactionRequestTypesIsPublic)} + |""", + emptyObjectJson, + emptyObjectJson, + emptyObjectJson :: Nil, + false, + false, + false, + List(apiTagBank, apiTagTransactionRequest)) + + + lazy val getTransactionRequestTypesSupportedByBank: PartialFunction[Req, Box[User] => Box[JsonResponse]] = { + // Get transaction request types supported by the bank + case "banks" :: BankId(bankId) :: "transaction-request-types" :: Nil JsonGet _ => { + user => + for { + u <- if(getTransactionRequestTypesIsPublic) + Box(Some(1)) + else + user ?~! ErrorMessages.UserNotLoggedIn + bank <- Bank(bankId) ?~! {ErrorMessages.BankNotFound} + // Get Transaction Request Types from Props "transactionRequests_supported_types". Default is empty string + transactionRequestTypes <- tryo(Props.get("transactionRequests_supported_types", "")) + } yield { + // Format the data as json + val json = JSONFactory210.createTransactionRequestTypeJSON(transactionRequestTypes.split(",").toList) + // Return + successJsonResponse(Extraction.decompose(json)) + } + } + } } } diff --git a/src/main/scala/code/api/v2_1_0/JSONFactory2.1.0.scala b/src/main/scala/code/api/v2_1_0/JSONFactory2.1.0.scala index 0c1cd2edf..4b518adc4 100644 --- a/src/main/scala/code/api/v2_1_0/JSONFactory2.1.0.scala +++ b/src/main/scala/code/api/v2_1_0/JSONFactory2.1.0.scala @@ -31,5 +31,17 @@ Berlin 13359, Germany */ package code.api.v2_1_0 +case class TransactionRequestTypeJSON(transaction_request_type: String) +case class TransactionRequestTypesJSON(transaction_request_types: List[TransactionRequestTypeJSON]) + object JSONFactory210{ + def createTransactionRequestTypeJSON(transactionRequestType : String ) : TransactionRequestTypeJSON = { + new TransactionRequestTypeJSON( + transactionRequestType + ) + } + + def createTransactionRequestTypeJSON(transactionRequestTypes : List[String]) : TransactionRequestTypesJSON = { + TransactionRequestTypesJSON(transactionRequestTypes.map(createTransactionRequestTypeJSON)) + } } \ No newline at end of file diff --git a/src/main/scala/code/api/v2_1_0/OBPAPI2_1_0.scala b/src/main/scala/code/api/v2_1_0/OBPAPI2_1_0.scala index cc770d5d0..663e55f56 100644 --- a/src/main/scala/code/api/v2_1_0/OBPAPI2_1_0.scala +++ b/src/main/scala/code/api/v2_1_0/OBPAPI2_1_0.scala @@ -181,7 +181,8 @@ object OBPAPI2_1_0 extends OBPRestHelper with APIMethods130 with APIMethods140 w Implementations2_0_0.elasticSearchMetrics, Implementations2_0_0.getCustomers, // New in 2.1.0 - Implementations2_1_0.sandboxDataImport + Implementations2_1_0.sandboxDataImport, + Implementations2_1_0.getTransactionRequestTypesSupportedByBank ) routes.foreach(route => { diff --git a/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index f4abe7896..93b7764c2 100644 --- a/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -294,7 +294,9 @@ object LocalMappedConnector extends Connector with Loggable { override def getTransactionRequestTypesImpl(fromAccount : BankAccount) : Box[List[TransactionRequestType]] = { //TODO: write logic / data access - Full(List(TransactionRequestType("SANDBOX_TAN"))) + // Get Transaction Request Types from Props "transactionRequests_supported_types". Default is empty string + val validTransactionRequestTypes = Props.get("transactionRequests_supported_types", "").split(",").map(x => TransactionRequestType(x)).toList + Full(validTransactionRequestTypes) } /*