From 12b264d97c5dbdc7b66ffb20e1849143dcbf8618 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 20 Dec 2022 12:29:35 +0100 Subject: [PATCH 1/6] refactor/tweaked the getApiCollections to getApiCollectionsForUser --- .../main/scala/code/api/v4_0_0/APIMethods400.scala | 12 ++++++------ .../scala/code/api/v4_0_0/ApiCollectionTest.scala | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala b/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala index 51eeb8b71..5ef2820f8 100644 --- a/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala +++ b/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala @@ -9048,13 +9048,13 @@ trait APIMethods400 { } staticResourceDocs += ResourceDoc( - getApiCollections, + getApiCollectionsForUser, implementedInApiVersion, - nameOf(getApiCollections), + nameOf(getApiCollectionsForUser), "GET", "/users/USER_ID/api-collections", - "Get Api Collections", - s"""Get Api Collections. + "Get Api Collections for User", + s"""Get Api Collections for User. | |${authenticationRequiredMessage(true)} |""".stripMargin, @@ -9065,10 +9065,10 @@ trait APIMethods400 { UnknownError ), List(apiTagApiCollection, apiTagNewStyle), - Some(canGetAllApiCollections :: Nil) + Some(canGetAllApiCollectionsForUser :: Nil) ) - lazy val getApiCollections: OBPEndpoint = { + lazy val getApiCollectionsForUser: OBPEndpoint = { case "users" :: userId :: "api-collections" :: Nil JsonGet _ => { cc => for { diff --git a/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala index 9f0ee9487..363ef1a14 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala @@ -53,7 +53,7 @@ class ApiCollectionTest extends V400ServerSetup { object ApiEndpoint7 extends Tag(nameOf(Implementations4_0_0.getMyApiCollectionById)) object ApiEndpoint5 extends Tag(nameOf(Implementations4_0_0.getSharableApiCollectionById)) - object ApiEndpoint6 extends Tag(nameOf(Implementations4_0_0.getApiCollections)) + object ApiEndpoint6 extends Tag(nameOf(Implementations4_0_0.getApiCollectionsForUser)) feature("Test the apiCollection endpoints") { scenario("We create my apiCollection and get,delete", ApiEndpoint1,ApiEndpoint2, ApiEndpoint3, ApiEndpoint4, ApiEndpoint7, VersionOfApi) { @@ -232,7 +232,7 @@ class ApiCollectionTest extends V400ServerSetup { responseApiEndpoint6.body.toString contains(s"$UserHasMissingRoles") should be (true) Then("grant the role and test it again") - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, ApiRole.canGetAllApiCollections.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, ApiRole.canGetAllApiCollectionsForUser.toString) val responseApiEndpoint6WithRole = makeGetRequest(requestApiEndpoint6) Then("We should get a 200") From bcf3eedc45f0c398ea8985f04fe1ef93cb0b2190 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 20 Dec 2022 12:40:50 +0100 Subject: [PATCH 2/6] feature/OBPv510 added getAllApiCollections endpoint --- .../main/scala/code/api/util/ApiRole.scala | 3 + .../main/scala/code/api/util/NewStyle.scala | 4 + .../scala/code/api/v5_1_0/APIMethods510.scala | 44 ++++++++- .../ApiCollectionsProvider.scala | 6 +- .../code/api/v5_1_0/ApiCollectionTest.scala | 99 +++++++++++++++++++ .../code/api/v5_1_0/V510ServerSetup.scala | 26 +++++ 6 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 obp-api/src/test/scala/code/api/v5_1_0/ApiCollectionTest.scala create mode 100644 obp-api/src/test/scala/code/api/v5_1_0/V510ServerSetup.scala diff --git a/obp-api/src/main/scala/code/api/util/ApiRole.scala b/obp-api/src/main/scala/code/api/util/ApiRole.scala index a9e3882e6..291c2461f 100644 --- a/obp-api/src/main/scala/code/api/util/ApiRole.scala +++ b/obp-api/src/main/scala/code/api/util/ApiRole.scala @@ -323,6 +323,9 @@ object ApiRole { case class CanGetApiCollection(requiresBankId: Boolean = false) extends ApiRole lazy val canGetApiCollection = CanGetApiCollection() + case class CanGetAllApiCollectionsForUser(requiresBankId: Boolean = false) extends ApiRole + lazy val canGetAllApiCollectionsForUser = CanGetAllApiCollectionsForUser() + case class CanGetAllApiCollections(requiresBankId: Boolean = false) extends ApiRole lazy val canGetAllApiCollections = CanGetAllApiCollections() 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 826c72256..ae010bf04 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -3495,6 +3495,10 @@ object NewStyle extends MdcLoggable{ Future(MappedApiCollectionsProvider.getApiCollectionsByUserId(userId), callContext) } + def getAllApiCollections(callContext: Option[CallContext]) : OBPReturnType[List[ApiCollectionTrait]] = { + Future(MappedApiCollectionsProvider.getAllApiCollections(), callContext) + } + def getFeaturedApiCollections(callContext: Option[CallContext]) : OBPReturnType[List[ApiCollectionTrait]] = { //we get the getFeaturedApiCollectionIds from props, and remove the deplication there. val featuredApiCollectionIds = APIUtil.getPropsValue("featured_api_collection_ids","").split(",").map(_.trim).toSet.toList 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 4ad574fb5..1db48df02 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 @@ -1,16 +1,22 @@ package code.api.v5_1_0 +import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON.apiCollectionsJson400 import code.api.util.APIUtil._ - +import code.api.util.ErrorMessages._ import code.transactionrequests.TransactionRequests.TransactionRequestTypes.{apply => _} import com.github.dwickern.macros.NameOf.nameOf -import com.openbankproject.commons.model.BankId +import com.openbankproject.commons.model._ import com.openbankproject.commons.util.ApiVersion import net.liftweb.http.rest.RestHelper import com.openbankproject.commons.ExecutionContext.Implicits.global -import scala.collection.mutable.ArrayBuffer +import code.api.util.ApiRole._ +import code.api.util.ApiTag._ +import code.api.util.NewStyle +import scala.collection.mutable.ArrayBuffer +import code.api.util.NewStyle.HttpCode +import code.api.v4_0_0.JSONFactory400 trait APIMethods510 { self: RestHelper => @@ -27,6 +33,38 @@ trait APIMethods510 { val apiRelations = ArrayBuffer[ApiRelation]() val codeContext = CodeContext(staticResourceDocs, apiRelations) + staticResourceDocs += ResourceDoc( + getAllApiCollections, + implementedInApiVersion, + nameOf(getAllApiCollections), + "GET", + "/management/api-collections", + "Get All Api Collections", + s"""Get All Api Collections. + | + |${authenticationRequiredMessage(true)} + |""".stripMargin, + EmptyBody, + apiCollectionsJson400, + List( + UserHasMissingRoles, + UnknownError + ), + List(apiTagApiCollection, apiTagNewStyle), + Some(canGetAllApiCollections :: Nil) + ) + + lazy val getAllApiCollections: OBPEndpoint = { + case "management" :: "api-collections" :: Nil JsonGet _ => { + cc => + for { + (apiCollections, callContext) <- NewStyle.function.getAllApiCollections(cc.callContext) + } yield { + (JSONFactory400.createApiCollectionsJsonV400(apiCollections), HttpCode.`200`(callContext)) + } + } + } + } } diff --git a/obp-api/src/main/scala/code/apicollection/ApiCollectionsProvider.scala b/obp-api/src/main/scala/code/apicollection/ApiCollectionsProvider.scala index 1d0cdea12..980b875d3 100644 --- a/obp-api/src/main/scala/code/apicollection/ApiCollectionsProvider.scala +++ b/obp-api/src/main/scala/code/apicollection/ApiCollectionsProvider.scala @@ -20,7 +20,9 @@ trait ApiCollectionsProvider { def getApiCollectionByUserIdAndCollectionName( userId: String, apiCollectionName: String - ): Box[ApiCollectionTrait] + ): Box[ApiCollectionTrait] + + def getAllApiCollections(): List[ApiCollectionTrait] def deleteApiCollectionById( apiCollectionId: String, @@ -54,6 +56,8 @@ object MappedApiCollectionsProvider extends MdcLoggable with ApiCollectionsProvi apiCollectionId: String ) = ApiCollection.find(By(ApiCollection.ApiCollectionId,apiCollectionId)) + override def getAllApiCollections(): List[ApiCollectionTrait] = ApiCollection.findAll() + override def getApiCollectionByUserIdAndCollectionName( userId: String, apiCollectionName: String diff --git a/obp-api/src/test/scala/code/api/v5_1_0/ApiCollectionTest.scala b/obp-api/src/test/scala/code/api/v5_1_0/ApiCollectionTest.scala new file mode 100644 index 000000000..440231e39 --- /dev/null +++ b/obp-api/src/test/scala/code/api/v5_1_0/ApiCollectionTest.scala @@ -0,0 +1,99 @@ +/** +Open Bank Project - API +Copyright (C) 2011-2019, TESOBE GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Email: contact@tesobe.com +TESOBE GmbH +Osloerstrasse 16/17 +Berlin 13359, Germany + +This product includes software developed at +TESOBE (http://www.tesobe.com/) + */ +package code.api.v5_1_0 + +import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON +import code.api.util.APIUtil.OAuth._ +import code.api.util.ApiRole +import code.api.util.ErrorMessages.{UserHasMissingRoles, UserNotLoggedIn} +import code.api.v4_0_0.{ApiCollectionJson400, ApiCollectionsJson400} +import code.api.v5_1_0.OBPAPI5_1_0.Implementations5_1_0 +import code.entitlement.Entitlement +import com.github.dwickern.macros.NameOf.nameOf +import com.openbankproject.commons.util.ApiVersion +import net.liftweb.json.Serialization.write +import org.scalatest.Tag + +class ApiCollectionTest extends V510ServerSetup { + + /** + * Test tags + * Example: To run tests with tag "getPermissions": + * mvn test -D tagsToInclude + * + * This is made possible by the scalatest maven plugin + */ + object VersionOfApi extends Tag(ApiVersion.v5_1_0.toString) + + object ApiEndpoint8 extends Tag(nameOf(Implementations5_1_0.getAllApiCollections)) + + feature("Test the apiCollection endpoints") { + scenario("We create the apiCollection get All API collections back", ApiEndpoint8, VersionOfApi) { + When("We make a request v4.0.0") + + val request = (v5_1_0_Request / "my" / "api-collections").POST <@ (user1) + + lazy val postApiCollectionJson = SwaggerDefinitionsJSON.postApiCollectionJson400 + val response = makePostRequest(request, write(postApiCollectionJson)) + Then("We should get a 201") + response.code should equal(201) + val apiCollectionJson400 = response.body.extract[ApiCollectionJson400] + + + val requestUser2 = (v5_1_0_Request / "my" / "api-collections").POST <@ (user2) + val responseUser2 = makePostRequest(requestUser2, write(postApiCollectionJson)) + Then("We should get a 201") + responseUser2.code should equal(201) + + Then(s"we test the $ApiEndpoint8") + val requestApiEndpoint = (v5_1_0_Request / "management" / "api-collections").GET + val requestApiEndpoint8 = (v5_1_0_Request /"management" / "api-collections").GET <@ (user1) + + val responseApiEndpoint8 = makeGetRequest(requestApiEndpoint) + Then(s"we should get the error messages") + responseApiEndpoint8.code should equal(401) + responseApiEndpoint8.body.toString contains(s"$UserNotLoggedIn") should be (true) + + { + Then(s"we test the $ApiEndpoint8") + val responseApiEndpoint8 = makeGetRequest(requestApiEndpoint8) + Then(s"we should get the error messages") + responseApiEndpoint8.code should equal(403) + responseApiEndpoint8.body.toString contains(s"$UserHasMissingRoles") should be (true) + } + Then("grant the role and test it again") + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, ApiRole.canGetAllApiCollections.toString) + val responseApiEndpoint8WithRole = makeGetRequest(requestApiEndpoint8) + + Then("We should get a 200") + responseApiEndpoint8WithRole.code should equal(200) + val apiCollectionsResponseApiEndpoint8 = responseApiEndpoint8WithRole.body.extract[ApiCollectionsJson400] + apiCollectionsResponseApiEndpoint8.api_collections.head should be (apiCollectionJson400) + + } + } + +} diff --git a/obp-api/src/test/scala/code/api/v5_1_0/V510ServerSetup.scala b/obp-api/src/test/scala/code/api/v5_1_0/V510ServerSetup.scala new file mode 100644 index 000000000..8f5f24bc4 --- /dev/null +++ b/obp-api/src/test/scala/code/api/v5_1_0/V510ServerSetup.scala @@ -0,0 +1,26 @@ +package code.api.v5_1_0 + +import code.api.v4_0_0._ +import code.setup.{APIResponse, DefaultUsers, ServerSetupWithTestData} +import dispatch.Req +import scala.util.Random.nextInt + +trait V510ServerSetup extends ServerSetupWithTestData with DefaultUsers { + + def v4_0_0_Request: Req = baseRequest / "obp" / "v4.0.0" + def v5_0_0_Request: Req = baseRequest / "obp" / "v5.0.0" + def v5_1_0_Request: Req = baseRequest / "obp" / "v5.1.0" + + + def randomBankId : String = { + def getBanksInfo : APIResponse = { + val request = v4_0_0_Request / "banks" + makeGetRequest(request) + } + val banksJson = getBanksInfo.body.extract[BanksJson400] + val randomPosition = nextInt(banksJson.banks.size) + val bank = banksJson.banks(randomPosition) + bank.id + } + +} \ No newline at end of file From 34923a2931a1e4c910149a5a1e391481609ecfa6 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 20 Dec 2022 14:19:01 +0100 Subject: [PATCH 3/6] test/fixed the failed tests --- .../src/test/resources/frozen_type_meta_data | Bin 141022 -> 141029 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obp-api/src/test/resources/frozen_type_meta_data b/obp-api/src/test/resources/frozen_type_meta_data index 80ec0af9ed5f10837108f5bc1aaa9b9087c19271..1d577364c9ea4569e0f563693a6efad238893460 100644 GIT binary patch delta 45 zcmcb2mgDJJjt#R6MJ3WxOB@R_o%3^YQj<$E^Ye<`@{2Z4F)U?lmNnikYs`4?GXT8u B5|aP` delta 41 xcmaEQmgC-8jt#R6H*Yn}XA~4nPc3mQ$aK!n$w^Hv$;{7dRy5wOXv}!zGXQx55flIb From 49f4f5da20df5f6b708b8efbf2a84d25855429a8 Mon Sep 17 00:00:00 2001 From: hongwei Date: Tue, 20 Dec 2022 14:40:23 +0100 Subject: [PATCH 4/6] docfix/update the readme for stable version --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e905e86cd..1b06ee0b7 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,26 @@ Please refer to the [wiki](https://github.com/OpenBankProject/OBP-API/wiki) for OBP instances support multiple versions of the API simultaniously (unless they are deactivated in config) To see the status (DRAFT, STABLE or BLEEDING-EDGE) of an API version, look at the root endpoint e.g. /obp/v2.0.0/root or /obp/v3.0.0/root +``` +24.01.2017, [V1.2.1](https://apisandbox.openbankproject.com/obp/v1.2.1/root) was marked as stable. +24.01.2017, [V1.3.0](https://apisandbox.openbankproject.com/obp/v1.3.0/root) was marked as stable. +08.06.2017, [V2.0.0](https://apisandbox.openbankproject.com/obp/v2.0.0/root) was marked as stable. +27.10.2018, [V2.1.0](https://apisandbox.openbankproject.com/obp/v2.1.0/root) was marked as stable. +27.10.2018, [V2.2.0](https://apisandbox.openbankproject.com/obp/v2.2.0/root) was marked as stable. +18.11.2020, [V3.0.0](https://apisandbox.openbankproject.com/obp/v3.0.0/root) was marked as stable. +18.11.2020, [V3.1.0](https://apisandbox.openbankproject.com/obp/v3.1.0/root) was marked as stable. +16.12.2022, [V4.0.0](https://apisandbox.openbankproject.com/obp/v4.0.0/root) was marked as stable. +16.12.2022, [V5.0.0](https://apisandbox.openbankproject.com/obp/v5.0.0/root) was marked as stable. +``` + + + + + + + + -On the 8th of June 2017, [V2.0.0](https://apisandbox.openbankproject.com/obp/v2.0.0/root) was marked as stable. ## LICENSE . From e95a4c3310246b085e9afe4f443376ce38711c8a Mon Sep 17 00:00:00 2001 From: Hongwei Date: Wed, 21 Dec 2022 14:56:08 +0100 Subject: [PATCH 5/6] refactor/tweak the resourceDocs for Get All API Collections --- obp-api/src/main/scala/code/api/v5_1_0/APIMethods510.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 1db48df02..a89e93717 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 @@ -39,8 +39,8 @@ trait APIMethods510 { nameOf(getAllApiCollections), "GET", "/management/api-collections", - "Get All Api Collections", - s"""Get All Api Collections. + "Get All API Collections", + s"""Get All API Collections. | |${authenticationRequiredMessage(true)} |""".stripMargin, From ebb7d545640bdf3ab8944833b7d25eb21d411c4f Mon Sep 17 00:00:00 2001 From: Hongwei Date: Wed, 21 Dec 2022 15:11:28 +0100 Subject: [PATCH 6/6] refactor/tweak the role name to CanGetApiCollectionsForUser --- obp-api/src/main/scala/code/api/util/ApiRole.scala | 4 ++-- obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala | 2 +- .../src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/obp-api/src/main/scala/code/api/util/ApiRole.scala b/obp-api/src/main/scala/code/api/util/ApiRole.scala index 291c2461f..6d830fe84 100644 --- a/obp-api/src/main/scala/code/api/util/ApiRole.scala +++ b/obp-api/src/main/scala/code/api/util/ApiRole.scala @@ -323,8 +323,8 @@ object ApiRole { case class CanGetApiCollection(requiresBankId: Boolean = false) extends ApiRole lazy val canGetApiCollection = CanGetApiCollection() - case class CanGetAllApiCollectionsForUser(requiresBankId: Boolean = false) extends ApiRole - lazy val canGetAllApiCollectionsForUser = CanGetAllApiCollectionsForUser() + case class CanGetApiCollectionsForUser(requiresBankId: Boolean = false) extends ApiRole + lazy val canGetApiCollectionsForUser = CanGetApiCollectionsForUser() case class CanGetAllApiCollections(requiresBankId: Boolean = false) extends ApiRole lazy val canGetAllApiCollections = CanGetAllApiCollections() diff --git a/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala b/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala index 5ef2820f8..78701422e 100644 --- a/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala +++ b/obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala @@ -9065,7 +9065,7 @@ trait APIMethods400 { UnknownError ), List(apiTagApiCollection, apiTagNewStyle), - Some(canGetAllApiCollectionsForUser :: Nil) + Some(canGetApiCollectionsForUser :: Nil) ) lazy val getApiCollectionsForUser: OBPEndpoint = { diff --git a/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala index 363ef1a14..c621658d2 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/ApiCollectionTest.scala @@ -232,7 +232,7 @@ class ApiCollectionTest extends V400ServerSetup { responseApiEndpoint6.body.toString contains(s"$UserHasMissingRoles") should be (true) Then("grant the role and test it again") - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, ApiRole.canGetAllApiCollectionsForUser.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, ApiRole.canGetApiCollectionsForUser.toString) val responseApiEndpoint6WithRole = makeGetRequest(requestApiEndpoint6) Then("We should get a 200")