From 2a046565a695196a2795f3822249892b3960febc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Wed, 4 Sep 2019 10:09:08 +0200 Subject: [PATCH 1/6] Added TODO notes --- .../code/bankconnectors/rest/RestConnector_vMar2019.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala index 9dea722cf..17e314b8a 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala @@ -7937,6 +7937,9 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable * @tparam T * @return result of future */ + // This result is accessed synchronously (blocking) + // TODO 1. Consider can be the result accessed asynchronously (non-blocking) + // TODO 2. Consider making the duration tweakable via props file at least private[this] implicit def convertFuture[T](future: Future[T]): T = Await.result(future, 1.minute) /** From 642afd3ecd1520a868c0e866ec849b46451cac46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Wed, 4 Sep 2019 12:49:52 +0200 Subject: [PATCH 2/6] Tweaked endpoint getObpApiLoopback --- .../main/scala/code/api/v3_1_0/APIMethods310.scala | 2 +- .../scala/code/api/v3_1_0/ObpApiLoopbackTest.scala | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala b/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala index a20ac5f0e..c981e53a2 100644 --- a/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala +++ b/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala @@ -1941,7 +1941,7 @@ trait APIMethods310 { (_, callContext) <- anonymousAccess(cc) connectorVersion = APIUtil.getPropsValue("connector").openOrThrowException("connector props filed `connector` not set") obpApiLoopback <- connectorVersion.contains("kafka") match { - case false => Future{ObpApiLoopback("mapped",gitCommit,"0")} + case false => throw new IllegalStateException(s"${NotImplemented}for connector ${connectorVersion}") case true => KafkaHelper.echoKafkaServer.recover { case e: Throwable => throw new IllegalStateException(s"${KafkaServerUnavailable} Timeout error, because kafka do not return message to OBP-API. ${e.getMessage}") } diff --git a/obp-api/src/test/scala/code/api/v3_1_0/ObpApiLoopbackTest.scala b/obp-api/src/test/scala/code/api/v3_1_0/ObpApiLoopbackTest.scala index 412c35338..5342e37a2 100644 --- a/obp-api/src/test/scala/code/api/v3_1_0/ObpApiLoopbackTest.scala +++ b/obp-api/src/test/scala/code/api/v3_1_0/ObpApiLoopbackTest.scala @@ -25,7 +25,9 @@ TESOBE (http://www.tesobe.com/) */ package code.api.v3_1_0 -import code.api.util.ApiVersion +import code.api.ErrorMessage +import code.api.util.ErrorMessages.NotImplemented +import code.api.util.{APIUtil, ApiVersion, ErrorMessages} import code.api.v3_1_0.OBPAPI3_1_0.Implementations3_1_0 import com.github.dwickern.macros.NameOf.nameOf import org.scalatest.Tag @@ -47,9 +49,12 @@ class ObpApiLoopbackTest extends V310ServerSetup { When("We make a request v3.1.0") val request310 = (v3_1_0_Request / "connector" / "loopback").GET val response310 = makeGetRequest(request310) - Then("We should get a 200") - response310.code should equal(200) - response310.body.extract[ObpApiLoopbackJson] + Then("We should get a 400") + response310.code should equal(400) + val connectorVersion = APIUtil.getPropsValue("connector").openOrThrowException("connector props filed `connector` not set") + val errorMessage = s"${NotImplemented}for connector ${connectorVersion}" + And("error should be " + errorMessage) + response310.body.extract[ErrorMessage].message should equal (errorMessage) } } From b484e083acff4885293255276e16cf7bdd24f529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Wed, 4 Sep 2019 16:20:17 +0200 Subject: [PATCH 3/6] Fixed new_style_only props issue --- obp-api/src/main/scala/code/api/util/APIUtil.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obp-api/src/main/scala/code/api/util/APIUtil.scala b/obp-api/src/main/scala/code/api/util/APIUtil.scala index 2bea5aba0..8ea4c46ef 100644 --- a/obp-api/src/main/scala/code/api/util/APIUtil.scala +++ b/obp-api/src/main/scala/code/api/util/APIUtil.scala @@ -40,7 +40,7 @@ import code.api.builder.OBP_APIBuilder import code.api.oauth1a.Arithmetics import code.api.oauth1a.OauthParams._ import code.api.sandbox.SandboxApiCalls -import code.api.util.ApiTag.{ResourceDocTag, apiTagBank} +import code.api.util.ApiTag.{ResourceDocTag, apiTagBank, apiTagNewStyle} import code.api.util.Glossary.GlossaryItem import code.api.util.StrongCustomerAuthentication.SCA import code.api.v1_2.ErrorMessage @@ -1699,7 +1699,7 @@ Returns a string showed to the developer // Only allow Resource Doc if it matches one of the pre selected endpoints from the version list. // i.e. this function may recieve more Resource Docs than version endpoints endpoints.exists(_ == item.partialFunction) && - (NewStyle.endpoints.exists(x => x == (item.partialFunctionName, item.implementedInApiVersion.toString())) || !onlyNewStyle) + (item.tags.exists(_ == apiTagNewStyle) || !onlyNewStyle) ) yield item.partialFunction routes.toList From f9b2ee78ff4a34fbfea5e5e7e09cef571be2bf29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Thu, 5 Sep 2019 12:47:53 +0200 Subject: [PATCH 4/6] Added request body to the Call Context --- obp-api/src/main/scala/code/api/OBPRestHelper.scala | 2 ++ obp-api/src/main/scala/code/api/util/APIUtil.scala | 9 +++++++++ obp-api/src/main/scala/code/api/util/ApiSession.scala | 3 +++ 3 files changed, 14 insertions(+) diff --git a/obp-api/src/main/scala/code/api/OBPRestHelper.scala b/obp-api/src/main/scala/code/api/OBPRestHelper.scala index 377ea0e08..612bf23fb 100644 --- a/obp-api/src/main/scala/code/api/OBPRestHelper.scala +++ b/obp-api/src/main/scala/code/api/OBPRestHelper.scala @@ -209,6 +209,7 @@ trait OBPRestHelper extends RestHelper with MdcLoggable { def failIfBadAuthorizationHeader(rd: Option[ResourceDoc])(fn: CallContext => Box[JsonResponse]) : JsonResponse = { val authorization = S.request.map(_.header("Authorization")).flatten + val body: Box[String] = getRequestBody(S.request) val implementedInVersion = S.request.openOrThrowException(attemptedToOpenAnEmptyBox).view val verb = S.request.openOrThrowException(attemptedToOpenAnEmptyBox).requestType.method val url = URLDecoder.decode(S.uriAndQueryString.getOrElse(""),"UTF-8") @@ -220,6 +221,7 @@ trait OBPRestHelper extends RestHelper with MdcLoggable { authReqHeaderField = authorization, implementedInVersion = implementedInVersion, verb = verb, + httpBody = body, correlationId = correlationId, url = url, ipAddress = getRemoteIpAddress(), diff --git a/obp-api/src/main/scala/code/api/util/APIUtil.scala b/obp-api/src/main/scala/code/api/util/APIUtil.scala index 52ddbbef6..210d88ad0 100644 --- a/obp-api/src/main/scala/code/api/util/APIUtil.scala +++ b/obp-api/src/main/scala/code/api/util/APIUtil.scala @@ -1462,6 +1462,12 @@ Returns a string showed to the developer } + /** + * The POST or PUT body. This will be empty if the content + * type is application/x-www-form-urlencoded or a multipart mime. + * It will also be empty if rawInputStream is accessed + */ + def getRequestBody(req: Box[Req]) = req.flatMap(_.body).map(_.map(_.toChar)).map(_.mkString) /** * @return - the HTTP session ID */ @@ -1873,6 +1879,7 @@ Returns a string showed to the developer def getUserAndSessionContextFuture(cc: CallContext): OBPReturnType[Box[User]] = { val s = S val spelling = getSpellingParam() + val body: Box[String] = getRequestBody(S.request) val implementedInVersion = S.request.openOrThrowException(attemptedToOpenAnEmptyBox).view val verb = S.request.openOrThrowException(attemptedToOpenAnEmptyBox).requestType.method val url = URLDecoder.decode(S.uriAndQueryString.getOrElse(""),"UTF-8") @@ -1951,6 +1958,8 @@ Returns a string showed to the developer x => (x._1, x._2.map(_.copy(requestHeaders = reqHeaders))) } map { x => (x._1, x._2.map(_.copy(ipAddress = getRemoteIpAddress()))) + } map { + x => (x._1, x._2.map(_.copy(httpBody = body.toOption))) } } diff --git a/obp-api/src/main/scala/code/api/util/ApiSession.scala b/obp-api/src/main/scala/code/api/util/ApiSession.scala index 4fb4447cd..4b10f972e 100644 --- a/obp-api/src/main/scala/code/api/util/ApiSession.scala +++ b/obp-api/src/main/scala/code/api/util/ApiSession.scala @@ -38,6 +38,7 @@ case class CallContext( directLoginParams: Map[String, String] = Map(), oAuthParams: Map[String, String] = Map(), httpCode: Option[Int] = None, + httpBody: Option[String] = None, requestHeaders: List[HTTPParam] = Nil, `X-Rate-Limit-Limit` : Long = -1, `X-Rate-Limit-Remaining` : Long = -1, @@ -108,6 +109,7 @@ case class CallContext( verb = this.verb, implementedInVersion = this.implementedInVersion, httpCode = this.httpCode, + httpBody = this.httpBody, authReqHeaderField = this.authReqHeaderField.toOption, partialFunctionName = this.resourceDocument.map(_.partialFunctionName).getOrElse(""), directLoginToken = this.directLoginParams.get("token").getOrElse(""), @@ -145,6 +147,7 @@ case class CallContextLight(gatewayLoginRequestPayload: Option[PayloadOfJwtJSON] verb: String = "", implementedInVersion: String = "", httpCode: Option[Int] = None, + httpBody: Option[String] = None, authReqHeaderField: Option[String] = None, partialFunctionName: String, directLoginToken: String, From ad641912c8070ca144af755cee3a4bf47f85b5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Thu, 5 Sep 2019 15:42:22 +0200 Subject: [PATCH 5/6] Fixed issue with getSocialMediaHandles endpoint --- obp-api/src/main/scala/code/api/util/NewStyle.scala | 1 - 1 file changed, 1 deletion(-) 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 ae6bac199..eab60faf8 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -51,7 +51,6 @@ object NewStyle { (nameOf(Implementations2_0_0.getKycMedia), ApiVersion.v2_0_0.toString), (nameOf(Implementations2_0_0.getKycStatuses), ApiVersion.v2_0_0.toString), (nameOf(Implementations2_0_0.getKycChecks), ApiVersion.v2_0_0.toString), - (nameOf(Implementations2_0_0.getSocialMediaHandles), ApiVersion.v2_0_0.toString), (nameOf(Implementations2_0_0.addKycDocument), ApiVersion.v2_0_0.toString), (nameOf(Implementations2_0_0.addKycMedia), ApiVersion.v2_0_0.toString), (nameOf(Implementations2_0_0.addKycStatus), ApiVersion.v2_0_0.toString), From 01dc9884dd48871a7bec09ffbe7d48b3827df69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Fri, 6 Sep 2019 12:47:08 +0200 Subject: [PATCH 6/6] Fixed issue with createBranch, updateBranch and createAtm endpoints --- obp-api/src/main/scala/code/api/OBPRestHelper.scala | 4 ++++ .../main/scala/code/api/v3_0_0/APIMethods300.scala | 13 +++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/obp-api/src/main/scala/code/api/OBPRestHelper.scala b/obp-api/src/main/scala/code/api/OBPRestHelper.scala index 612bf23fb..315791323 100644 --- a/obp-api/src/main/scala/code/api/OBPRestHelper.scala +++ b/obp-api/src/main/scala/code/api/OBPRestHelper.scala @@ -47,6 +47,8 @@ import net.liftweb.json.Extraction import net.liftweb.json.JsonAST.JValue import net.liftweb.util.Helpers +import scala.collection.immutable.List + trait APIFailure{ val msg : String val responseCode : Int @@ -202,6 +204,8 @@ trait OBPRestHelper extends RestHelper with MdcLoggable { ApiVersion.v2_2_0.toString ).exists(_ == e.implementedInApiVersion.toString()) => false + case Some(e) if APIMethods300.oldStyleEndpoints.exists(_ == e.partialFunctionName) => + false case _ => true } diff --git a/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala b/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala index 028e9715b..f98822b03 100644 --- a/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala +++ b/obp-api/src/main/scala/code/api/v3_0_0/APIMethods300.scala @@ -2369,14 +2369,15 @@ trait APIMethods300 { } } object APIMethods300 extends RestHelper with APIMethods300 { + lazy val oldStyleEndpoints = List( + nameOf(Implementations3_0_0.createBranch), + nameOf(Implementations3_0_0.updateBranch), + nameOf(Implementations3_0_0.createAtm) + ) lazy val newStyleEndpoints: List[(String, String)] = Implementations3_0_0.resourceDocs.map { rd => (rd.partialFunctionName, rd.implementedInApiVersion.toString()) }.toList.filterNot{ - rd => - List( - nameOf(Implementations3_0_0.createBranch), - nameOf(Implementations3_0_0.updateBranch), - nameOf(Implementations3_0_0.createAtm) - ).contains(rd._1) + rd => + oldStyleEndpoints.contains(rd._1) } }