diff --git a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/SwaggerDefinitionsJSON.scala b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/SwaggerDefinitionsJSON.scala index 149402a25..fa2647422 100644 --- a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/SwaggerDefinitionsJSON.scala +++ b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/SwaggerDefinitionsJSON.scala @@ -36,7 +36,7 @@ import com.openbankproject.commons.util.{ApiVersion, FieldNameApiVersions, Refle import net.liftweb.json import java.net.URLEncoder -import code.api.v5_1_0.CertificateInfoJsonV510 +import code.api.v5_1_0.{CertificateInfoJsonV510, CurrenciesJsonV510, CurrencyJsonV510} import code.endpointMapping.EndpointMappingCommons import scala.collection.immutable.List @@ -3027,6 +3027,8 @@ object SwaggerDefinitionsJSON { inverse_conversion_value = 0.998, effective_date = DateWithDayExampleObject ) + + val currenciesJsonV510 = CurrenciesJsonV510(currencies = List(CurrencyJsonV510(alphanumeric_code = "EUR"))) val counterpartyJsonV220 = CounterpartyJsonV220( name = postCounterpartyJSON.name, diff --git a/obp-api/src/main/scala/code/api/util/NewStyle.scala b/obp-api/src/main/scala/code/api/util/NewStyle.scala index fbe1b865b..8a78454b9 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -2177,7 +2177,13 @@ object NewStyle extends MdcLoggable{ } } } - + + + def getCurrentCurrencies(bankId: BankId, callContext: Option[CallContext]): OBPReturnType[List[String]] = { + Connector.connector.vend.getCurrentCurrencies(bankId, callContext) map { + i => (unboxFullOrFail(i._1, callContext, s"$InvalidConnectorResponse", 400), i._2) + } + } def getExchangeRate(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String, callContext: Option[CallContext]): Future[FXRate] = Future(Connector.connector.vend.getCurrentFxRate(bankId, fromCurrencyCode, toCurrencyCode)) map { diff --git a/obp-api/src/main/scala/code/api/v5_1_0/APIMethods510.scala b/obp-api/src/main/scala/code/api/v5_1_0/APIMethods510.scala index 535958984..df1e5657f 100644 --- a/obp-api/src/main/scala/code/api/v5_1_0/APIMethods510.scala +++ b/obp-api/src/main/scala/code/api/v5_1_0/APIMethods510.scala @@ -7,7 +7,7 @@ import code.api.util.APIUtil._ import code.api.util.ApiRole._ import code.api.util.ApiTag._ import code.api.util.ErrorMessages.{$UserNotLoggedIn, BankNotFound, ConsentNotFound, InvalidJsonFormat, UnknownError, UserNotFoundByUserId, UserNotLoggedIn, _} -import code.api.util.{APIUtil, ApiRole, CurrencyUtil, NewStyle, X509} +import code.api.util.{APIUtil, ApiRole, CallContext, CurrencyUtil, NewStyle, X509} import code.api.util.NewStyle.HttpCode import code.api.v3_0_0.JSONFactory300.createAggregateMetricJson import code.api.v3_1_0.ConsentJsonV310 @@ -256,6 +256,44 @@ trait APIMethods510 { } } + + staticResourceDocs += ResourceDoc( + getCurrenciesAtBank, + implementedInApiVersion, + nameOf(getCurrenciesAtBank), + "GET", + "/banks/BANK_ID/currencies", + "Get Currencies at a Bank", + """Get Currencies specified by BANK_ID + | + """.stripMargin, + emptyObjectJson, + currenciesJsonV510, + List( + $UserNotLoggedIn, + UnknownError + ), + List(apiTagFx, apiTagNewStyle) + ) + + lazy val getCurrenciesAtBank: OBPEndpoint = { + case "banks" :: BankId(bankId) :: "currencies" :: Nil JsonGet _ => { + cc => + for { + _ <- Helper.booleanToFuture(failMsg = ConsumerHasMissingRoles + CanReadFx, cc=cc.callContext) { + checkScope(bankId.value, getConsumerPrimaryKey(cc.callContext), ApiRole.canReadFx) + } + (_, callContext) <- NewStyle.function.getBank(bankId, cc.callContext) + (currencies, callContext) <- NewStyle.function.getCurrentCurrencies(bankId, callContext) + } yield { + val json = CurrenciesJsonV510(currencies.map(CurrencyJsonV510(_))) + (json, HttpCode.`200`(callContext)) + } + + } + } + + staticResourceDocs += ResourceDoc( revokeConsentAtBank, implementedInApiVersion, diff --git a/obp-api/src/main/scala/code/api/v5_1_0/JSONFactory5.1.0.scala b/obp-api/src/main/scala/code/api/v5_1_0/JSONFactory5.1.0.scala index 95d274781..937ae70c0 100644 --- a/obp-api/src/main/scala/code/api/v5_1_0/JSONFactory5.1.0.scala +++ b/obp-api/src/main/scala/code/api/v5_1_0/JSONFactory5.1.0.scala @@ -63,6 +63,8 @@ case class CheckSystemIntegrityJsonV510( success: Boolean, debug_info: Option[String] = None ) +case class CurrencyJsonV510(alphanumeric_code: String) +case class CurrenciesJsonV510(currencies: List[CurrencyJsonV510]) object JSONFactory510 { diff --git a/obp-api/src/main/scala/code/bankconnectors/Connector.scala b/obp-api/src/main/scala/code/bankconnectors/Connector.scala index 4af875ee8..2f2e7ad94 100644 --- a/obp-api/src/main/scala/code/bankconnectors/Connector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/Connector.scala @@ -2,6 +2,7 @@ package code.bankconnectors import java.util.Date import java.util.UUID.randomUUID + import _root_.akka.http.scaladsl.model.HttpMethod import code.accountholders.{AccountHolders, MapperAccountHolders} import code.api.Constant.{SYSTEM_ACCOUNTANT_VIEW_ID, SYSTEM_AUDITOR_VIEW_ID, SYSTEM_OWNER_VIEW_ID, localIdentityProvider} @@ -1795,6 +1796,8 @@ trait Connector extends MdcLoggable { // def resetBadLoginAttempts(username:String):Unit + def getCurrentCurrencies(bankId: BankId, callContext: Option[CallContext]): OBPReturnType[Box[List[String]]] = Future{Failure(setUnimplementedError)} + def getCurrentFxRate(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String): Box[FXRate] = Failure(setUnimplementedError) def getCurrentFxRateCached(bankId: BankId, fromCurrencyCode: String, toCurrencyCode: String): Box[FXRate] = { /** diff --git a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index 9ee66be83..c32f8c8e5 100644 --- a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -2,6 +2,7 @@ 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} @@ -3214,6 +3215,16 @@ object LocalMappedConnector extends Connector with MdcLoggable { } } + + override def getCurrentCurrencies(bankId: BankId, callContext: Option[CallContext]): OBPReturnType[Box[List[String]]] = Future { + val rates = MappedFXRate.findAll(By(MappedFXRate.mBankId, bankId.value)) + val result = rates.map(_.fromCurrencyCode) ::: rates.map(_.toCurrencyCode) + Some(result.distinct) + } map { + (_, callContext) + } + + /** * get the latest record from FXRate table by the fields: fromCurrencyCode and toCurrencyCode. * If it is not found by (fromCurrencyCode, toCurrencyCode) order, it will try (toCurrencyCode, fromCurrencyCode) order .