From 47b855fc742a63af0cf0e11620d04605f811a4fb Mon Sep 17 00:00:00 2001 From: Shuang Date: Thu, 3 Nov 2022 07:34:50 +0800 Subject: [PATCH 01/11] Add customer special dynamic entities --- .../ResourceDocsAPIMethods.scala | 5 +- .../endpoint/APIMethodsDynamicEndpoint.scala | 19 +- .../helper/DynamicEndpointHelper.scala | 2 +- .../endpoint/helper/DynamicEntityHelper.scala | 449 ------------------ .../entity/APIMethodsDynamicEntity.scala | 110 ++++- .../entity/helper/DynamicEntityHelper.scala | 240 ++++++++-- .../main/scala/code/api/util/APIUtil.scala | 7 +- .../main/scala/code/api/util/ApiRole.scala | 3 +- .../main/scala/code/api/util/NewStyle.scala | 9 +- .../scala/code/api/v4_0_0/APIMethods400.scala | 17 +- .../scala/code/bankconnectors/Connector.scala | 2 + .../bankconnectors/LocalMappedConnector.scala | 12 +- .../rest/RestConnector_vMar2019.scala | 2 + .../StoredProcedureConnector_vDec2019.scala | 2 + .../dynamicEntity/DynamicDataProvider.scala | 20 +- .../dynamicEntity/DynamicEntityProvider.scala | 17 +- .../MapppedDynamicDataProvider.scala | 146 ++++-- .../MapppedDynamicEntityProvider.scala | 3 + .../code/entitlement/MappedEntitlements.scala | 2 +- .../v4_0_0/DynamicEndpointHelperTest.scala | 6 +- .../code/api/v4_0_0/DynamicEntityTest.scala | 317 +++++++++++++ 21 files changed, 784 insertions(+), 606 deletions(-) delete mode 100644 obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEntityHelper.scala diff --git a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala index ac5fe55b5..3a9bcad00 100644 --- a/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala +++ b/obp-api/src/main/scala/code/api/ResourceDocs1_4_0/ResourceDocsAPIMethods.scala @@ -4,12 +4,13 @@ import java.util.UUID.randomUUID import code.api.OBPRestHelper import code.api.builder.OBP_APIBuilder import code.api.cache.Caching -import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEndpoints, DynamicEntityHelper} +import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEndpoints} +import code.api.dynamic.entity.helper.DynamicEntityHelper import code.api.util.APIUtil._ import code.api.util.ApiRole.{canReadDynamicResourceDocsAtOneBank, canReadResourceDoc, canReadStaticResourceDoc} import code.api.util.ApiTag._ import code.api.util.ExampleValue.endpointMappingRequestBodyExample -import code.api.util.{APIUtil, _} +import code.api.util._ import code.api.v1_4_0.JSONFactory1_4_0.ResourceDocsJson import code.api.v1_4_0.{APIMethods140, JSONFactory1_4_0, OBPAPI1_4_0} import code.api.v2_2_0.{APIMethods220, OBPAPI2_2_0} diff --git a/obp-api/src/main/scala/code/api/dynamic/endpoint/APIMethodsDynamicEndpoint.scala b/obp-api/src/main/scala/code/api/dynamic/endpoint/APIMethodsDynamicEndpoint.scala index 2b0cdeca7..126201d87 100644 --- a/obp-api/src/main/scala/code/api/dynamic/endpoint/APIMethodsDynamicEndpoint.scala +++ b/obp-api/src/main/scala/code/api/dynamic/endpoint/APIMethodsDynamicEndpoint.scala @@ -1,10 +1,11 @@ package code.api.dynamic.endpoint import code.DynamicData.{DynamicData, DynamicDataProvider} -import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEntityHelper, DynamicEntityInfo, EntityName, MockResponseHolder} +import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, MockResponseHolder} import code.api.dynamic.endpoint.helper.DynamicEndpointHelper.DynamicReq import code.api.dynamic.endpoint.helper.MockResponseHolder -import code.api.util.APIUtil.{fullBoxOrException, _} +import code.api.dynamic.entity.helper.{DynamicEntityHelper, DynamicEntityInfo, EntityName} +import code.api.util.APIUtil._ import code.api.util.ErrorMessages._ import code.api.util.NewStyle.HttpCode import code.api.util._ @@ -98,7 +99,7 @@ trait APIMethodsDynamicEndpoint { DynamicEndpointHelper.getEntityNameKeyAndValue(responseMappingString, pathParams) } dynamicData <- Future { - DynamicDataProvider.connectorMethodProvider.vend.getAll(bankId, entityName) + DynamicDataProvider.connectorMethodProvider.vend.getAll(bankId, entityName, None, false) } dynamicJsonData = JArray(dynamicData.map(it => net.liftweb.json.parse(it.dataJson)).map(_.asInstanceOf[JObject])) // //We only get the value, but not sure the field name of it. @@ -127,7 +128,7 @@ trait APIMethodsDynamicEndpoint { } //build the entity body according to the request json and mapping entityBody = JsonUtils.buildJson(json, requestMappingJvalue) - (box, _) <- NewStyle.function.invokeDynamicConnector(CREATE, entityName, Some(entityBody.asInstanceOf[JObject]), None, None, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(CREATE, entityName, Some(entityBody.asInstanceOf[JObject]), None, None, None, None, false, Some(cc)) singleObject: JValue = unboxResult(box.asInstanceOf[Box[JValue]], entityName) responseBodyScheme = DynamicEndpointHelper.prepareMappingFields(responseMappingJvalue) responseBody = JsonUtils.buildJson(singleObject, responseBodyScheme) @@ -139,13 +140,13 @@ trait APIMethodsDynamicEndpoint { (entityName, entityIdKey, entityIdValueFromUrl) <- NewStyle.function.tryons(s"$InvalidEndpointMapping `response_mapping` must be linked to at least one valid dynamic entity!", 400, cc.callContext) { DynamicEndpointHelper.getEntityNameKeyAndValue(responseMappingString, pathParams) } - dynamicData = DynamicDataProvider.connectorMethodProvider.vend.getAll(bankId, entityName) + dynamicData = DynamicDataProvider.connectorMethodProvider.vend.getAll(bankId, entityName, None,false) dynamicJsonData = JArray(dynamicData.map(it => net.liftweb.json.parse(it.dataJson)).map(_.asInstanceOf[JObject])) entityObject = DynamicEndpointHelper.getObjectByKeyValuePair(dynamicJsonData, entityIdKey, entityIdValueFromUrl.get) isDeleted <- NewStyle.function.tryons(s"$InvalidEndpointMapping `response_mapping` must be linked to at least one valid dynamic entity!", 400, cc.callContext) { val entityIdName = DynamicEntityHelper.createEntityId(entityName) val entityIdValue = (entityObject \ entityIdName).asInstanceOf[JString].s - DynamicDataProvider.connectorMethodProvider.vend.delete(bankId, entityName, entityIdValue).head + DynamicDataProvider.connectorMethodProvider.vend.delete(bankId, entityName, entityIdValue, None, false).head } } yield { JBool(isDeleted) @@ -155,16 +156,16 @@ trait APIMethodsDynamicEndpoint { (entityName, entityIdKey, entityIdValueFromUrl) <- NewStyle.function.tryons(s"$InvalidEndpointMapping `response_mapping` must be linked to at least one valid dynamic entity!", 400, cc.callContext) { DynamicEndpointHelper.getEntityNameKeyAndValue(responseMappingString, pathParams) } - dynamicData = DynamicDataProvider.connectorMethodProvider.vend.getAll(bankId, entityName) + dynamicData = DynamicDataProvider.connectorMethodProvider.vend.getAll(bankId, entityName, None, false) dynamicJsonData = JArray(dynamicData.map(it => net.liftweb.json.parse(it.dataJson)).map(_.asInstanceOf[JObject])) entityObject = DynamicEndpointHelper.getObjectByKeyValuePair(dynamicJsonData, entityIdKey, entityIdValueFromUrl.get) _ <- NewStyle.function.tryons(s"$InvalidEndpointMapping `response_mapping` must be linked to at least one valid dynamic entity!", 400, cc.callContext) { val entityIdName = DynamicEntityHelper.createEntityId(entityName) val entityIdValue = (entityObject \ entityIdName).asInstanceOf[JString].s - DynamicDataProvider.connectorMethodProvider.vend.delete(bankId, entityName, entityIdValue).head + DynamicDataProvider.connectorMethodProvider.vend.delete(bankId, entityName, entityIdValue, None, false).head } entityBody = JsonUtils.buildJson(json, requestMappingJvalue) - (box, _) <- NewStyle.function.invokeDynamicConnector(CREATE, entityName, Some(entityBody.asInstanceOf[JObject]), None, bankId, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(CREATE, entityName, Some(entityBody.asInstanceOf[JObject]), None, bankId, None, None, false, Some(cc)) singleObject: JValue = unboxResult(box.asInstanceOf[Box[JValue]], entityName) responseBodyScheme = DynamicEndpointHelper.prepareMappingFields(responseMappingJvalue) responseBody = JsonUtils.buildJson(singleObject, responseBodyScheme) diff --git a/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala b/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala index 43879e0c1..c1bdc96c8 100644 --- a/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala @@ -1043,7 +1043,7 @@ object DynamicEndpointHelper extends RestHelper { def deleteObjectByKeyValuePair (dynamicDataList: List[DynamicDataT], jsonArray: JArray, key:String, value:String): JValue = { val dynamicDataJson = getObjectByKeyValuePair(jsonArray: JArray, key:String, value:String) val (dynamicEntityName, dynamicDateId) = findDynamicData(dynamicDataList, dynamicDataJson) - JBool(DynamicDataProvider.connectorMethodProvider.vend.delete(None, dynamicEntityName, dynamicDateId).getOrElse(false)) + JBool(DynamicDataProvider.connectorMethodProvider.vend.delete(None, dynamicEntityName, dynamicDateId, None, false).getOrElse(false)) } def addedBankToPath(swagger: String, bankId: Option[String]): JValue = { diff --git a/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEntityHelper.scala b/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEntityHelper.scala deleted file mode 100644 index c4c4a0b7c..000000000 --- a/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEntityHelper.scala +++ /dev/null @@ -1,449 +0,0 @@ -package code.api.dynamic.endpoint.helper - -import code.api.util.APIUtil.{EmptyBody, ResourceDoc, authenticationRequiredMessage, generateUUID} -import code.api.util.ApiRole.getOrCreateDynamicApiRole -import code.api.util.ApiTag._ -import code.api.util.ErrorMessages.{InvalidJsonFormat, UnknownError, UserHasMissingRoles, UserNotLoggedIn} -import code.api.util._ -import com.openbankproject.commons.model.enums.{DynamicEntityFieldType, DynamicEntityOperation} -import com.openbankproject.commons.util.ApiVersion -import net.liftweb.json.JsonDSL._ -import net.liftweb.json._ -import net.liftweb.util.StringHelpers -import org.apache.commons.lang3.StringUtils - -import scala.collection.immutable.{List, Nil} -import scala.collection.mutable -import scala.collection.mutable.ArrayBuffer - - -object EntityName { - // unapply result structure: (BankId, entityName, id) - def unapply(url: List[String]): Option[(Option[String], String, String)] = url match { - //no bank: - //eg: /FooBar21 - case entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) - .map(_ => (None, entityName, "")) - //eg: /FooBar21/FOO_BAR21_ID - case entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) - .map(_ => (None, entityName, id)) - - //contains Bank: - //eg: /Banks/BANK_ID/FooBar21 - case "banks" :: bankId :: entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) - .map(_ => (Some(bankId), entityName, "")) - //eg: /Banks/BANK_ID/FooBar21/FOO_BAR21_ID - case "banks" :: bankId :: entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) - .map(_ => (Some(bankId),entityName, id)) - - case _ => None - } -} - -object DynamicEntityHelper { - private val implementedInApiVersion = ApiVersion.v4_0_0 - - // (Some(BankId), EntityName, DynamicEntityInfo) - def definitionsMap: Map[(Option[String], String), DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None).map(it => ((it.bankId, it.entityName), DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId))).toMap - - def dynamicEntityRoles: List[String] = NewStyle.function.getDynamicEntities(None).flatMap(dEntity => DynamicEntityInfo.roleNames(dEntity.entityName, dEntity.bankId)) - - def doc: ArrayBuffer[ResourceDoc] = { - val docs = operationToResourceDoc.values.toList - collection.mutable.ArrayBuffer(docs:_*) - } - - def createEntityId(entityName: String) = { - // (?<=[a-z0-9])(?=[A-Z]) --> mean `Positive Lookbehind (?<=[a-z0-9])` && Positive Lookahead (?=[A-Z]) --> So we can find the space to replace to `_` - val regexPattern = "(?<=[a-z0-9])(?=[A-Z])|-" - // eg: entityName = PetEntity => entityIdName = pet_entity_id - s"${entityName}_Id".replaceAll(regexPattern, "_").toLowerCase - } - - def operationToResourceDoc: Map[(DynamicEntityOperation, String), ResourceDoc] = { - val addPrefix = APIUtil.getPropsAsBoolValue("dynamic_entities_have_prefix", true) - - // record exists tag names, to avoid duplicated dynamic tag name. - var existsTagNames = ApiTag.staticTagNames - // match string that start with _, e.g: "_abc" - val Regex = "(_+)(.+)".r - - - //convert entity name to tag name, example: - // Csem-case -> Csem Case - // _Csem-case -> _Csem Case - // Csem_case -> Csem Case - // _Csem_case -> _Csem Case - // csem-case -> Csem Case - def prettyTagName(s: String) = s.capitalize.split("(?<=[^-_])[-_]+").reduceLeft(_ + " " + _.capitalize) - - def apiTag(entityName: String, singularName: String): ResourceDocTag = { - - val existsSameStaticEntity: Boolean = existsTagNames - .exists(it => it.equalsIgnoreCase(singularName) || it.equalsIgnoreCase(entityName)) - - - val tagName = if(addPrefix || existsSameStaticEntity) { - var name = singularName match { - case Regex(a,b) => s"$a${b.capitalize}" - case v => s"_${v.capitalize}" - } - - while(existsTagNames.exists(it => it.equalsIgnoreCase(name))) { - name = s"_$name" - } - prettyTagName(name) - } else { - prettyTagName(singularName.capitalize) - } - - existsTagNames += tagName - ApiTag(tagName) - } - val fun: DynamicEntityInfo => mutable.Map[(DynamicEntityOperation, String), ResourceDoc] = createDocs(apiTag) - val docs: Iterable[((DynamicEntityOperation, String), ResourceDoc)] = definitionsMap.values.flatMap(fun) - docs.toMap - } - - // TODO the requestBody and responseBody is not correct ref type - /** - * - * @param fun (singularName, entityName) => ResourceDocTag - * @param dynamicEntityInfo dynamicEntityInfo - * @return all ResourceDoc of given dynamicEntity - */ - private def createDocs(fun: (String, String) => ResourceDocTag) - (dynamicEntityInfo: DynamicEntityInfo): mutable.Map[(DynamicEntityOperation, String), ResourceDoc] = { - val entityName = dynamicEntityInfo.entityName - // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] - val capitalizedNameParts = entityName.split("(?<=[a-z0-9])(?=[A-Z])|-|_").map(_.capitalize).filterNot(_.trim.isEmpty) - val splitName = s"""${capitalizedNameParts.mkString(" ")}""" - val splitNameWithBankId = if (dynamicEntityInfo.bankId.isDefined) - s"""$splitName(${dynamicEntityInfo.bankId.getOrElse("")})""" - else - s"""$splitName""" - - val idNameInUrl = StringHelpers.snakify(dynamicEntityInfo.idName).toUpperCase() - val listName = dynamicEntityInfo.listName - val bankId = dynamicEntityInfo.bankId - val resourceDocUrl = if(bankId.isDefined) s"/banks/${bankId.getOrElse("")}/$entityName" else s"/$entityName" - - val endPoint = APIUtil.dynamicEndpointStub - - // (operationType, entityName) -> ResourceDoc - val resourceDocs = scala.collection.mutable.Map[(DynamicEntityOperation, String),ResourceDoc]() - val apiTag: ResourceDocTag = fun(entityName,splitNameWithBankId) - - resourceDocs += (DynamicEntityOperation.GET_ALL, splitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildGetAllFunctionName(bankId, entityName), - "GET", - s"$resourceDocUrl", - s"Get $splitName List", - s"""Get $splitName List. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |Can do filter on the fields - |e.g: /${entityName}?name=James%20Brown&number=123.456&number=11.11 - |Will do filter by this rule: name == "James Brown" && (number==123.456 || number=11.11) - |""".stripMargin, - EmptyBody, - dynamicEntityInfo.getExampleList, - List( - UserNotLoggedIn, - UserHasMissingRoles, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - Some(List(dynamicEntityInfo.canGetRole)), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.GET_ONE, splitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildGetOneFunctionName(bankId, entityName), - "GET", - s"$resourceDocUrl/$idNameInUrl", - s"Get $splitName by id", - s"""Get $splitName by id. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - |""".stripMargin, - EmptyBody, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - UserHasMissingRoles, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - Some(List(dynamicEntityInfo.canGetRole)), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.CREATE, splitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildCreateFunctionName(bankId, entityName), - "POST", - s"$resourceDocUrl", - s"Create new $splitName", - s"""Create new $splitName. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |""", - dynamicEntityInfo.getSingleExampleWithoutId, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - UserHasMissingRoles, - InvalidJsonFormat, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - Some(List(dynamicEntityInfo.canCreateRole)), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.UPDATE, splitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildUpdateFunctionName(bankId, entityName), - "PUT", - s"$resourceDocUrl/$idNameInUrl", - s"Update $splitName", - s"""Update $splitName. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |""", - dynamicEntityInfo.getSingleExampleWithoutId, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - UserHasMissingRoles, - InvalidJsonFormat, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - Some(List(dynamicEntityInfo.canUpdateRole)), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.DELETE, splitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildDeleteFunctionName(bankId, entityName), - "DELETE", - s"$resourceDocUrl/$idNameInUrl", - s"Delete $splitName by id", - s"""Delete $splitName by id - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |""", - dynamicEntityInfo.getSingleExampleWithoutId, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - UserHasMissingRoles, - InvalidJsonFormat, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - Some(List(dynamicEntityInfo.canDeleteRole)), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs - } - - private def buildCreateFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_create${entityName}_${bankId.getOrElse("")}" - private def buildUpdateFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_update${entityName}_${bankId.getOrElse("")}" - private def buildDeleteFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_delete${entityName}_${bankId.getOrElse("")}" - private def buildGetOneFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_getSingle${entityName}_${bankId.getOrElse("")}" - private def buildGetAllFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_get${entityName}List_${bankId.getOrElse("")}" - - @inline - private def buildOperationId(bankId:Option[String], entityName: String, fun: (Option[String], String) => String): String = { - APIUtil.buildOperationId(implementedInApiVersion, fun(bankId, entityName)) - } - - def buildCreateOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildCreateFunctionName) - def buildUpdateOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildUpdateFunctionName) - def buildDeleteOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildDeleteFunctionName) - def buildGetOneOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildGetOneFunctionName) - def buildGetAllOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildGetAllFunctionName) - - private def methodRoutingExample(entityName: String) = - s""" - |MethodRouting settings example: - | - |
- | - |``` - |{ - | "is_bank_id_exact_match":false, - | "method_name":"dynamicEntityProcess", - | "connector_name":"rest_vMar2019", - | "bank_id_pattern":".*", - | "parameters":[ - | { - | "key":"entityName", - | "value":"$entityName" - | } - | { - | "key":"url", - | "value":"http://mydomain.com/xxx" - | } - | ] - |} - |``` - | - |
- |""".stripMargin - -} -case class DynamicEntityInfo(definition: String, entityName: String, bankId: Option[String]) { - - import net.liftweb.json - - val subEntities: List[DynamicEntityInfo] = Nil - - val idName = StringUtils.uncapitalize(entityName) + "Id" - - val listName = StringHelpers.snakify(entityName).replaceFirst("[-_]*$", "_list") - - val singleName = StringHelpers.snakify(entityName).replaceFirst("[-_]*$", "") - - val jsonTypeMap: Map[String, Class[_]] = DynamicEntityFieldType.nameToValue.mapValues(_.jValueType) - - val definitionJson = json.parse(definition).asInstanceOf[JObject] - val entity = (definitionJson \ entityName).asInstanceOf[JObject] - - val description = entity \ "description" match { - case JString(s) if StringUtils.isNotBlank(s) => - s""" - |${s.capitalize} - |""".stripMargin - case _ => "" - } - - val fieldsDescription = { - val descriptions = (entity \ "properties") - .asInstanceOf[JObject] - .obj - .filter(field => - field.value \ "description" match { - case JString(s) if StringUtils.isNotBlank(s) => true - case _ => false - } - ) - if(descriptions.nonEmpty) { - descriptions - .map(field => s"""* ${field.name}: ${(field.value \ "description").asInstanceOf[JString].s}""") - .mkString("**Property List:** \n\n", "\n", "") - } else { - "" - } - } - - def toResponse(result: JObject, id: Option[String]): JObject = { - - val fieldNameToTypeName: Map[String, String] = (entity \ "properties") - .asInstanceOf[JObject] - .obj - .map(field => (field.name, (field.value \ "type").asInstanceOf[JString].s)) - .toMap - - val fieldNameToType: Map[String, Class[_]] = fieldNameToTypeName - .mapValues(jsonTypeMap(_)) - - val fields = result.obj.filter(it => fieldNameToType.keySet.contains(it.name)) - - (id, fields.exists(_.name == idName)) match { - case (Some(idValue), false) => JObject(JField(idName, JString(idValue)) :: fields) - case _ => JObject(fields) - } - } - - def getSingleExampleWithoutId: JObject = { - val fields = (entity \ "properties").asInstanceOf[JObject].obj - - def extractExample(typeAndExample: JValue): JValue = { - val example = typeAndExample \ "example" - (example, (typeAndExample \ "type")) match { - case (JString(s), JString("boolean")) => JBool(s.toLowerCase().toBoolean) - case (JString(s), JString("integer")) => JInt(s.toLong) - case (JString(s), JString("number")) => JDouble(s.toDouble) - case _ => example - } - } - val exampleFields = fields.map(field => JField(field.name, extractExample(field.value))) - JObject(exampleFields) - } - val bankIdJObject: JObject = ("bank-id" -> ExampleValue.bankIdExample.value) - - def getSingleExample: JObject = if (bankId.isDefined){ - val SingleObject: JObject = (singleName -> (JObject(JField(idName, JString(generateUUID())) :: getSingleExampleWithoutId.obj))) - bankIdJObject merge SingleObject - } else{ - (singleName -> (JObject(JField(idName, JString(generateUUID())) :: getSingleExampleWithoutId.obj))) - } - - def getExampleList: JObject = if (bankId.isDefined){ - val objectList: JObject = (listName -> JArray(List(getSingleExample))) - bankIdJObject merge objectList - } else{ - (listName -> JArray(List(getSingleExample))) - } - - val canCreateRole: ApiRole = DynamicEntityInfo.canCreateRole(entityName, bankId) - val canUpdateRole: ApiRole = DynamicEntityInfo.canUpdateRole(entityName, bankId) - val canGetRole: ApiRole = DynamicEntityInfo.canGetRole(entityName, bankId) - val canDeleteRole: ApiRole = DynamicEntityInfo.canDeleteRole(entityName, bankId) -} - -object DynamicEntityInfo { - def canCreateRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanCreateDynamicEntity_" + entityName, bankId.isDefined) - def canUpdateRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanUpdateDynamicEntity_" + entityName, bankId.isDefined) - def canGetRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanGetDynamicEntity_" + entityName, bankId.isDefined) - def canDeleteRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanDeleteDynamicEntity_" + entityName, bankId.isDefined) - - def roleNames(entityName: String, bankId:Option[String]): List[String] = List( - canCreateRole(entityName, bankId), - canUpdateRole(entityName, bankId), - canGetRole(entityName, bankId), - canDeleteRole(entityName, bankId) - ).map(_.toString()) -} \ No newline at end of file diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala b/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala index 6fe1bd69a..b42fe5803 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala @@ -1,10 +1,11 @@ package code.api.dynamic.entity import code.DynamicData.{DynamicData, DynamicDataProvider} -import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEntityHelper, DynamicEntityInfo, EntityName, MockResponseHolder} +import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, MockResponseHolder} import code.api.dynamic.endpoint.helper.DynamicEndpointHelper.DynamicReq import code.api.dynamic.endpoint.helper.MockResponseHolder -import code.api.util.APIUtil.{fullBoxOrException, _} +import code.api.dynamic.entity.helper.{DynamicEntityHelper, DynamicEntityInfo, EntityName} +import code.api.util.APIUtil._ import code.api.util.ErrorMessages._ import code.api.util.NewStyle.HttpCode import code.api.util._ @@ -64,7 +65,7 @@ trait APIMethodsDynamicEntity { case map if map.isEmpty => resultList case params => val filteredWithFieldValue = resultList.arr.filter { jValue => - params.forall { kv => + params.filter(_._1!="locale").forall { kv => val (path, values) = kv values.exists(JsonUtils.isFieldEquals(jValue, path, _)) } @@ -75,13 +76,25 @@ trait APIMethodsDynamicEntity { } lazy val genericEndpoint: OBPEndpoint = { - case EntityName(bankId, entityName, id) JsonGet req => { cc => + case EntityName(bankId, entityName, id, isPersonalEntity) JsonGet req => { cc => val listName = StringHelpers.snakify(entityName).replaceFirst("[-_]*$", "_list") val singleName = StringHelpers.snakify(entityName).replaceFirst("[-_]*$", "") val isGetAll = StringUtils.isBlank(id) + // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] + val capitalizedNameParts = entityName.split("(?<=[a-z0-9])(?=[A-Z])|-|_").map(_.capitalize).filterNot(_.trim.isEmpty) + val splitName = s"""${capitalizedNameParts.mkString(" ")}""" + val splitNameWithBankId = if (bankId.isDefined) + s"""$splitName(${bankId.getOrElse("")})""" + else + s"""$splitName""" + val mySplitNameWithBankId = s"My$splitNameWithBankId" + val operation: DynamicEntityOperation = if (StringUtils.isBlank(id)) GET_ALL else GET_ONE - val resourceDoc = DynamicEntityHelper.operationToResourceDoc.get(operation -> entityName) + val resourceDoc = if(isPersonalEntity) + DynamicEntityHelper.operationToResourceDoc.get(operation -> mySplitNameWithBankId) + else + DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) val operationId = resourceDoc.map(_.operationId).orNull val callContext = cc.copy(operationId = Some(operationId), resourceDocument = resourceDoc) // process before authentication interceptor, get intercept result @@ -99,7 +112,11 @@ trait APIMethodsDynamicEntity { } } - _ <- NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canGetRole(entityName, bankId), callContext) + _ <- if (isPersonalEntity) { + Future.successful(true) + } else { + NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canGetRole(entityName, bankId), callContext) + } // process after authentication interceptor, get intercept result jsonResponse: Box[ErrorMessage] = afterAuthenticateInterceptResult(callContext, operationId).collect({ @@ -109,7 +126,11 @@ trait APIMethodsDynamicEntity { jsonResponse.isEmpty } - (box, _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, None, Option(id).filter(StringUtils.isNotBlank), bankId, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, None, Option(id).filter(StringUtils.isNotBlank), bankId, None, + Some(u.userId), + isPersonalEntity, + Some(cc) + ) _ <- Helper.booleanToFuture(EntityNotFoundByEntityId, 404, cc = callContext) { box.isDefined @@ -139,8 +160,7 @@ trait APIMethodsDynamicEntity { (jValue, HttpCode.`200`(Some(cc))) } } - - case EntityName(bankId, entityName, _) JsonPost json -> _ => { cc => + case EntityName(bankId, entityName, _, isPersonalEntity) JsonPost json -> _ => { cc => val singleName = StringHelpers.snakify(entityName).replaceFirst("[-_]*$", "") val operation: DynamicEntityOperation = CREATE // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] @@ -150,7 +170,13 @@ trait APIMethodsDynamicEntity { s"""$splitName(${bankId.getOrElse("")})""" else s"""$splitName""" - val resourceDoc = DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) + val mySplitNameWithBankId = s"My$splitNameWithBankId" + + val resourceDoc = if(isPersonalEntity) + DynamicEntityHelper.operationToResourceDoc.get(operation -> mySplitNameWithBankId) + else + DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) + val operationId = resourceDoc.map(_.operationId).orNull val callContext = cc.copy(operationId = Some(operationId), resourceDocument = resourceDoc) @@ -167,7 +193,12 @@ trait APIMethodsDynamicEntity { ("", callContext) } } - _ <- NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canCreateRole(entityName, bankId), callContext) + + _ <- if (isPersonalEntity) { + Future.successful(true) + } else { + NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canCreateRole(entityName, bankId), callContext) + } // process after authentication interceptor, get intercept result jsonResponse: Box[ErrorMessage] = afterAuthenticateInterceptResult(callContext, operationId).collect({ @@ -177,7 +208,7 @@ trait APIMethodsDynamicEntity { jsonResponse.isEmpty } - (box, _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, Some(json.asInstanceOf[JObject]), None, bankId, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, Some(json.asInstanceOf[JObject]), None, bankId, None, Some(u.userId), isPersonalEntity, Some(cc)) singleObject: JValue = unboxResult(box.asInstanceOf[Box[JValue]], entityName) } yield { val result: JObject = (singleName -> singleObject) @@ -190,7 +221,7 @@ trait APIMethodsDynamicEntity { (entity, HttpCode.`201`(Some(cc))) } } - case EntityName(bankId, entityName, id) JsonPut json -> _ => { cc => + case EntityName(bankId, entityName, id, isPersonalEntity) JsonPut json -> _ => { cc => val singleName = StringHelpers.snakify(entityName).replaceFirst("[-_]*$", "") val operation: DynamicEntityOperation = UPDATE // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] @@ -200,7 +231,13 @@ trait APIMethodsDynamicEntity { s"""$splitName(${bankId.getOrElse("")})""" else s"""$splitName""" - val resourceDoc = DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) + val mySplitNameWithBankId = s"My$splitNameWithBankId" + + val resourceDoc = if(isPersonalEntity) + DynamicEntityHelper.operationToResourceDoc.get(operation -> mySplitNameWithBankId) + else + DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) + val operationId = resourceDoc.map(_.operationId).orNull val callContext = cc.copy(operationId = Some(operationId), resourceDocument = resourceDoc) @@ -217,7 +254,11 @@ trait APIMethodsDynamicEntity { ("", callContext) } } - _ <- NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canUpdateRole(entityName, bankId), callContext) + _ <- if (isPersonalEntity) { + Future.successful(true) + } else { + NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canUpdateRole(entityName, bankId), callContext) + } // process after authentication interceptor, get intercept result jsonResponse: Box[ErrorMessage] = afterAuthenticateInterceptResult(callContext, operationId).collect({ @@ -227,11 +268,17 @@ trait APIMethodsDynamicEntity { jsonResponse.isEmpty } - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ONE, entityName, None, Some(id), bankId, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ONE, entityName, None, Some(id), bankId, None, + Some(u.userId), + isPersonalEntity, + Some(cc)) _ <- Helper.booleanToFuture(EntityNotFoundByEntityId, 404, cc = callContext) { box.isDefined } - (box: Box[JValue], _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, Some(json.asInstanceOf[JObject]), Some(id), bankId, None, Some(cc)) + (box: Box[JValue], _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, Some(json.asInstanceOf[JObject]), Some(id), bankId, None, + Some(u.userId), + isPersonalEntity, + Some(cc)) singleObject: JValue = unboxResult(box.asInstanceOf[Box[JValue]], entityName) } yield { val result: JObject = (singleName -> singleObject) @@ -244,7 +291,7 @@ trait APIMethodsDynamicEntity { (entity, HttpCode.`200`(Some(cc))) } } - case EntityName(bankId, entityName, id) JsonDelete _ => { cc => + case EntityName(bankId, entityName, id, isPersonalEntity) JsonDelete _ => { cc => val operation: DynamicEntityOperation = DELETE // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] val capitalizedNameParts = entityName.split("(?<=[a-z0-9])(?=[A-Z])|-|_").map(_.capitalize).filterNot(_.trim.isEmpty) @@ -253,7 +300,13 @@ trait APIMethodsDynamicEntity { s"""$splitName(${bankId.getOrElse("")})""" else s"""$splitName""" - val resourceDoc = DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) + val mySplitNameWithBankId = s"My$splitNameWithBankId" + + val resourceDoc = if(isPersonalEntity) + DynamicEntityHelper.operationToResourceDoc.get(operation -> mySplitNameWithBankId) + else + DynamicEntityHelper.operationToResourceDoc.get(operation -> splitNameWithBankId) + val operationId = resourceDoc.map(_.operationId).orNull val callContext = cc.copy(operationId = Some(operationId), resourceDocument = resourceDoc) @@ -270,7 +323,12 @@ trait APIMethodsDynamicEntity { ("", callContext) } } - _ <- NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canDeleteRole(entityName, bankId), callContext) + + _ <- if (isPersonalEntity) { + Future.successful(true) + } else { + NewStyle.function.hasEntitlement(bankId.getOrElse(""), u.userId, DynamicEntityInfo.canDeleteRole(entityName, bankId), callContext) + } // process after authentication interceptor, get intercept result jsonResponse: Box[ErrorMessage] = afterAuthenticateInterceptResult(callContext, operationId).collect({ @@ -280,11 +338,19 @@ trait APIMethodsDynamicEntity { jsonResponse.isEmpty } - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ONE, entityName, None, Some(id), bankId, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ONE, entityName, None, Some(id), bankId, None, + Some(u.userId), + isPersonalEntity, + Some(cc) + ) _ <- Helper.booleanToFuture(EntityNotFoundByEntityId, 404, cc = callContext) { box.isDefined } - (box, _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, None, Some(id), bankId, None, Some(cc)) + (box, _) <- NewStyle.function.invokeDynamicConnector(operation, entityName, None, Some(id), bankId, None, + Some(u.userId), + isPersonalEntity, + Some(cc) + ) deleteResult: JBool = unboxResult(box.asInstanceOf[Box[JBool]], entityName) } yield { (deleteResult, HttpCode.`204`(Some(cc))) diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala index 7f4891475..99589fed8 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala @@ -18,27 +18,45 @@ import scala.collection.mutable.ArrayBuffer object EntityName { - // unapply result structure: (BankId, entityName, id) - def unapply(url: List[String]): Option[(Option[String], String, String)] = url match { - //no bank: + // unapply result structure: (BankId, entityName, id, isPersonalEntity) + def unapply(url: List[String]): Option[(Option[String], String, String, Boolean)] = url match { //eg: /FooBar21 case entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1 == entityName && definitionMap._2.bankId.isEmpty) - .map(_ => (None, entityName, "")) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + .map(_ => (None, entityName, "", false)) //eg: /FooBar21/FOO_BAR21_ID case entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1 == entityName && definitionMap._2.bankId.isEmpty) - .map(_ => (None, entityName, id)) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + .map(_ => (None, entityName, id, false)) + + + //eg: /my/FooBar21 + case "my" :: entityName :: Nil => + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + .map(_ => (None, entityName, "", true)) + //eg: /my/FooBar21/FOO_BAR21_ID + case "my" :: entityName :: id :: Nil => + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + .map(_ => (None, entityName, id, true)) + //eg: /Banks/BANK_ID/my/FooBar21 + case "banks" :: bankId :: "my" :: entityName :: Nil => + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) + .map(_ => (Some(bankId), entityName, "", true)) + //eg: /Banks/BANK_ID/my/FooBar21/FOO_BAR21_ID + case "banks" :: bankId :: "my" :: entityName :: id :: Nil => + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) + .map(_ => (Some(bankId),entityName, id, true)) + //contains Bank: //eg: /Banks/BANK_ID/FooBar21 case "banks" :: bankId :: entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1 == entityName && definitionMap._2.bankId == Some(bankId)) - .map(_ => (Some(bankId), entityName, "")) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) + .map(_ => (Some(bankId), entityName, "", false)) //eg: /Banks/BANK_ID/FooBar21/FOO_BAR21_ID case "banks" :: bankId :: entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1 == entityName && definitionMap._2.bankId == Some(bankId)) - .map(_ => (Some(bankId),entityName, id)) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) + .map(_ => (Some(bankId),entityName, id, false))//no bank: case _ => None } @@ -46,8 +64,9 @@ object EntityName { object DynamicEntityHelper { private val implementedInApiVersion = ApiVersion.v4_0_0 - - def definitionsMap: Map[String, DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None).map(it => (it.entityName, DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId))).toMap + + // (Some(BankId), EntityName, DynamicEntityInfo) + def definitionsMap: Map[(Option[String], String), DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None).map(it => ((it.bankId, it.entityName), DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId))).toMap def dynamicEntityRoles: List[String] = NewStyle.function.getDynamicEntities(None).flatMap(dEntity => DynamicEntityInfo.roleNames(dEntity.entityName, dEntity.bankId)) @@ -120,23 +139,30 @@ object DynamicEntityHelper { val entityName = dynamicEntityInfo.entityName // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] val capitalizedNameParts = entityName.split("(?<=[a-z0-9])(?=[A-Z])|-|_").map(_.capitalize).filterNot(_.trim.isEmpty) - val splitName = capitalizedNameParts.mkString(" ") + val splitName = s"""${capitalizedNameParts.mkString(" ")}""" + val splitNameWithBankId = if (dynamicEntityInfo.bankId.isDefined) + s"""$splitName(${dynamicEntityInfo.bankId.getOrElse("")})""" + else + s"""$splitName""" + + val mySplitNameWithBankId = s"My$splitNameWithBankId" val idNameInUrl = StringHelpers.snakify(dynamicEntityInfo.idName).toUpperCase() val listName = dynamicEntityInfo.listName val bankId = dynamicEntityInfo.bankId - val resourceDocUrl = if(bankId.isDefined) s"/banks/BANK_ID/$entityName" else s"/$entityName" + val resourceDocUrl = if(bankId.isDefined) s"/banks/${bankId.getOrElse("")}/$entityName" else s"/$entityName" + val myResourceDocUrl = if(bankId.isDefined) s"/banks/${bankId.getOrElse("")}/my/$entityName" else s"/my/$entityName" val endPoint = APIUtil.dynamicEndpointStub // (operationType, entityName) -> ResourceDoc val resourceDocs = scala.collection.mutable.Map[(DynamicEntityOperation, String),ResourceDoc]() - val apiTag: ResourceDocTag = fun(splitName, entityName) + val apiTag: ResourceDocTag = fun(entityName,splitNameWithBankId) - resourceDocs += (DynamicEntityOperation.GET_ALL, entityName) -> ResourceDoc( + resourceDocs += (DynamicEntityOperation.GET_ALL, splitNameWithBankId) -> ResourceDoc( endPoint, implementedInApiVersion, - buildGetAllFunctionName(entityName), + buildGetAllFunctionName(bankId, entityName), "GET", s"$resourceDocUrl", s"Get $splitName List", @@ -164,10 +190,11 @@ object DynamicEntityHelper { Some(List(dynamicEntityInfo.canGetRole)), createdByBankId= dynamicEntityInfo.bankId ) - resourceDocs += (DynamicEntityOperation.GET_ONE, entityName) -> ResourceDoc( + + resourceDocs += (DynamicEntityOperation.GET_ONE, splitNameWithBankId) -> ResourceDoc( endPoint, implementedInApiVersion, - buildGetOneFunctionName(entityName), + buildGetOneFunctionName(bankId, entityName), "GET", s"$resourceDocUrl/$idNameInUrl", s"Get $splitName by id", @@ -192,10 +219,10 @@ object DynamicEntityHelper { createdByBankId= dynamicEntityInfo.bankId ) - resourceDocs += (DynamicEntityOperation.CREATE, entityName) -> ResourceDoc( + resourceDocs += (DynamicEntityOperation.CREATE, splitNameWithBankId) -> ResourceDoc( endPoint, implementedInApiVersion, - buildCreateFunctionName(entityName), + buildCreateFunctionName(bankId, entityName), "POST", s"$resourceDocUrl", s"Create new $splitName", @@ -222,10 +249,10 @@ object DynamicEntityHelper { createdByBankId= dynamicEntityInfo.bankId ) - resourceDocs += (DynamicEntityOperation.UPDATE, entityName) -> ResourceDoc( + resourceDocs += (DynamicEntityOperation.UPDATE, splitNameWithBankId) -> ResourceDoc( endPoint, implementedInApiVersion, - buildUpdateFunctionName(entityName), + buildUpdateFunctionName(bankId, entityName), "PUT", s"$resourceDocUrl/$idNameInUrl", s"Update $splitName", @@ -252,10 +279,10 @@ object DynamicEntityHelper { createdByBankId= dynamicEntityInfo.bankId ) - resourceDocs += (DynamicEntityOperation.DELETE, entityName) -> ResourceDoc( + resourceDocs += (DynamicEntityOperation.DELETE, splitNameWithBankId) -> ResourceDoc( endPoint, implementedInApiVersion, - buildDeleteFunctionName(entityName), + buildDeleteFunctionName(bankId, entityName), "DELETE", s"$resourceDocUrl/$idNameInUrl", s"Delete $splitName by id", @@ -279,25 +306,162 @@ object DynamicEntityHelper { createdByBankId= dynamicEntityInfo.bankId ) + resourceDocs += (DynamicEntityOperation.GET_ALL, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildGetAllFunctionName(bankId, s"My$entityName"), + "GET", + s"$myResourceDocUrl", + s"Get My $splitName List", + s"""Get My $splitName List. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |Can do filter on the fields + |e.g: /${entityName}?name=James%20Brown&number=123.456&number=11.11 + |Will do filter by this rule: name == "James Brown" && (number==123.456 || number=11.11) + |""".stripMargin, + EmptyBody, + dynamicEntityInfo.getExampleList, + List( + UserNotLoggedIn, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.GET_ONE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildGetOneFunctionName(bankId, s"My$entityName"), + "GET", + s"$myResourceDocUrl/$idNameInUrl", + s"Get My $splitName by id", + s"""Get My $splitName by id. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + |""".stripMargin, + EmptyBody, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.CREATE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildCreateFunctionName(bankId, s"My$entityName"), + "POST", + s"$myResourceDocUrl", + s"Create new My $splitName", + s"""Create new My $splitName. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |""", + dynamicEntityInfo.getSingleExampleWithoutId, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + InvalidJsonFormat, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.UPDATE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildUpdateFunctionName(bankId, s"My$entityName"), + "PUT", + s"$myResourceDocUrl/$idNameInUrl", + s"Update My $splitName", + s"""Update My $splitName. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |""", + dynamicEntityInfo.getSingleExampleWithoutId, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + InvalidJsonFormat, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + Some(List(dynamicEntityInfo.canUpdateRole)), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.DELETE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildDeleteFunctionName(bankId, s"My$entityName"), + "DELETE", + s"$myResourceDocUrl/$idNameInUrl", + s"Delete My $splitName by id", + s"""Delete My $splitName by id + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |""", + dynamicEntityInfo.getSingleExampleWithoutId, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + resourceDocs } - private def buildCreateFunctionName(entityName: String) = s"dynamicEntity_create$entityName" - private def buildUpdateFunctionName(entityName: String) = s"dynamicEntity_update$entityName" - private def buildDeleteFunctionName(entityName: String) = s"dynamicEntity_delete$entityName" - private def buildGetOneFunctionName(entityName: String) = s"dynamicEntity_getSingle$entityName" - private def buildGetAllFunctionName(entityName: String) = s"dynamicEntity_get${entityName}List" + private def buildCreateFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_create${entityName}_${bankId.getOrElse("")}" + private def buildUpdateFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_update${entityName}_${bankId.getOrElse("")}" + private def buildDeleteFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_delete${entityName}_${bankId.getOrElse("")}" + private def buildGetOneFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_getSingle${entityName}_${bankId.getOrElse("")}" + private def buildGetAllFunctionName(bankId:Option[String], entityName: String) = s"dynamicEntity_get${entityName}List_${bankId.getOrElse("")}" @inline - private def buildOperationId(entityName: String, fun: String => String): String = { - APIUtil.buildOperationId(implementedInApiVersion, fun(entityName)) + private def buildOperationId(bankId:Option[String], entityName: String, fun: (Option[String], String) => String): String = { + APIUtil.buildOperationId(implementedInApiVersion, fun(bankId, entityName)) } - def buildCreateOperationId(entityName: String) = buildOperationId(entityName, buildCreateFunctionName) - def buildUpdateOperationId(entityName: String) = buildOperationId(entityName, buildUpdateFunctionName) - def buildDeleteOperationId(entityName: String) = buildOperationId(entityName, buildDeleteFunctionName) - def buildGetOneOperationId(entityName: String) = buildOperationId(entityName, buildGetOneFunctionName) - def buildGetAllOperationId(entityName: String) = buildOperationId(entityName, buildGetAllFunctionName) + def buildCreateOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildCreateFunctionName) + def buildUpdateOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildUpdateFunctionName) + def buildDeleteOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildDeleteFunctionName) + def buildGetOneOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildGetOneFunctionName) + def buildGetAllOperationId(bankId:Option[String], entityName: String) = buildOperationId(bankId, entityName, buildGetAllFunctionName) private def methodRoutingExample(entityName: String) = s""" 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 e5891fcaa..cbcdfccce 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.Constant._ import code.api.OAuthHandshake._ import code.api.builder.OBP_APIBuilder import code.api.dynamic.endpoint.OBPAPIDynamicEndpoint -import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEndpoints, DynamicEntityHelper} +import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEndpoints} import code.api.oauth1a.Arithmetics import code.api.oauth1a.OauthParams._ import code.api.util.APIUtil.ResourceDoc.{findPathVariableNames, isPathVariable} @@ -52,7 +52,8 @@ import code.api.v1_2.ErrorMessage import code.api.v2_0_0.CreateEntitlementJSON import code.api.dynamic.endpoint.helper.DynamicEndpointHelper import code.api.dynamic.entity.OBPAPIDynamicEntity -import code.api.{DirectLogin, _} +import code.api._ +import code.api.dynamic.entity.helper.DynamicEntityHelper import code.authtypevalidation.AuthenticationTypeValidationProvider import code.bankconnectors.Connector import code.consumer.Consumers @@ -81,7 +82,7 @@ import dispatch.url import javassist.expr.{ExprEditor, MethodCall} import javassist.{ClassPool, LoaderClassPath} import net.liftweb.actor.LAFuture -import net.liftweb.common.{Empty, _} +import net.liftweb.common._ import net.liftweb.http._ import net.liftweb.http.js.JE.JsRaw import net.liftweb.http.provider.HTTPParam 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 ab72e1180..1d99aef5c 100644 --- a/obp-api/src/main/scala/code/api/util/ApiRole.scala +++ b/obp-api/src/main/scala/code/api/util/ApiRole.scala @@ -1,9 +1,10 @@ package code.api.util -import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEntityHelper} +import code.api.dynamic.endpoint.helper.DynamicEndpointHelper import java.util.concurrent.ConcurrentHashMap import code.api.dynamic.endpoint.helper.DynamicEndpointHelper +import code.api.dynamic.entity.helper.DynamicEntityHelper import com.openbankproject.commons.util.{JsonAble, ReflectUtils} import net.liftweb.json.{Formats, JsonAST} import net.liftweb.json.JsonDSL._ 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 27c7c8f28..b6c2fcafa 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -63,9 +63,10 @@ import code.validation.{JsonSchemaValidationProvider, JsonValidation} import net.liftweb.http.JsonResponse import net.liftweb.util.Props import code.api.JsonResponseException -import code.api.dynamic.endpoint.helper.{DynamicEndpointHelper, DynamicEntityHelper, DynamicEntityInfo} +import code.api.dynamic.endpoint.helper.DynamicEndpointHelper import code.api.v4_0_0.JSONFactory400 import code.api.dynamic.endpoint.helper.DynamicEndpointHelper +import code.api.dynamic.entity.helper.{DynamicEntityHelper, DynamicEntityInfo} import code.bankattribute.BankAttribute import code.connectormethod.{ConnectorMethodProvider, JsonConnectorMethod} import code.customeraccountlinks.CustomerAccountLinkTrait @@ -3161,6 +3162,8 @@ object NewStyle extends MdcLoggable{ entityId: Option[String], bankId: Option[String], queryParameters: Option[Map[String, List[String]]], + userId: Option[String], + isPersonalEntity: Boolean, callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = { import DynamicEntityOperation._ validateBankId(bankId, callContext) @@ -3213,7 +3216,7 @@ object NewStyle extends MdcLoggable{ // @(variable-binding pattern), we can use the empty variable // If there is not instance in requestBody, we just call the `dynamicEntityProcess` directly. case empty @None => - Connector.connector.vend.dynamicEntityProcess(operation, entityName, empty, entityId, bankId, queryParameters, callContext) + Connector.connector.vend.dynamicEntityProcess(operation, entityName, empty, entityId, bankId, queryParameters, userId, isPersonalEntity, callContext) // @(variable-binding pattern), we can use both v and body variables. case requestBody @Some(body) => // If the request body is existing, we need to validate the body first. @@ -3221,7 +3224,7 @@ object NewStyle extends MdcLoggable{ dynamicEntity.validateEntityJson(body, callContext).flatMap { // If there is no error in the request body case None => - Connector.connector.vend.dynamicEntityProcess(operation, entityName, requestBody, entityId, bankId, queryParameters, callContext) + Connector.connector.vend.dynamicEntityProcess(operation, entityName, requestBody, entityId, bankId, queryParameters, userId, isPersonalEntity, callContext) // If there are errors, we need to show them to end user. case Some(errorMsg) => Helper.booleanToFuture(s"$DynamicEntityInstanceValidateFail details: $errorMsg", cc=callContext)(false) 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 8d3ac5a7b..ba25bb412 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 @@ -9,11 +9,11 @@ import code.DynamicData.{DynamicData, DynamicDataProvider} import code.DynamicEndpoint.DynamicEndpointSwagger import code.accountattribute.AccountAttributeX import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON -import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON.{jsonDynamicResourceDoc, _} +import code.api.ResourceDocs1_4_0.SwaggerDefinitionsJSON._ import code.api.dynamic.endpoint.helper.practise.{DynamicEndpointCodeGenerator, PractiseEndpoint} -import code.api.dynamic.endpoint.helper.{CompiledObjects, DynamicEndpointHelper, DynamicEndpoints, DynamicEntityHelper, DynamicEntityInfo} +import code.api.dynamic.endpoint.helper.{CompiledObjects, DynamicEndpointHelper, DynamicEndpoints} import code.api.util.APIUtil.{fullBoxOrException, _} -import code.api.util.ApiRole.{canCreateEntitlementAtAnyBank, _} +import code.api.util.ApiRole._ import code.api.util.ApiTag._ import code.api.util.DynamicUtil.Validation import code.api.util.ErrorMessages.{BankNotFound, _} @@ -38,6 +38,7 @@ import code.api.v3_1_0._ import code.api.v4_0_0.JSONFactory400._ import code.api.dynamic.endpoint.helper._ import code.api.dynamic.endpoint.helper.practise.PractiseEndpoint +import code.api.dynamic.entity.helper.{DynamicEntityHelper, DynamicEntityInfo} import code.api.{ChargePolicy, Constant, JsonResponseException} import code.apicollection.MappedApiCollectionsProvider import code.apicollectionendpoint.MappedApiCollectionEndpointsProvider @@ -54,7 +55,7 @@ import code.loginattempts.LoginAttempt import code.metadata.counterparties.{Counterparties, MappedCounterparty} import code.metadata.tags.Tags import code.model.dataAccess.{AuthUser, BankAccountCreation} -import code.model.{toUserExtended, _} +import code.model._ import code.ratelimiting.RateLimitingDI import code.scope.Scope import code.snippet.{WebUIPlaceholder, WebUITemplate} @@ -2169,7 +2170,7 @@ trait APIMethods400 { for { // Check whether there are uploaded data, only if no uploaded data allow to update DynamicEntity. (entity, _) <- NewStyle.function.getDynamicEntityById(bankId, dynamicEntityId, cc.callContext) - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, cc.callContext) + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, None, false, cc.callContext) resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], entity.entityName) _ <- Helper.booleanToFuture(DynamicEntityOperationNotAllowed, cc = cc.callContext) { resultList.arr.isEmpty @@ -2300,7 +2301,7 @@ trait APIMethods400 { for { // Check whether there are uploaded data, only if no uploaded data allow to delete DynamicEntity. (entity, _) <- NewStyle.function.getDynamicEntityById(bankId, dynamicEntityId, cc.callContext) - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, cc.callContext) + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, None, false, cc.callContext) resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], entity.entityName) _ <- Helper.booleanToFuture(DynamicEntityOperationNotAllowed, cc = cc.callContext) { resultList.arr.isEmpty @@ -2415,7 +2416,7 @@ trait APIMethods400 { _ <- Helper.booleanToFuture(InvalidMyDynamicEntityUser, cc=cc.callContext) { entity.userId.equals(cc.userId) } - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, cc.callContext) + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, None, false, cc.callContext) resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], entity.entityName) _ <- Helper.booleanToFuture(DynamicEntityOperationNotAllowed, cc=cc.callContext) { resultList.arr.isEmpty @@ -2458,7 +2459,7 @@ trait APIMethods400 { _ <- Helper.booleanToFuture(InvalidMyDynamicEntityUser, cc=cc.callContext) { entity.userId.equals(cc.userId) } - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, cc.callContext) + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, None, false, cc.callContext) resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], entity.entityName) _ <- Helper.booleanToFuture(DynamicEntityOperationNotAllowed, cc=cc.callContext) { resultList.arr.isEmpty diff --git a/obp-api/src/main/scala/code/bankconnectors/Connector.scala b/obp-api/src/main/scala/code/bankconnectors/Connector.scala index 7812c087f..f3d6b7192 100644 --- a/obp-api/src/main/scala/code/bankconnectors/Connector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/Connector.scala @@ -2534,6 +2534,8 @@ trait Connector extends MdcLoggable { entityId: Option[String], bankId: Option[String], queryParameters: Option[Map[String, List[String]]], + userId: Option[String], + isPersonalEntity: Boolean, callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = Future{(Failure(setUnimplementedError), callContext)} def dynamicEndpointProcess(url: String, jValue: JValue, method: HttpMethod, params: Map[String, List[String]], pathParams: Map[String, String], diff --git a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index 5239a3aad..1b553ce9c 100644 --- a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -4394,35 +4394,37 @@ object LocalMappedConnector extends Connector with MdcLoggable { entityId: Option[String], bankId: Option[String], queryParameters: Option[Map[String, List[String]]], + userId: Option[String], + isPersonalEntity: Boolean, callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = { Future { val processResult: Box[JValue] = operation.asInstanceOf[Any] match { case GET_ALL => Full { - val dataList = DynamicDataProvider.connectorMethodProvider.vend.getAllDataJson(bankId, entityName) + val dataList = DynamicDataProvider.connectorMethodProvider.vend.getAllDataJson(bankId, entityName, userId, isPersonalEntity) JArray(dataList) } case GET_ONE => { val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend - .get(bankId, entityName, entityId.getOrElse(throw new RuntimeException(s"$DynamicEntityMissArgument the entityId is required."))) + .get(bankId, entityName, entityId.getOrElse(throw new RuntimeException(s"$DynamicEntityMissArgument the entityId is required.")),userId, isPersonalEntity) .map(it => json.parse(it.dataJson)) boxedEntity } case CREATE => { val body = requestBody.getOrElse(throw new RuntimeException(s"$DynamicEntityMissArgument please supply the requestBody.")) - val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend.save(bankId, entityName, body) + val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend.save(bankId, entityName, body, userId, isPersonalEntity) .map(it => json.parse(it.dataJson)) boxedEntity } case UPDATE => { val body = requestBody.getOrElse(throw new RuntimeException(s"$DynamicEntityMissArgument please supply the requestBody.")) - val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend.update(bankId, entityName, body, entityId.get) + val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend.update(bankId, entityName, body, entityId.get, userId, isPersonalEntity) .map(it => json.parse(it.dataJson)) boxedEntity } case DELETE => { val id = entityId.getOrElse(throw new RuntimeException(s"$DynamicEntityMissArgument the entityId is required. ")) - val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend.delete(bankId, entityName, id) + val boxedEntity: Box[JValue] = DynamicDataProvider.connectorMethodProvider.vend.delete(bankId, entityName, id, userId, isPersonalEntity) .map(it => JBool(it)) boxedEntity } 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 af8eee7ee..95f587ad6 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 @@ -6486,6 +6486,8 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable entityId: Option[String], bankId: Option[String], queryParameters: Option[Map[String, List[String]]], + userId: Option[String], + isPersonalEntity: Boolean, callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = { import com.openbankproject.commons.dto.{OutBoundDynamicEntityProcess => OutBound, InBoundDynamicEntityProcess => InBound} val url = getUrl(callContext, "dynamicEntityProcess") diff --git a/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala b/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala index 7a99aa810..e7f0fde51 100644 --- a/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala @@ -6469,6 +6469,8 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { entityId: Option[String], bankId: Option[String], queryParameters: Option[Map[String, List[String]]], + userId: Option[String], + isPersonalEntity: Boolean, callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = { import com.openbankproject.commons.dto.{InBoundDynamicEntityProcess => InBound, OutBoundDynamicEntityProcess => OutBound} val procedureName = StringHelpers.snakify("dynamicEntityProcess") diff --git a/obp-api/src/main/scala/code/dynamicEntity/DynamicDataProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/DynamicDataProvider.scala index bef358f8c..67e07f5cf 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/DynamicDataProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/DynamicDataProvider.scala @@ -17,25 +17,29 @@ trait DynamicDataT { def dynamicEntityName: String def dataJson: String def bankId: Option[String] + def userId: Option[String] + def isPersonalEntity: Boolean } case class DynamicDataCommons(dynamicEntityName: String, dataJson: String, dynamicDataId: Option[String] = None, - bankId: Option[String] + bankId: Option[String], + userId: Option[String], + isPersonalEntity: Boolean ) extends DynamicDataT with JsonFieldReName object DynamicDataCommons extends Converter[DynamicDataT, DynamicDataCommons] trait DynamicDataProvider { - def save(bankId: Option[String], entityName: String, requestBody: JObject): Box[DynamicDataT] - def update(bankId: Option[String], entityName: String, requestBody: JObject, id: String): Box[DynamicDataT] - def get(bankId: Option[String], entityName: String, id: String): Box[DynamicDataT] - def getAllDataJson(bankId: Option[String], entityName: String): List[JObject] - def getAll(bankId: Option[String], entityName: String): List[DynamicDataT] - def delete(bankId: Option[String], entityName: String, id: String): Box[Boolean] - def existsData(dbankId: Option[String], ynamicEntityName: String): Boolean + def save(bankId: Option[String], entityName: String, requestBody: JObject, userId: Option[String], isPersonalEntity: Boolean): Box[DynamicDataT] + def update(bankId: Option[String], entityName: String, requestBody: JObject, id: String, userId: Option[String], isPersonalEntity: Boolean): Box[DynamicDataT] + def get(bankId: Option[String], entityName: String, id: String, userId: Option[String], isPersonalEntity: Boolean): Box[DynamicDataT] + def getAllDataJson(bankId: Option[String], entityName: String, userId: Option[String], isPersonalEntity: Boolean): List[JObject] + def getAll(bankId: Option[String], entityName: String, userId: Option[String], isPersonalEntity: Boolean): List[DynamicDataT] + def delete(bankId: Option[String], entityName: String, id: String, userId: Option[String], isPersonalEntity: Boolean): Box[Boolean] + def existsData(bankId: Option[String], dynamicEntityName: String, userId: Option[String], isPersonalEntity: Boolean): Boolean } diff --git a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala index 651193f10..6295d876a 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala @@ -35,6 +35,7 @@ trait DynamicEntityT { * @return */ def userId: String + def hasPersonalEntity: Option[Boolean] /** * Add Option(bank_id) to Dynamic Entity. @@ -347,7 +348,7 @@ object ReferenceType { } else { val dynamicEntityName = typeName.replace("reference:", "") val errorMsg = s"""$dynamicEntityName not found by the id value '$value', propertyName is '$propertyName'""" - NewStyle.function.invokeDynamicConnector(DynamicEntityOperation.GET_ONE,dynamicEntityName, None, Some(value), None, None, callContext) + NewStyle.function.invokeDynamicConnector(DynamicEntityOperation.GET_ONE,dynamicEntityName, None, Some(value), None, None, None, false,callContext) .recover { case _: Throwable => errorMsg } @@ -363,7 +364,8 @@ case class DynamicEntityCommons(entityName: String, metadataJson: String, dynamicEntityId: Option[String] = None, userId: String, - bankId: Option[String] + bankId: Option[String] , + hasPersonalEntity: Option[Boolean] ) extends DynamicEntityT with JsonFieldReName object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommons] { @@ -375,6 +377,7 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo * {{{ * { * "BankId": "gh.29.uk", + * "isPersonalEntity": true, * "FooBar": { * "description": "description of this entity, can be markdown text.", * "required": [ @@ -398,6 +401,8 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo * } * }}} * @param dynamicEntityId + * @param bankId + * @param isPersonalEntity * @return object of DynamicEntityCommons */ def apply(jsonObject: JObject, dynamicEntityId: Option[String], userId: String): DynamicEntityCommons = { @@ -410,9 +415,9 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo // validate whether json is object and have a single field, currently support one entity definition checkFormat(fields.nonEmpty, s"$DynamicEntityInstanceValidateFail The Json root object should have a single entity, but current have none.") - checkFormat(fields.size <= 2, s"$DynamicEntityInstanceValidateFail The Json root object should at most two fields: entity and BankId, but current entityNames: ${fields.map(_.name).mkString(", ")}") - - val bankId: Option[String] = fields.filter(_.name=="bankId").map(_.value.asInstanceOf[JString].values).headOption + checkFormat(fields.size == 1, s"$DynamicEntityInstanceValidateFail The Json root object should have a single entity, but current entityNames: ${fields.map(_.name).mkString(", ")}") + + val hasPersonalEntity: Option[Boolean] = fields.filter(_.name=="hasPersonalEntity").map(_.value.asInstanceOf[JBool].values).headOption val JField(entityName, metadataJson) = fields.filter(_.name!="bankId").head @@ -519,7 +524,7 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo } }) - DynamicEntityCommons(entityName, compactRender(jsonObject), dynamicEntityId, userId, bankId) + DynamicEntityCommons(entityName, compactRender(jsonObject), dynamicEntityId, userId, None, hasPersonalEntity) } private def allowedFieldType: List[String] = DynamicEntityFieldType.values.map(_.toString) ++: ReferenceType.referenceTypeNames diff --git a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicDataProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicDataProvider.scala index f90258a12..7703d9728 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicDataProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicDataProvider.scala @@ -13,104 +13,148 @@ import net.liftweb.util.Helpers.tryo import org.apache.commons.lang3.StringUtils object MappedDynamicDataProvider extends DynamicDataProvider with CustomJsonFormats{ - override def save(bankId: Option[String], entityName: String, requestBody: JObject): Box[DynamicDataT] = { + override def save(bankId: Option[String], entityName: String, requestBody: JObject, userId: Option[String], isPersonalEntity: Boolean): Box[DynamicDataT] = { val idName = getIdName(entityName) val JString(idValue) = (requestBody \ idName).asInstanceOf[JString] val dynamicData: DynamicData = DynamicData.create.DynamicDataId(idValue) - val result = saveOrUpdate(bankId, entityName, requestBody, dynamicData) + val result = saveOrUpdate(bankId, entityName, requestBody, userId, isPersonalEntity, dynamicData) result } - override def update(bankId: Option[String], entityName: String, requestBody: JObject, id: String): Box[DynamicDataT] = { - val dynamicData = get(bankId, entityName, id).openOrThrowException(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynameicDataId=$id").asInstanceOf[DynamicData] - saveOrUpdate(bankId, entityName, requestBody, dynamicData) + override def update(bankId: Option[String], entityName: String, requestBody: JObject, id: String, userId: Option[String], isPersonalEntity: Boolean): Box[DynamicDataT] = { + val dynamicData = get(bankId, entityName, id, userId, isPersonalEntity).openOrThrowException(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynamicDataId=$id").asInstanceOf[DynamicData] + saveOrUpdate(bankId, entityName, requestBody, userId, isPersonalEntity, dynamicData) } - override def get(bankId: Option[String],entityName: String, id: String): Box[DynamicDataT] = { - if(bankId.isEmpty){ + override def get(bankId: Option[String],entityName: String, id: String, userId: Option[String], isPersonalEntity: Boolean): Box[DynamicDataT] = { + if(bankId.isEmpty && !isPersonalEntity ){ //isPersonalEntity == false, get all the data, no need for specific userId. //forced the empty also to a error here. this is get Dynamic by Id, if it return Empty, better show the error in this level. DynamicData.find( By(DynamicData.DynamicDataId, id), By(DynamicData.DynamicEntityName, entityName), - NullRef(DynamicData.BankId), + By(DynamicData.UserId, userId.getOrElse(null)), + By(DynamicData.IsPersonalEntity, false), + NullRef(DynamicData.BankId) ) match { case Full(dynamicData) => Full(dynamicData) - case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynameicDataId=$id") + case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynamicDataId=$id") } - } else{ + } else if(bankId.isEmpty && isPersonalEntity){ //isPersonalEntity == true, get all the data for specific userId. + DynamicData.find( + By(DynamicData.DynamicDataId, id), + By(DynamicData.DynamicEntityName, entityName), + By(DynamicData.UserId, userId.getOrElse(null)), + By(DynamicData.IsPersonalEntity, true), + NullRef(DynamicData.BankId) + ) match { + case Full(dynamicData) => Full(dynamicData) + case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynamicDataId=$id, userId = $userId") + } + } else if(bankId.isDefined && !isPersonalEntity ){ //isPersonalEntity == false, get all the data, no need for specific userId. //forced the empty also to a error here. this is get Dynamic by Id, if it return Empty, better show the error in this level. DynamicData.find( By(DynamicData.DynamicDataId, id), By(DynamicData.DynamicEntityName, entityName), - By(DynamicData.BankId, bankId.get) + By(DynamicData.IsPersonalEntity, false), + By(DynamicData.BankId, bankId.get), ) match { case Full(dynamicData) => Full(dynamicData) - case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynameicDataId=$id") + case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynamicDataId=$id, bankId= ${bankId.get}") + } + }else{ //isPersonalEntity == true, get all the data for specific userId. + DynamicData.find( + By(DynamicData.DynamicDataId, id), + By(DynamicData.DynamicEntityName, entityName), + By(DynamicData.BankId, bankId.get), + By(DynamicData.UserId, userId.get), + By(DynamicData.IsPersonalEntity, true) + ) match { + case Full(dynamicData) => Full(dynamicData) + case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynamicDataId=$id, bankId= ${bankId.get}, userId = ${userId.get}") } } } - override def getAllDataJson(bankId: Option[String], entityName: String): List[JObject] = { - if(bankId.isEmpty){ - DynamicData.findAll( - By(DynamicData.DynamicEntityName, entityName), - NullRef(DynamicData.BankId) - ).map(it => json.parse(it.dataJson)).map(_.asInstanceOf[JObject]) - } else { - DynamicData.findAll( - By(DynamicData.DynamicEntityName, entityName), - By(DynamicData.BankId, bankId.get) - ).map(it => json.parse(it.dataJson)).map(_.asInstanceOf[JObject]) - } + override def getAllDataJson(bankId: Option[String], entityName: String, userId: Option[String], isPersonalEntity: Boolean): List[JObject] = { + getAll(bankId: Option[String], entityName: String, userId: Option[String], isPersonalEntity) + .map(it => json.parse(it.dataJson)) + .map(_.asInstanceOf[JObject]) } - override def getAll(bankId: Option[String], entityName: String): List[DynamicDataT] = { - if(bankId.isEmpty) { + override def getAll(bankId: Option[String], entityName: String, userId: Option[String], isPersonalEntity: Boolean): List[DynamicDataT] = { + if(bankId.isEmpty && !isPersonalEntity){ //isPersonalEntity == false, get all the data, no need for specific userId. DynamicData.findAll( By(DynamicData.DynamicEntityName, entityName), + By(DynamicData.IsPersonalEntity, false), + NullRef(DynamicData.BankId), + ) + } else if(bankId.isEmpty && isPersonalEntity){ //isPersonalEntity == true, get all the data for specific userId. + DynamicData.findAll( + By(DynamicData.DynamicEntityName, entityName), + By(DynamicData.UserId, userId.getOrElse(null)), + By(DynamicData.IsPersonalEntity, true), NullRef(DynamicData.BankId) + ) + } else if(bankId.isDefined && !isPersonalEntity){ //isPersonalEntity == false, get all the data, no need for specific userId. + DynamicData.findAll( + By(DynamicData.DynamicEntityName, entityName), + By(DynamicData.IsPersonalEntity, false), + By(DynamicData.BankId, bankId.get), ) }else{ - DynamicData.findAll( + DynamicData.findAll(//isPersonalEntity == true, get all the data for specific userId. By(DynamicData.DynamicEntityName, entityName), - By(DynamicData.BankId, bankId.get) + By(DynamicData.BankId, bankId.get), + By(DynamicData.UserId, userId.getOrElse(null)), + By(DynamicData.IsPersonalEntity, true) ) } } - override def delete(bankId: Option[String], entityName: String, id: String) = { - //forced the empty also to a error here. this is get Dynamic by Id, if it return Empty, better show the error in this level. - //Note: DynamicDataId is UniqueIndex - DynamicData.find(By(DynamicData.DynamicDataId, id), By(DynamicData.DynamicEntityName, entityName)) match { - case Full(dynamicData) => Full(dynamicData.delete_!) - case _ => Failure(s"$DynamicDataNotFound dynamicEntityName=$entityName, dynamicDataId=$id") - } + override def delete(bankId: Option[String], entityName: String, id: String, userId: Option[String], isPersonalEntity: Boolean) = { + get(bankId, entityName, id, userId, isPersonalEntity).map(_.asInstanceOf[DynamicData].delete_!) } - override def existsData(bankId: Option[String], dynamicEntityName: String): Boolean = { - if(bankId.isEmpty){ + override def existsData(bankId: Option[String], dynamicEntityName: String, userId: Option[String], isPersonalEntity: Boolean): Boolean = { + if(bankId.isEmpty && !isPersonalEntity){//isPersonalEntity == false, get all the data, no need for specific userId. DynamicData.find( By(DynamicData.DynamicEntityName, dynamicEntityName), - NullRef(DynamicData.BankId) + NullRef(DynamicData.BankId), + By(DynamicData.IsPersonalEntity, false) ).isDefined + } else if(bankId.isDefined && !isPersonalEntity){//isPersonalEntity == false, get all the data, no need for specific userId. + DynamicData.find( + By(DynamicData.DynamicEntityName, dynamicEntityName), + By(DynamicData.BankId, bankId.get), + By(DynamicData.IsPersonalEntity, false) + ).nonEmpty + } else if(bankId.isEmpty && isPersonalEntity){ //isPersonalEntity == true, get all the data for specific userId. + DynamicData.find( + By(DynamicData.DynamicEntityName, dynamicEntityName), + NullRef(DynamicData.BankId), + By(DynamicData.IsPersonalEntity, true), + By(DynamicData.UserId, userId.getOrElse(null)) + ).nonEmpty } else { DynamicData.find( By(DynamicData.DynamicEntityName, dynamicEntityName), - By(DynamicData.BankId, bankId.get) + By(DynamicData.BankId, bankId.get), + By(DynamicData.IsPersonalEntity, true), + By(DynamicData.UserId, userId.getOrElse(null)) ).nonEmpty } } - private def saveOrUpdate(bankId: Option[String], entityName: String, requestBody: JObject, dynamicData: => DynamicData): Box[DynamicData] = { + private def saveOrUpdate(bankId: Option[String], entityName: String, requestBody: JObject, userId: Option[String], isPersonalEntity: Boolean, dynamicData: => DynamicData): Box[DynamicData] = { val data: DynamicData = dynamicData - - val dataStr = json.compactRender(requestBody) tryo { - if(bankId.isDefined){ - data.DataJson(dataStr).DynamicEntityName(entityName).BankId(bankId.get).saveMe() - } else{ - data.DataJson(dataStr).DynamicEntityName(entityName).BankId(null).saveMe() - } + val dataStr = json.compactRender(requestBody) + data.DataJson(dataStr) + .DynamicEntityName(entityName) + .BankId(bankId.getOrElse(null)) + .UserId(userId.getOrElse(null)) + .IsPersonalEntity(isPersonalEntity) + .saveMe() } } @@ -129,11 +173,17 @@ class DynamicData extends DynamicDataT with LongKeyedMapper[DynamicData] with Id object DataJson extends MappedText(this) object BankId extends MappedString(this,255) + + object UserId extends MappedString(this,255) + + object IsPersonalEntity extends MappedBoolean(this) override def dynamicDataId: Option[String] = Option(DynamicDataId.get) override def dynamicEntityName: String = DynamicEntityName.get override def dataJson: String = DataJson.get - override def bankId: Option[String] = Some(BankId.get) + override def bankId: Option[String] = Option(BankId.get) + override def userId: Option[String] = Option(UserId.get) + override def isPersonalEntity: Boolean = IsPersonalEntity.get } object DynamicData extends DynamicData with LongKeyedMetaMapper[DynamicData] { diff --git a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala index 6fa594d0f..75987c169 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala @@ -63,6 +63,7 @@ object MappedDynamicEntityProvider extends DynamicEntityProvider with CustomJson .MetadataJson(dynamicEntity.metadataJson) .UserId(dynamicEntity.userId) .BankId(dynamicEntity.bankId.getOrElse(null)) + .HasPersonalEntity(dynamicEntity.hasPersonalEntity.getOrElse(true)) .saveMe() } catch { case e => @@ -94,12 +95,14 @@ class DynamicEntity extends DynamicEntityT with LongKeyedMapper[DynamicEntity] w object MetadataJson extends MappedText(this) object UserId extends MappedString(this, 255) object BankId extends MappedString(this, 255) + object HasPersonalEntity extends MappedBoolean(this) override def dynamicEntityId: Option[String] = Option(DynamicEntityId.get) override def entityName: String = EntityName.get override def metadataJson: String = MetadataJson.get override def userId: String = UserId.get override def bankId: Option[String] = if (BankId.get == null || BankId.get.isEmpty) None else Some(BankId.get) + override def hasPersonalEntity: Option[Boolean] = Option(HasPersonalEntity.get) } object DynamicEntity extends DynamicEntity with LongKeyedMetaMapper[DynamicEntity] { diff --git a/obp-api/src/main/scala/code/entitlement/MappedEntitlements.scala b/obp-api/src/main/scala/code/entitlement/MappedEntitlements.scala index 87e79d68f..692203a3f 100644 --- a/obp-api/src/main/scala/code/entitlement/MappedEntitlements.scala +++ b/obp-api/src/main/scala/code/entitlement/MappedEntitlements.scala @@ -1,6 +1,6 @@ package code.entitlement -import code.api.dynamic.endpoint.helper.DynamicEntityInfo +import code.api.dynamic.entity.helper.DynamicEntityInfo import code.api.util.ApiRole.{CanCreateEntitlementAtAnyBank, CanCreateEntitlementAtOneBank} import code.api.util.{ErrorMessages, NotificationUtil} import code.util.{MappedUUID, UUIDString} diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEndpointHelperTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEndpointHelperTest.scala index c7fcafed9..45b976114 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEndpointHelperTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEndpointHelperTest.scala @@ -770,7 +770,9 @@ class DynamicEndpointHelperTest extends FlatSpec with Matchers { dynamicDataId: Option[String], dynamicEntityName: String, dataJson: String, - bankId: Option[String] + bankId: Option[String], + userId: Option[String], + isPersonalEntity: Boolean )extends DynamicDataT val dataJsonString = """{ @@ -788,7 +790,7 @@ class DynamicEndpointHelperTest extends FlatSpec with Matchers { |} |}""".stripMargin val dynamicDataJson = json.parse(dataJsonString) - val dynamicDataList = List(DataTest(Some("1"),"PetEntity",dataJsonString, Some(testBankId1.value)), DataTest(Some("2"),"PetEntity2",dataJsonString2, Some(testBankId1.value))) + val dynamicDataList = List(DataTest(Some("1"),"PetEntity",dataJsonString, Some(testBankId1.value), None, false), DataTest(Some("2"),"PetEntity2",dataJsonString2, Some(testBankId1.value), None, false)) val expectedResult = ("PetEntity", "1") diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala index bf38bd96b..cd32afd66 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala @@ -917,6 +917,323 @@ class DynamicEntityTest extends V400ServerSetup { + When("When user2 call the foobar endpoints, it need some roles") + val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) + val responseWithBankId = makePostRequest(request, write(entityWithBankId)) + Then("We should get a 201") + responseWithBankId.code should equal(201) + + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + + When("When user1 call the foobar endpoints, it need some roles") + val requestCreateFoobarUser1 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(403) + And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) + responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) + responseCreateFoobarUser3Again.code should equal(403) + + } + + { + Then("we can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar1").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar1" \ "foo_bar1_id").asInstanceOf[JString].s + + Then("we grant user3 can get FooBar role ") + Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar1") + val requestCreateFoobarUser3 = (dynamicEntity_Request / "FooBar1").GET <@(user3) + val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) + responseCreateFoobarUser3.code should equal(200) + + Then("user1 delete the FooBar data") + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(204) + + Then("user1 delete the FooBar entity") + val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityIdNoBankId).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + response400.code should equal(204) + + When("When user2 call the foobar endpoints, it need some roles") + val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) + val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) + Then("We should get a 201") + responseNoBankId.code should equal(201) + + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar1").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + + When("When user1 call the foobar endpoints, it need some roles") + val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar1").POST <@(user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(403) + And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) + responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) + responseCreateFoobarUser3Again.code should equal(403) + } + + } + } + + + feature("Add a DynamicEntity v4.0.4- test personal records.") { + scenario("We will call the endpoint with the proper Role " + canCreateDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) + + val entityWithBankId = parse( + s""" + |{ + | "bankId": "${testBankId1.value}", + | "FooBar": { + | "description": "description of this entity, can be markdown text.", + | "required": [ + | "name" + | ], + | "properties": { + | "name": { + | "type": "string", + | "maxLength": 20, + | "minLength": 3, + | "example": "James Brown", + | "description":"description of **name** field, can be markdown text." + | }, + | "number": { + | "type": "integer", + | "example": 69876172 + | } + | } + | } + |} + |""".stripMargin) + + val notBankIdEntity = parse( + s""" + |{ + | "FooBar1": { + | "description": "description of this entity, can be markdown text.", + | "required": [ + | "name" + | ], + | "properties": { + | "name": { + | "type": "string", + | "maxLength": 20, + | "minLength": 3, + | "example": "James Brown", + | "description":"description of **name** field, can be markdown text." + | }, + | "number": { + | "type": "integer", + | "example": 69876172 + | } + | } + | } + |} + |""".stripMargin) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) + + val responseWithBankId = makePostRequest(request, write(entityWithBankId)) + Then("We should get a 201") + responseWithBankId.code should equal(201) + + val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) + Then("We should get a 201") + responseNoBankId.code should equal(201) + + { + Then("we can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobars should equal(testBankId1.value) + + val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobar should equal(testBankId1.value) + + val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(204) + + When("When other user call the foobar endpoints, it need some roles") + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + + { + Then("we can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar1").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar1" \ "foo_bar1_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "FooBar1").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar1" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(204) + + When("When other user call the foobar endpoints, it need some roles") + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar1").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + + } + + scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) + + val entityWithBankId = parse( + s""" + |{ + | "bankId": "${testBankId1.value}", + | "FooBar": { + | "description": "description of this entity, can be markdown text.", + | "required": [ + | "name" + | ], + | "properties": { + | "name": { + | "type": "string", + | "maxLength": 20, + | "minLength": 3, + | "example": "James Brown", + | "description":"description of **name** field, can be markdown text." + | }, + | "number": { + | "type": "integer", + | "example": 69876172 + | } + | } + | } + |} + |""".stripMargin) + + val notBankIdEntity = parse( + s""" + |{ + | "FooBar1": { + | "description": "description of this entity, can be markdown text.", + | "required": [ + | "name" + | ], + | "properties": { + | "name": { + | "type": "string", + | "maxLength": 20, + | "minLength": 3, + | "example": "James Brown", + | "description":"description of **name** field, can be markdown text." + | }, + | "number": { + | "type": "integer", + | "example": 69876172 + | } + | } + | } + |} + |""".stripMargin) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) + + val responseWithBankId = makePostRequest(request, write(entityWithBankId)) + Then("We should get a 201") + responseWithBankId.code should equal(201) + val dynamicEntityIdWithBankId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s + + val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) + Then("We should get a 201") + responseNoBankId.code should equal(201) + val dynamicEntityIdNoBankId = (responseNoBankId.body \ "dynamicEntityId").asInstanceOf[JString].s + + { + Then("user1 can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + Then("we grant user3 can get FooBar role ") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser3.userId, "CanGetDynamicEntity_FooBar") + val requestCreateFoobarUser3 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user3) + val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) + responseCreateFoobarUser3.code should equal(200) + + + Then("user1 delete the FooBar data") + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(204) + + + + Then("user1 delete the FooBar entity") + val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityIdWithBankId).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + Then("We should get a 204") + response400.code should equal(204) + + + + When("When user2 call the foobar endpoints, it need some roles") val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) val responseWithBankId = makePostRequest(request, write(entityWithBankId)) From 9527bff08f468a47473163eed852d1cd2f555fef Mon Sep 17 00:00:00 2001 From: hongwei Date: Mon, 7 Nov 2022 17:18:57 +0100 Subject: [PATCH 02/11] refactor/remove the bankId in the request/response body --- obp-api/src/main/scala/code/api/v4_0_0/APIMethods400.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 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 ba25bb412..7ff1d5ae5 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 @@ -2100,8 +2100,8 @@ trait APIMethods400 { | if you add it, the entity will be the Bank level. | if you omit it, the entity will be the System level. |""", - dynamicEntityRequestBodyExample, - dynamicEntityResponseBodyExample, + dynamicEntityRequestBodyExample.copy(bankId = None), + dynamicEntityResponseBodyExample.copy(bankId = None), List( $UserNotLoggedIn, UserHasMissingRoles, @@ -2212,7 +2212,7 @@ trait APIMethods400 { |``` |""", dynamicEntityRequestBodyExample.copy(bankId = None), - dynamicEntityResponseBodyExample, + dynamicEntityResponseBodyExample.copy(bankId= None), List( $UserNotLoggedIn, UserHasMissingRoles, From ccc06bfe214037bacb8a9a9a50cb6240102737b8 Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 9 Nov 2022 17:09:35 +0100 Subject: [PATCH 03/11] test/added the tests for system/bank/my DynamicEntity endpoints --- .../entity/helper/DynamicEntityHelper.scala | 26 +- .../main/scala/code/api/util/ApiRole.scala | 16 +- .../scala/code/api/v4_0_0/APIMethods400.scala | 114 +- .../dynamicEntity/DynamicEntityProvider.scala | 8 +- .../MapppedDynamicEntityProvider.scala | 15 +- .../AuthenticationTypeValidationTest.scala | 2 +- .../code/api/v4_0_0/DynamicEntityTest.scala | 2024 ++++++++++------- .../api/v4_0_0/ForceErrorValidationTest.scala | 2 +- .../v4_0_0/GetScannedApiVersionsTest.scala | 2 +- .../api/v4_0_0/JsonSchemaValidationTest.scala | 2 +- 10 files changed, 1257 insertions(+), 954 deletions(-) diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala index 99589fed8..1f886f7a8 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala @@ -593,10 +593,28 @@ case class DynamicEntityInfo(definition: String, entityName: String, bankId: Opt } object DynamicEntityInfo { - def canCreateRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanCreateDynamicEntity_" + entityName, bankId.isDefined) - def canUpdateRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanUpdateDynamicEntity_" + entityName, bankId.isDefined) - def canGetRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanGetDynamicEntity_" + entityName, bankId.isDefined) - def canDeleteRole(entityName: String, bankId:Option[String]): ApiRole = getOrCreateDynamicApiRole("CanDeleteDynamicEntity_" + entityName, bankId.isDefined) + def canCreateRole(entityName: String, bankId:Option[String]): ApiRole = + if(bankId.isDefined) + getOrCreateDynamicApiRole("CanCreateDynamicEntityAtOneBank_" + entityName, true) + else + getOrCreateDynamicApiRole("CanCreateDynamicEntity_System" + entityName, false) + def canUpdateRole(entityName: String, bankId:Option[String]): ApiRole = + if(bankId.isDefined) + getOrCreateDynamicApiRole("CanUpdateDynamicEntityAtOneBank_" + entityName, true) + else + getOrCreateDynamicApiRole("CanUpdateDynamicEntity_System" + entityName, false) + + def canGetRole(entityName: String, bankId:Option[String]): ApiRole = + if(bankId.isDefined) + getOrCreateDynamicApiRole("CanGetDynamicEntityAtOneBank_" + entityName, true) + else + getOrCreateDynamicApiRole("CanGetDynamicEntity_System" + entityName, false) + + def canDeleteRole(entityName: String, bankId:Option[String]): ApiRole = + if(bankId.isDefined) + getOrCreateDynamicApiRole("CanDeleteDynamicEntityAtOneBank_" + entityName, true) + else + getOrCreateDynamicApiRole("CanDeleteDynamicEntity_System" + entityName, false) def roleNames(entityName: String, bankId:Option[String]): List[String] = List( canCreateRole(entityName, bankId), 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 1d99aef5c..a9e3882e6 100644 --- a/obp-api/src/main/scala/code/api/util/ApiRole.scala +++ b/obp-api/src/main/scala/code/api/util/ApiRole.scala @@ -567,23 +567,23 @@ object ApiRole { case class CanDeleteWebUiProps(requiresBankId: Boolean = false) extends ApiRole lazy val canDeleteWebUiProps = CanDeleteWebUiProps() - case class CanGetDynamicEntities(requiresBankId: Boolean = false) extends ApiRole - lazy val canGetDynamicEntities = CanGetDynamicEntities() + case class CanGetSystemLevelDynamicEntities(requiresBankId: Boolean = false) extends ApiRole + lazy val canGetSystemLevelDynamicEntities = CanGetSystemLevelDynamicEntities() - case class CanCreateDynamicEntity(requiresBankId: Boolean = false) extends ApiRole - lazy val canCreateDynamicEntity = CanCreateDynamicEntity() + case class CanCreateSystemLevelDynamicEntity(requiresBankId: Boolean = false) extends ApiRole + lazy val canCreateSystemLevelDynamicEntity = CanCreateSystemLevelDynamicEntity() case class CanCreateBankLevelDynamicEntity(requiresBankId: Boolean = true) extends ApiRole lazy val canCreateBankLevelDynamicEntity = CanCreateBankLevelDynamicEntity() - case class CanUpdateDynamicEntity(requiresBankId: Boolean = false) extends ApiRole - lazy val canUpdateDynamicEntity = CanUpdateDynamicEntity() + case class CanUpdateSystemLevelDynamicEntity(requiresBankId: Boolean = false) extends ApiRole + lazy val canUpdateSystemDynamicEntity = CanUpdateSystemLevelDynamicEntity() case class CanUpdateBankLevelDynamicEntity(requiresBankId: Boolean = true) extends ApiRole lazy val canUpdateBankLevelDynamicEntity = CanUpdateBankLevelDynamicEntity() - case class CanDeleteDynamicEntity(requiresBankId: Boolean = false) extends ApiRole - lazy val canDeleteDynamicEntity = CanDeleteDynamicEntity() + case class CanDeleteSystemLevelDynamicEntity(requiresBankId: Boolean = false) extends ApiRole + lazy val canDeleteSystemLevelDynamicEntity = CanDeleteSystemLevelDynamicEntity() case class CanDeleteBankLevelDynamicEntity(requiresBankId: Boolean = true) extends ApiRole lazy val canDeleteBankLevelDynamicEntity = CanDeleteBankLevelDynamicEntity() 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 7ff1d5ae5..ecf09c82b 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 @@ -1984,13 +1984,13 @@ trait APIMethods400 { staticResourceDocs += ResourceDoc( - getDynamicEntities, + getSystemDynamicEntities, implementedInApiVersion, - nameOf(getDynamicEntities), + nameOf(getSystemDynamicEntities), "GET", - "/management/dynamic-entities", - "Get Dynamic Entities", - s"""Get the all Dynamic Entities.""", + "/management/system-dynamic-entities", + "Get System Dynamic Entities", + s"""Get all System Dynamic Entities """, EmptyBody, ListResult( "dynamic_entities", @@ -2002,12 +2002,11 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canGetDynamicEntities)) + Some(List(canGetSystemLevelDynamicEntities)) ) - - lazy val getDynamicEntities: OBPEndpoint = { - case "management" :: "dynamic-entities" :: Nil JsonGet req => { + lazy val getSystemDynamicEntities: OBPEndpoint = { + case "management" :: "system-dynamic-entities" :: Nil JsonGet req => { cc => for { dynamicEntities <- Future(NewStyle.function.getDynamicEntities(None)) @@ -2039,7 +2038,7 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canGetBankLevelDynamicEntities, canGetDynamicEntities)) + Some(List(canGetBankLevelDynamicEntities)) ) lazy val getBankLevelDynamicEntities: OBPEndpoint = { @@ -2073,13 +2072,13 @@ trait APIMethods400 { } private def createDynamicEntityDoc = ResourceDoc( - createDynamicEntity, + createSystemDynamicEntity, implementedInApiVersion, - nameOf(createDynamicEntity), + nameOf(createSystemDynamicEntity), "POST", - "/management/dynamic-entities", - "Create Dynamic Entity", - s"""Create a DynamicEntity. + "/management/system-dynamic-entities", + "Create System Level Dynamic Entity", + s"""Create a system level Dynamic Entity. | | |${authenticationRequiredMessage(true)} @@ -2096,9 +2095,6 @@ trait APIMethods400 { |``` |${ReferenceType.referenceTypeAndExample.mkString("\n")} |``` - | Note: BankId filed is optional, - | if you add it, the entity will be the Bank level. - | if you omit it, the entity will be the System level. |""", dynamicEntityRequestBodyExample.copy(bankId = None), dynamicEntityResponseBodyExample.copy(bankId = None), @@ -2109,12 +2105,12 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canCreateDynamicEntity))) + Some(List(canCreateSystemLevelDynamicEntity))) - lazy val createDynamicEntity: OBPEndpoint = { - case "management" :: "dynamic-entities" :: Nil JsonPost json -> _ => { + lazy val createSystemDynamicEntity: OBPEndpoint = { + case "management" :: "system-dynamic-entities" :: Nil JsonPost json -> _ => { cc => - val dynamicEntity = DynamicEntityCommons(json.asInstanceOf[JObject], None, cc.userId) + val dynamicEntity = DynamicEntityCommons(json.asInstanceOf[JObject], None, cc.userId, None) createDynamicEntityMethod(cc, dynamicEntity) } } @@ -2156,11 +2152,11 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canCreateBankLevelDynamicEntity, canCreateDynamicEntity))) + Some(List(canCreateBankLevelDynamicEntity))) lazy val createBankLevelDynamicEntity: OBPEndpoint = { case "management" ::"banks" :: BankId(bankId) :: "dynamic-entities" :: Nil JsonPost json -> _ => { cc => - val dynamicEntity = DynamicEntityCommons(json.asInstanceOf[JObject], None, cc.userId).copy(bankId = Some(bankId.value)) + val dynamicEntity = DynamicEntityCommons(json.asInstanceOf[JObject], None, cc.userId, Some(bankId.value)) createDynamicEntityMethod(cc, dynamicEntity) } } @@ -2177,7 +2173,7 @@ trait APIMethods400 { } jsonObject = json.asInstanceOf[JObject] - dynamicEntity = DynamicEntityCommons(jsonObject, Some(dynamicEntityId), cc.userId).copy(bankId = bankId) + dynamicEntity = DynamicEntityCommons(jsonObject, Some(dynamicEntityId), cc.userId, bankId) Full(result) <- NewStyle.function.createOrUpdateDynamicEntity(dynamicEntity, cc.callContext) } yield { val commonsData: DynamicEntityCommons = result @@ -2187,13 +2183,13 @@ trait APIMethods400 { private def updateDynamicEntityDoc = ResourceDoc( - updateDynamicEntity, + updateSystemDynamicEntity, implementedInApiVersion, - nameOf(updateDynamicEntity), + nameOf(updateSystemDynamicEntity), "PUT", - "/management/dynamic-entities/DYNAMIC_ENTITY_ID", - "Update Dynamic Entity", - s"""Update a DynamicEntity. + "/management/system-dynamic-entities/DYNAMIC_ENTITY_ID", + "Update System Level Dynamic Entity", + s"""Update a System Level Dynamic Entity. | | |${authenticationRequiredMessage(true)} @@ -2216,13 +2212,14 @@ trait APIMethods400 { List( $UserNotLoggedIn, UserHasMissingRoles, + DynamicEntityNotFoundByDynamicEntityId, InvalidJsonFormat, UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canUpdateDynamicEntity))) - lazy val updateDynamicEntity: OBPEndpoint = { - case "management" :: "dynamic-entities" :: dynamicEntityId :: Nil JsonPut json -> _ => { + Some(List(canUpdateSystemDynamicEntity))) + lazy val updateSystemDynamicEntity: OBPEndpoint = { + case "management" :: "system-dynamic-entities" :: dynamicEntityId :: Nil JsonPut json -> _ => { cc => updateDynamicEntityMethod(None, dynamicEntityId, json, cc) } @@ -2263,7 +2260,7 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canUpdateBankLevelDynamicEntity, canUpdateDynamicEntity))) + Some(List(canUpdateBankLevelDynamicEntity))) lazy val updateBankLevelDynamicEntity: OBPEndpoint = { case "management" :: "banks" :: bankId :: "dynamic-entities" :: dynamicEntityId :: Nil JsonPut json -> _ => { cc => @@ -2272,12 +2269,12 @@ trait APIMethods400 { } staticResourceDocs += ResourceDoc( - deleteDynamicEntity, + deleteSystemDynamicEntity, implementedInApiVersion, - nameOf(deleteDynamicEntity), + nameOf(deleteSystemDynamicEntity), "DELETE", - "/management/dynamic-entities/DYNAMIC_ENTITY_ID", - "Delete Dynamic Entity", + "/management/system-dynamic-entities/DYNAMIC_ENTITY_ID", + "Delete System Level Dynamic Entity", s"""Delete a DynamicEntity specified by DYNAMIC_ENTITY_ID. | |""", @@ -2289,9 +2286,9 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canDeleteDynamicEntity))) - lazy val deleteDynamicEntity: OBPEndpoint = { - case "management" :: "dynamic-entities" :: dynamicEntityId :: Nil JsonDelete _ => { + Some(List(canDeleteSystemLevelDynamicEntity))) + lazy val deleteSystemDynamicEntity: OBPEndpoint = { + case "management" :: "system-dynamic-entities" :: dynamicEntityId :: Nil JsonDelete _ => { cc => deleteDynamicEntityMethod(None, dynamicEntityId, cc) } @@ -2308,7 +2305,7 @@ trait APIMethods400 { } deleted: Box[Boolean] <- NewStyle.function.deleteDynamicEntity(bankId, dynamicEntityId) } yield { - (deleted, HttpCode.`204`(cc.callContext)) + (deleted, HttpCode.`200`(cc.callContext)) } } @@ -2331,7 +2328,7 @@ trait APIMethods400 { UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle), - Some(List(canDeleteBankLevelDynamicEntity, canDeleteDynamicEntity))) + Some(List(canDeleteBankLevelDynamicEntity))) lazy val deleteBankLevelDynamicEntity: OBPEndpoint = { case "management" :: "banks" :: bankId :: "dynamic-entities" :: dynamicEntityId :: Nil JsonDelete _ => { cc => @@ -2402,6 +2399,7 @@ trait APIMethods400 { List( $UserNotLoggedIn, InvalidJsonFormat, + DynamicEntityNotFoundByDynamicEntityId, UnknownError ), List(apiTagManageDynamicEntity, apiTagApi, apiTagNewStyle) @@ -2411,18 +2409,19 @@ trait APIMethods400 { case "my" :: "dynamic-entities" :: dynamicEntityId :: Nil JsonPut json -> _ => { cc => for { - // Check whether there are uploaded data, only if no uploaded data allow to update DynamicEntity. - (entity, _) <- NewStyle.function.getDynamicEntityById(None, dynamicEntityId, cc.callContext) - _ <- Helper.booleanToFuture(InvalidMyDynamicEntityUser, cc=cc.callContext) { - entity.userId.equals(cc.userId) + dynamicEntities <- Future(NewStyle.function.getDynamicEntitiesByUserId(cc.userId)) + entityOption = dynamicEntities.find(_.dynamicEntityId.equals(Some(dynamicEntityId))) + myEntity <- NewStyle.function.tryons(InvalidMyDynamicEntityUser, 400, cc.callContext) { + entityOption.get } - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, None, false, cc.callContext) - resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], entity.entityName) + // Check whether there are uploaded data, only if no uploaded data allow to update DynamicEntity. + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, myEntity.entityName, None, myEntity.dynamicEntityId, myEntity.bankId, None, Some(myEntity.userId), false, cc.callContext) + resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], myEntity.entityName) _ <- Helper.booleanToFuture(DynamicEntityOperationNotAllowed, cc=cc.callContext) { resultList.arr.isEmpty } jsonObject = json.asInstanceOf[JObject] - dynamicEntity = DynamicEntityCommons(jsonObject, Some(dynamicEntityId), cc.userId) + dynamicEntity = DynamicEntityCommons(jsonObject, Some(dynamicEntityId), cc.userId, myEntity.bankId) Full(result) <- NewStyle.function.createOrUpdateDynamicEntity(dynamicEntity, cc.callContext) } yield { val commonsData: DynamicEntityCommons = result @@ -2454,17 +2453,18 @@ trait APIMethods400 { case "my" :: "dynamic-entities" :: dynamicEntityId :: Nil JsonDelete _ => { cc => for { - // Check whether there are uploaded data, only if no uploaded data allow to delete DynamicEntity. - (entity, _) <- NewStyle.function.getDynamicEntityById(None, dynamicEntityId, cc.callContext) - _ <- Helper.booleanToFuture(InvalidMyDynamicEntityUser, cc=cc.callContext) { - entity.userId.equals(cc.userId) + dynamicEntities <- Future(NewStyle.function.getDynamicEntitiesByUserId(cc.userId)) + entityOption = dynamicEntities.find(_.dynamicEntityId.equals(Some(dynamicEntityId))) + myEntity <- NewStyle.function.tryons(InvalidMyDynamicEntityUser, 400, cc.callContext) { + entityOption.get } - (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, entity.entityName, None, None, entity.bankId, None, None, false, cc.callContext) - resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], entity.entityName) + // Check whether there are uploaded data, only if no uploaded data allow to delete DynamicEntity. + (box, _) <- NewStyle.function.invokeDynamicConnector(GET_ALL, myEntity.entityName, None, myEntity.dynamicEntityId, myEntity.bankId, None, Some(myEntity.userId), false, cc.callContext) + resultList: JArray = unboxResult(box.asInstanceOf[Box[JArray]], myEntity.entityName) _ <- Helper.booleanToFuture(DynamicEntityOperationNotAllowed, cc=cc.callContext) { resultList.arr.isEmpty } - deleted: Box[Boolean] <- NewStyle.function.deleteDynamicEntity(None, dynamicEntityId) + deleted: Box[Boolean] <- NewStyle.function.deleteDynamicEntity(myEntity.bankId, dynamicEntityId) } yield { (deleted, HttpCode.`200`(cc.callContext)) } diff --git a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala index 6295d876a..de4687174 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala @@ -376,8 +376,6 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo * @param jsonObject the follow schema json: * {{{ * { - * "BankId": "gh.29.uk", - * "isPersonalEntity": true, * "FooBar": { * "description": "description of this entity, can be markdown text.", * "required": [ @@ -401,11 +399,9 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo * } * }}} * @param dynamicEntityId - * @param bankId - * @param isPersonalEntity * @return object of DynamicEntityCommons */ - def apply(jsonObject: JObject, dynamicEntityId: Option[String], userId: String): DynamicEntityCommons = { + def apply(jsonObject: JObject, dynamicEntityId: Option[String], userId: String, bankId: Option[String]): DynamicEntityCommons = { def checkFormat(requirement: Boolean, message: String) = { if (!requirement) throw new IllegalArgumentException(message) @@ -524,7 +520,7 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo } }) - DynamicEntityCommons(entityName, compactRender(jsonObject), dynamicEntityId, userId, None, hasPersonalEntity) + DynamicEntityCommons(entityName, compactRender(jsonObject), dynamicEntityId, userId, bankId, hasPersonalEntity) } private def allowedFieldType: List[String] = DynamicEntityFieldType.values.map(_.toString) ++: ReferenceType.referenceTypeNames diff --git a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala index 75987c169..8886b38f5 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala @@ -11,17 +11,18 @@ import org.apache.commons.lang3.StringUtils object MappedDynamicEntityProvider extends DynamicEntityProvider with CustomJsonFormats with MdcLoggable { override def getById(bankId: Option[String], dynamicEntityId: String): Box[DynamicEntityT] = { - if (bankId.isEmpty) - DynamicEntity.find(By(DynamicEntity.DynamicEntityId, dynamicEntityId)) + if (bankId.isEmpty)//If bankId is empty, we only return the system level entities + DynamicEntity.find( + By(DynamicEntity.DynamicEntityId, dynamicEntityId), + NullRef(DynamicEntity.BankId)) else DynamicEntity.find( By(DynamicEntity.DynamicEntityId, dynamicEntityId), - By(DynamicEntity.BankId, bankId.get - )) + By(DynamicEntity.BankId, bankId.get)) } override def getByEntityName(bankId: Option[String], entityName: String): Box[DynamicEntityT] = - if (bankId.isEmpty) + if (bankId.isEmpty)//If Bank id is empty, we only return the system level entity DynamicEntity.find( By(DynamicEntity.EntityName, entityName), NullRef(DynamicEntity.BankId) @@ -34,8 +35,8 @@ object MappedDynamicEntityProvider extends DynamicEntityProvider with CustomJson override def getDynamicEntities(bankId: Option[String]): List[DynamicEntity] = { - if (bankId.isEmpty) - DynamicEntity.findAll() + if (bankId.isEmpty)//If Bank id is empty, we only return the system level entity + DynamicEntity.findAll(NullRef(DynamicEntity.BankId)) else DynamicEntity.findAll(By(DynamicEntity.BankId, bankId.get)) } diff --git a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala index 43c782269..b062d93ea 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala @@ -403,7 +403,7 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { } // prepare one dynamic entity FooBar private def addDynamicEntity(): APIResponse = { - grantEntitlement(canCreateDynamicEntity) + grantEntitlement(canCreateSystemLevelDynamicEntity) val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@ user1 val fooBar = s""" diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala index cd32afd66..9dc66f0bd 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala @@ -47,18 +47,19 @@ class DynamicEntityTest extends V400ServerSetup { * This is made possible by the scalatest maven plugin */ object VersionOfApi extends Tag(ApiVersion.v4_0_0.toString) - object ApiEndpoint1 extends Tag(nameOf(Implementations4_0_0.createDynamicEntity)) - object ApiEndpoint2 extends Tag(nameOf(Implementations4_0_0.updateDynamicEntity)) - object ApiEndpoint3 extends Tag(nameOf(Implementations4_0_0.getDynamicEntities)) - object ApiEndpoint4 extends Tag(nameOf(Implementations4_0_0.deleteDynamicEntity)) + object ApiEndpoint1 extends Tag(nameOf(Implementations4_0_0.createSystemDynamicEntity)) + object ApiEndpoint2 extends Tag(nameOf(Implementations4_0_0.updateSystemDynamicEntity)) + object ApiEndpoint3 extends Tag(nameOf(Implementations4_0_0.getSystemDynamicEntities)) + object ApiEndpoint4 extends Tag(nameOf(Implementations4_0_0.deleteSystemDynamicEntity)) + object ApiEndpoint5 extends Tag(nameOf(Implementations4_0_0.getMyDynamicEntities)) object ApiEndpoint6 extends Tag(nameOf(Implementations4_0_0.updateMyDynamicEntity)) object ApiEndpoint7 extends Tag(nameOf(Implementations4_0_0.deleteMyDynamicEntity)) + object ApiEndpoint8 extends Tag(nameOf(Implementations4_0_0.getBankLevelDynamicEntities)) object ApiEndpoint9 extends Tag(nameOf(Implementations4_0_0.createBankLevelDynamicEntity)) - object ApiEndpoint10 extends Tag(nameOf(Implementations4_0_0.getBankLevelDynamicEntities)) - object ApiEndpoint11 extends Tag(nameOf(Implementations4_0_0.deleteBankLevelDynamicEntity)) - object ApiEndpoint12 extends Tag(nameOf(Implementations4_0_0.updateBankLevelDynamicEntity)) + object ApiEndpoint10 extends Tag(nameOf(Implementations4_0_0.deleteBankLevelDynamicEntity)) + object ApiEndpoint11 extends Tag(nameOf(Implementations4_0_0.updateBankLevelDynamicEntity)) val rightEntity = parse( """ @@ -85,30 +86,6 @@ class DynamicEntityTest extends V400ServerSetup { |} |""".stripMargin) - val rightEntityBankLevel = parse( - """ - |{ - | "FooBarBankLevel": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) // wrong required name val wrongRequiredEntity = parse( """ @@ -182,156 +159,114 @@ class DynamicEntityTest extends V400ServerSetup { | } |} |""".stripMargin) + + feature("CRUD System Level Dynamic Entity endpoints") { - feature("Add a DynamicEntity v4.0.4- Unauthorized access") { - scenario("We will call the endpoint without user credentials", ApiEndpoint1, ApiEndpoint9, VersionOfApi) { - When("We make a request v4.0.0") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities").POST + scenario("CRUD Dynamic - without user credentials", ApiEndpoint1, ApiEndpoint2, ApiEndpoint3, ApiEndpoint4, VersionOfApi) { + When(s"We make a $ApiEndpoint1 request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities").POST val response400 = makePostRequest(request400, write(rightEntity)) Then("We should get a 401") response400.code should equal(401) And("error should be " + UserNotLoggedIn) response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) - Then("Test the bank level") - { - val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST - val response400 = makePostRequest(request400, write(rightEntity)) - Then("We should get a 401") - response400.code should equal(401) - And("error should be " + UserNotLoggedIn) - response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) - } - } - } - feature("Update a DynamicEntity v4.0.4- Unauthorized access") { - scenario("We will call the endpoint without user credentials", ApiEndpoint2, ApiEndpoint12, VersionOfApi) { - When("We make a request v4.0.0") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities"/ "some-method-routing-id").PUT - val response400 = makePutRequest(request400, write(rightEntity)) - Then("We should get a 401") - response400.code should equal(401) - And("error should be " + UserNotLoggedIn) - response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) - - Then("Test the bank level") - - { - val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities"/ "some-method-routing-id").PUT + When(s"We make a request $ApiEndpoint2 v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / "some-method-routing-id").PUT val response400 = makePutRequest(request400, write(rightEntity)) Then("We should get a 401") response400.code should equal(401) And("error should be " + UserNotLoggedIn) - response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) - + response400.body.extract[ErrorMessage].message should equal(UserNotLoggedIn) } - } - } - feature("Get DynamicEntities v4.0.4- Unauthorized access") { - scenario("We will call the endpoint without user credentials", ApiEndpoint3, ApiEndpoint10, VersionOfApi) { - When("We make a request v4.0.0") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities").GET - val response400 = makeGetRequest(request400) - Then("We should get a 401") - response400.code should equal(401) - And("error should be " + UserNotLoggedIn) - response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) - - Then("Test the bank level") - { - val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").GET + When(s"We make a request $ApiEndpoint3 v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities").GET val response400 = makeGetRequest(request400) Then("We should get a 401") response400.code should equal(401) And("error should be " + UserNotLoggedIn) response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) } - } - } - feature("Delete the DynamicEntity specified by METHOD_ROUTING_ID v4.0.4- Unauthorized access") { - scenario("We will call the endpoint without user credentials", ApiEndpoint4, ApiEndpoint11, VersionOfApi) { - When("We make a request v4.0.0") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / "METHOD_ROUTING_ID").DELETE - val response400 = makeDeleteRequest(request400) - Then("We should get a 401") - response400.code should equal(401) - And("error should be " + UserNotLoggedIn) - response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) - - Then("Test the bank level") { - val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / "METHOD_ROUTING_ID").DELETE + When(s"We make a $ApiEndpoint4 request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / "DYNAMIC_ENTITY_ID").DELETE val response400 = makeDeleteRequest(request400) Then("We should get a 401") response400.code should equal(401) And("error should be " + UserNotLoggedIn) response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) } - } - } - feature("Add a DynamicEntity v4.0.4- Unauthorized access - Authorized access") { - scenario("We will call the endpoint without the proper Role " + canCreateDynamicEntity, ApiEndpoint1, VersionOfApi) { - When("We make a request v4.0.0 without a Role " + canCreateDynamicEntity) - val request400 = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) + scenario("CRUD Dynamic - without the proper Role" , ApiEndpoint1, ApiEndpoint2, ApiEndpoint3, ApiEndpoint4, VersionOfApi) { + When("We make a request v4.0.0 without a Role " + canCreateSystemLevelDynamicEntity) + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) val response400 = makePostRequest(request400, write(rightEntity)) Then("We should get a 403") response400.code should equal(403) - And("error should be " + UserHasMissingRoles + CanCreateDynamicEntity) - response400.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + CanCreateDynamicEntity) - - Then("Test the bank level") + And("error should be " + UserHasMissingRoles + CanCreateSystemLevelDynamicEntity) + response400.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + CanCreateSystemLevelDynamicEntity) { - val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST <@(user1) - val response400 = makePostRequest(request400, write(rightEntity)) + When(s"We make a request $ApiEndpoint2 v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / "some-method-routing-id").PUT <@(user1) + val response400 = makePutRequest(request400, write(rightEntity)) Then("We should get a 403") response400.code should equal(403) - response400.body.extract[ErrorMessage].message contains UserHasMissingRoles should be (true) + And("error should be " + UserHasMissingRoles + CanUpdateSystemLevelDynamicEntity) + response400.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + CanUpdateSystemLevelDynamicEntity) } + { + When(s"We make a request $ApiEndpoint3 v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities").GET <@(user1) + val response400 = makeGetRequest(request400) + Then("We should get a 403") + response400.code should equal(403) + And("error should be " + UserHasMissingRoles + CanGetSystemLevelDynamicEntities) + response400.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + CanGetSystemLevelDynamicEntities) + } + + { + When(s"We make a $ApiEndpoint4 request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / "DYNAMIC_ENTITY_ID").DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + Then("We should get a 403") + response400.code should equal(403) + And("error should be " + UserHasMissingRoles + CanDeleteSystemLevelDynamicEntity) + response400.body.extract[ErrorMessage].message should equal (UserHasMissingRoles + CanDeleteSystemLevelDynamicEntity) + } } - scenario("We will call the endpoint with the proper Role " + canCreateDynamicEntity , ApiEndpoint1, ApiEndpoint2, ApiEndpoint3, ApiEndpoint4, ApiEndpoint8,ApiEndpoint9, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) + + scenario("Create Dynamic - two users can not create the same entity name", ApiEndpoint1, VersionOfApi) { When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) + val request400User1 = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + val response400User1 = makePostRequest(request400User1, write(rightEntity)) + Then("We should get a 201") + response400User1.code should equal(201) + + val request400User2 = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) + val response400User2 = makePostRequest(request400User2, write(rightEntity)) + Then("We should get a 400") + response400User2.code should equal(400) + val errorMessage = response400User2.body.extract[ErrorMessage].message + errorMessage contains DynamicEntityNameAlreadyExists should be (true) + } + + scenario("We will test the successful cases " , ApiEndpoint1, ApiEndpoint2, ApiEndpoint3, ApiEndpoint4, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) val response = makePostRequest(request, write(rightEntity)) Then("We should get a 201") response.code should equal(201) - - {//Test the bank level create entity - val request = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST<@(user1) - val response = makePostRequest(request, write(rightEntityBankLevel)) - Then("We should get a 201") - response.code should equal(201) - } - - {// create duplicated entityName FooBar, cause 400 - val request = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST<@(user1) - val response = makePostRequest(request, write(rightEntityBankLevel)) - Then("We should get a 400") - response.code should equal(400) - } - - { //now bank level and system level can have same entity name - val request = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST<@(user1) - val response = makePostRequest(request, write(rightEntity)) - Then("We should get a 201") - response.code should equal(201) - } - - { // create duplicated entityName FooBar, cause 400 - val response400 = makePostRequest(request, write(rightEntity)) - response400.code should equal(400) - response400.body.extract[ErrorMessage].message should startWith (DynamicEntityNameAlreadyExists) - } - val responseJson = response.body val dynamicEntityId = (responseJson \ "dynamicEntityId").asInstanceOf[JString].s val dynamicEntityUserIdJObject: JObject = "userId" -> resourceUser1.userId @@ -352,12 +287,12 @@ class DynamicEntityTest extends V400ServerSetup { responseJson shouldEqual expectCreateResponseJson - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanUpdateDynamicEntity.toString) - When("We make a request v4.0.0 with the Role " + canUpdateDynamicEntity) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanUpdateSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + canUpdateSystemDynamicEntity) { // update success - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId ).PUT <@(user1) val response400 = makePutRequest(request400, compactRender(updateRequest)) Then("We should get a 200") response400.code should equal(200) @@ -367,7 +302,7 @@ class DynamicEntityTest extends V400ServerSetup { { // update a not exists DynamicEntity - val request404 = (v4_0_0_Request / "management" / "dynamic-entities" / "not-exists-id" ).PUT <@(user1) + val request404 = (v4_0_0_Request / "management" / "system-dynamic-entities" / "not-exists-id" ).PUT <@(user1) val response404 = makePutRequest(request404, compactRender(updateRequest)) Then("We should get a 404") response404.code should equal(404) @@ -376,7 +311,7 @@ class DynamicEntityTest extends V400ServerSetup { { // update a DynamicEntity with wrong required field name - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId ).PUT <@(user1) val response400 = makePutRequest(request400, compactRender(wrongRequiredEntity)) Then("We should get a 400") @@ -386,7 +321,7 @@ class DynamicEntityTest extends V400ServerSetup { { // update a DynamicEntity with wrong type of description - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId ).PUT <@(user1) val response400 = makePutRequest(request400, compactRender(wrongDescriptionEntity)) Then("We should get a 400") @@ -396,7 +331,7 @@ class DynamicEntityTest extends V400ServerSetup { { // update a DynamicEntity with wrong type of property description - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId ).PUT <@(user1) val response400 = makePutRequest(request400, compactRender(wrongPropertyDescriptionEntity)) Then("We should get a 400") @@ -404,47 +339,352 @@ class DynamicEntityTest extends V400ServerSetup { response400.body.extract[ErrorMessage].message should startWith (DynamicEntityInstanceValidateFail) } - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanGetDynamicEntities.toString) - When("We make a request v4.0.0 with the Role " + canGetDynamicEntities) - val requestGet = (v4_0_0_Request / "management" / "dynamic-entities").GET <@(user1) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanGetSystemLevelDynamicEntities.toString) + When("We make a request v4.0.0 with the Role " + canGetSystemLevelDynamicEntities) + val requestGet = (v4_0_0_Request / "management" / "system-dynamic-entities").GET <@(user1) val responseGet = makeGetRequest(requestGet) Then("We should get a 200") responseGet.code should equal(200) val json = responseGet.body \ "dynamic_entities" val dynamicEntitiesGetJson = json.asInstanceOf[JArray] - dynamicEntitiesGetJson.values should have size 3 + dynamicEntitiesGetJson.values should have size 1 dynamicEntitiesGetJson.arr should contain(expectUpdatedResponseJson) - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteDynamicEntity.toString) - When("We make a request v4.0.0 with the Role " + canDeleteDynamicEntity) - val requestDelete400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityId).DELETE <@(user1) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + canDeleteSystemLevelDynamicEntity) + val requestDelete400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) val responseDelete400 = makeDeleteRequest(requestDelete400) - Then("We should get a 204") - responseDelete400.code should equal(204) + Then("We should get a 200") + responseDelete400.code should equal(200) + { + When(s"We $canGetSystemLevelDynamicEntities again, it return empty") + val requestGet = (v4_0_0_Request / "management" / "system-dynamic-entities").GET <@(user1) + val responseGet = makeGetRequest(requestGet) + Then("We should get a 200") + responseGet.code should equal(200) + val json = responseGet.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + + dynamicEntitiesGetJson.values should have size 0 + } } } - feature("Add a DynamicEntity v4.0.4- and test all the myDynamicEntity endpoints") { - scenario("We will call the endpoint with the proper Role " + canCreateDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint7, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) + feature("Test CRUD Bank Level Dynamic Entities endpoints") { + + scenario("CRUD Bank Level DynamicEntities - without user credentials", ApiEndpoint8, ApiEndpoint9, ApiEndpoint10, ApiEndpoint11, VersionOfApi) { When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST + val response400 = makePostRequest(request400, write(rightEntity)) + Then("We should get a 401") + response400.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + + { + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities"/ "some-method-routing-id").PUT + val response400 = makePutRequest(request400, write(rightEntity)) + Then("We should get a 401") + response400.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + + { + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").GET + val response400 = makeGetRequest(request400) + Then("We should get a 401") + response400.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + + { + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / "METHOD_ROUTING_ID").DELETE + val response400 = makeDeleteRequest(request400) + Then("We should get a 401") + response400.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + + + } + + scenario("Create Dynamic - without the proper Roles", ApiEndpoint8, ApiEndpoint9, ApiEndpoint10, ApiEndpoint11, VersionOfApi) { + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST <@(user1) + val response400 = makePostRequest(request400, write(rightEntity)) + Then("We should get a 403") + response400.code should equal(403) + response400.body.extract[ErrorMessage].message contains UserHasMissingRoles should be (true) + response400.body.extract[ErrorMessage].message contains CanCreateBankLevelDynamicEntity.toString() should be (true) + + + { + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities"/ "some-method-routing-id").PUT <@(user1) + val response400 = makePutRequest(request400, write(rightEntity)) + Then("We should get a 403") + response400.code should equal(403) + response400.body.extract[ErrorMessage].message contains UserHasMissingRoles should be (true) + response400.body.extract[ErrorMessage].message contains CanUpdateBankLevelDynamicEntity.toString() should be (true) + } + + { + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").GET <@(user1) + val response400 = makeGetRequest(request400) + Then("We should get a 403") + response400.code should equal(403) + response400.body.extract[ErrorMessage].message contains UserHasMissingRoles should be (true) + response400.body.extract[ErrorMessage].message contains CanGetBankLevelDynamicEntities.toString() should be (true) + } + + { + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / "METHOD_ROUTING_ID").DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + Then("We should get a 403") + response400.code should equal(403) + response400.body.extract[ErrorMessage].message contains UserHasMissingRoles should be (true) + response400.body.extract[ErrorMessage].message contains CanDeleteBankLevelDynamicEntity.toString() should be (true) + } + + } + + scenario("Create Dynamic - two users can not the same entity name at same bank", ApiEndpoint9, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, CanCreateBankLevelDynamicEntity.toString) + val request400User1BankLevel = (v4_0_0_Request / "management" / "banks"/ testBankId1.value / "dynamic-entities").POST <@(user1) + val response400User1BankLevel = makePostRequest(request400User1BankLevel, write(rightEntity)) + Then("We should get a 201") + response400User1BankLevel.code should equal(201) + + val request400User2BankLevel = (v4_0_0_Request / "management" / "banks"/ testBankId1.value / "dynamic-entities").POST <@(user2) + val response400User2BankLevel = makePostRequest(request400User2BankLevel, write(rightEntity)) + Then("We should get a 400") + response400User2BankLevel.code should equal(400) + val errorMessageBankLevel = response400User2BankLevel.body.extract[ErrorMessage].message + errorMessageBankLevel contains DynamicEntityNameAlreadyExists should be (true) + } + + scenario("Create Dynamic - one user can create the same entity name at different banks", ApiEndpoint9, VersionOfApi) { + When("We make a request v4.0.0") + + Then(s"we test the Bank Level $ApiEndpoint9") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId2.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + val request400User1BankLevel = (v4_0_0_Request / "management" / "banks"/ testBankId1.value / "dynamic-entities").POST <@(user1) + val response400User1BankLevel = makePostRequest(request400User1BankLevel, write(rightEntity)) + Then("We should get a 201") + response400User1BankLevel.code should equal(201) + + val request400User2BankLevel = (v4_0_0_Request / "management" / "banks"/ testBankId2.value / "dynamic-entities").POST <@(user1) + val response400User2BankLevel = makePostRequest(request400User2BankLevel, write(rightEntity)) + Then("We should get a 201") + response400User2BankLevel.code should equal(201) + } + + scenario("We will test the successful cases ", ApiEndpoint8, ApiEndpoint9, ApiEndpoint10, ApiEndpoint11, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities").POST <@(user1) val response = makePostRequest(request, write(rightEntity)) Then("We should get a 201") response.code should equal(201) - {//Test the bank level create entity - val request = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST<@(user1) - val response = makePostRequest(request, write(rightEntityBankLevel)) - Then("We should get a 201") - response.code should equal(201) - } - val responseJson = response.body val dynamicEntityId = (responseJson \ "dynamicEntityId").asInstanceOf[JString].s + val dynamicBankId = (responseJson \ "bankId").asInstanceOf[JString].s + + val dynamicEntityUserIdJObject: JObject = "userId" -> resourceUser1.userId + val dynamicEntityIdJObject: JObject = "dynamicEntityId" -> dynamicEntityId + val dynamicBankIdJObject: JObject = "bankId" -> testBankId1.value + + val expectCreateResponseJson: JValue = rightEntity merge dynamicEntityUserIdJObject merge dynamicBankIdJObject merge dynamicEntityIdJObject + + responseJson shouldEqual expectCreateResponseJson + + + val newNameValue: JObject = + "FooBar" -> ( + "properties" -> + ("name" -> ( + "example" -> "hello") + ) + ) + + val updateRequest: JValue = rightEntity merge newNameValue + val expectUpdatedResponseJson: JValue = expectCreateResponseJson merge newNameValue + + { + Then(s"We test $ApiEndpoint8") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanGetBankLevelDynamicEntities.toString) + val requestGet = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").GET <@ (user1) + val responseGet = makeGetRequest(requestGet) + responseGet.code should equal(200) + val json = responseGet.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + + dynamicEntitiesGetJson.values should have size 1 + } + + { + // we try the different bank id, but no roles for that bank. + + val requestGet = (v4_0_0_Request /"management" / "banks" /testBankId2.value/ "dynamic-entities").GET <@(user1) + val responseGet = makeGetRequest(requestGet) + Then("We should get a 403") + responseGet.code should equal(403) + And("error should be " + UserHasMissingRoles + CanGetBankLevelDynamicEntities) + val errorMessage = responseGet.body.extract[ErrorMessage].message + errorMessage contains UserHasMissingRoles should be (true) + errorMessage contains CanGetBankLevelDynamicEntities.toString() should be (true) + //we grant the role and try it again. + + { + + Entitlement.entitlement.vend.addEntitlement(testBankId2.value, resourceUser1.userId, CanGetBankLevelDynamicEntities.toString) + val responseGet = makeGetRequest(requestGet) + Then("We should get a 200") + responseGet.code should equal(200) + val json = responseGet.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + + dynamicEntitiesGetJson.values should have size 0 + + } + + } + + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanUpdateBankLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + CanUpdateSystemLevelDynamicEntity) + + { + // update success + val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 200") + response400.code should equal(200) + val updateResponseJson = response400.body + updateResponseJson shouldEqual expectUpdatedResponseJson + } + + { + // update a not exists DynamicEntity + val request404 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities" / "not-exists-id" ).PUT <@(user1) + val response404 = makePutRequest(request404, compactRender(updateRequest)) + Then("We should get a 404") + response404.code should equal(404) + response404.body.extract[ErrorMessage].message should startWith (DynamicEntityNotFoundByDynamicEntityId) + } + + { + // update a DynamicEntity with wrong required field name + val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val response400 = makePutRequest(request400, compactRender(wrongRequiredEntity)) + Then("We should get a 400") + + response400.code should equal(400) + response400.body.extract[ErrorMessage].message should startWith (DynamicEntityInstanceValidateFail) + } + + { + // update a DynamicEntity with wrong type of description + val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val response400 = makePutRequest(request400, compactRender(wrongDescriptionEntity)) + Then("We should get a 400") + + response400.code should equal(400) + response400.body.extract[ErrorMessage].message should startWith (DynamicEntityInstanceValidateFail) + } + + { + // update a DynamicEntity with wrong type of property description + val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities" / dynamicEntityId ).PUT <@(user1) + val response400 = makePutRequest(request400, compactRender(wrongPropertyDescriptionEntity)) + Then("We should get a 400") + + response400.code should equal(400) + response400.body.extract[ErrorMessage].message should startWith (DynamicEntityInstanceValidateFail) + } + + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + CanCreateBankLevelDynamicEntity) + val requestGet = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities").GET <@(user1) + val responseGet = makeGetRequest(requestGet) + Then("We should get a 200") + responseGet.code should equal(200) + val json = responseGet.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + + dynamicEntitiesGetJson.values should have size 1 + + dynamicEntitiesGetJson.arr should contain(expectUpdatedResponseJson) + + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanDeleteBankLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + CanDeleteSystemLevelDynamicEntity) + val requestDelete400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities" / dynamicEntityId).DELETE <@(user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 200") + responseDelete400.code should equal(200) + + } + } + + feature("Test CRUD my Dynamic Entities endpoints") { + + scenario("Test CRUD myDynamic Entities- without user credentials", ApiEndpoint5, ApiEndpoint6, ApiEndpoint7, VersionOfApi) { + val dynamicEntityId = "forTestId" + When("We make a request v4.0.0") + val request400 = (v4_0_0_Request / "my" / "dynamic-entities").GET + val response400 = makeGetRequest(request400) + Then("We should get a 401") + response400.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + + val request400Put = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityId).PUT + val response400Put = makePutRequest(request400Put, write(rightEntity)) + Then("We should get a 401") + response400Put.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400Put.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + + val request400Delete = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityId).DELETE + val response400Delete = makeDeleteRequest(request400Delete) + Then("We should get a 401") + response400Delete.code should equal(401) + And("error should be " + UserNotLoggedIn) + response400Delete.body.extract[ErrorMessage].message should equal (UserNotLoggedIn) + } + + scenario("Test the CRUD Success cases ", ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint7, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + When("we first create system level entity") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + val response = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + response.code should equal(201) + val responseJson = response.body + val dynamicEntityId = (responseJson \ "dynamicEntityId").asInstanceOf[JString].s + + + Then("We create the bank level entity.") + val requestBankLevel = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST<@(user1) + val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) + Then("We should get a 201") + responseBankLevel.code should equal(201) + + val responseBankLevelJson = responseBankLevel.body + val dynamicEntityIdBankLevel = (responseBankLevelJson \ "dynamicEntityId").asInstanceOf[JString].s val dynamicEntityUserIdJObject: JObject = "userId" -> resourceUser1.userId val dynamicEntityIdJObject: JObject = "dynamicEntityId" -> dynamicEntityId @@ -467,7 +707,7 @@ class DynamicEntityTest extends V400ServerSetup { When(s"We make a $ApiEndpoint6" ) { - // update success + // test system level update success val request400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityId ).PUT <@(user1) val response400 = makePutRequest(request400, compactRender(updateRequest)) Then("We should get a 200") @@ -476,13 +716,23 @@ class DynamicEntityTest extends V400ServerSetup { updateResponseJson shouldEqual expectUpdatedResponseJson } + { + // test bank level update success + val request400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityIdBankLevel ).PUT <@(user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 200") + response400.code should equal(200) + val updateResponseJson = response400.body + updateResponseJson.toString contains(dynamicEntityIdBankLevel) shouldBe (true) + } + { // update a not exists DynamicEntity val request404 = (v4_0_0_Request / "my" / "dynamic-entities" / "not-exists-id" ).PUT <@(user1) val response404 = makePutRequest(request404, compactRender(updateRequest)) Then("We should get a 404") - response404.code should equal(404) - response404.body.extract[ErrorMessage].message should startWith (DynamicEntityNotFoundByDynamicEntityId) + response404.code should equal(400) + response404.body.extract[ErrorMessage].message should startWith (InvalidMyDynamicEntityUser) } { @@ -560,747 +810,785 @@ class DynamicEntityTest extends V400ServerSetup { response400.code should equal(400) response400.body.extract[ErrorMessage].message should startWith (InvalidMyDynamicEntityUser) } + { - // delete a MyDynamicEntity + // delete a MyDynamicEntity with proper user1 val requestDelete400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityId).DELETE <@(user1) val responseDelete400 = makeDeleteRequest(requestDelete400) Then("We should get a 200") responseDelete400.code should equal(200) } + { + // delete a MyDynamicEntity with proper user1 + val requestDelete400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@(user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 200") + responseDelete400.code should equal(200) + } + + { + Then(s"after delete all the dynamic entities, we call getEntities again, it should return empty list" ) + val requestGet = (v4_0_0_Request / "my" / "dynamic-entities").GET <@(user1) + val responseGet = makeGetRequest(requestGet) + Then("We should get a 200") + responseGet.code should equal(200) + val json = responseGet.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + dynamicEntitiesGetJson.values should have size 0 + } } } - feature("Add a DynamicEntity v4.0.4- and test all the getBankLevelDynamicEntities endpoints") { - scenario("We will call the endpoint with the proper Role " + canCreateDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) - When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) - val entityWithBankId = parse( - s""" - |{ - | "bankId": "${testBankId1.value}", - | "FooBar": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) + feature("Test CRUD Dynamic Entities Mixed System, Bank and my endpoints") { + scenario("We will test the successful cases ", ApiEndpoint1, ApiEndpoint2, ApiEndpoint3, ApiEndpoint4, ApiEndpoint5, ApiEndpoint6, ApiEndpoint7, ApiEndpoint8, ApiEndpoint9, VersionOfApi) { - val response = makePostRequest(request, write(entityWithBankId)) + // First, we create the system level dynamic entity + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ (user1) + val response = makePostRequest(request, write(rightEntity)) Then("We should get a 201") response.code should equal(201) val responseJson = response.body val dynamicEntityId = (responseJson \ "dynamicEntityId").asInstanceOf[JString].s - val dynamicBankId = (responseJson \ "bankId").asInstanceOf[JString].s - val dynamicEntityUserIdJObject: JObject = "userId" -> resourceUser1.userId val dynamicEntityIdJObject: JObject = "dynamicEntityId" -> dynamicEntityId + val expectCreateResponseJson: JValue = rightEntity merge dynamicEntityUserIdJObject merge dynamicEntityIdJObject - val expectCreateResponseJson: JValue = entityWithBankId merge dynamicEntityUserIdJObject merge dynamicEntityIdJObject - + // 2rd: we create the bank level dynamic entity + val requestBankLevel = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST <@ (user1) + val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) + Then("We should get a 201") + responseBankLevel.code should equal(201) + val responseJsonBankLevel = responseBankLevel.body + val dynamicEntityIdBankLevel = (responseBankLevel.body \ "dynamicEntityId").asInstanceOf[JString].s + val dynamicEntityIdJObjectBankLevel: JObject = "dynamicEntityId" -> dynamicEntityIdBankLevel + val bankIdObject: JObject = "bankId" -> testBankId1.value + val newNameValue: JObject = + "FooBar" -> ( + "properties" -> + ("name" -> ( + "example" -> "hello") + ) + ) + val updateRequest: JValue = rightEntity merge newNameValue + val expectUpdatedResponseJson: JValue = expectCreateResponseJson merge newNameValue responseJson shouldEqual expectCreateResponseJson - When(s"We make a $ApiEndpoint8 request without the role" ) - val requestGet = (v4_0_0_Request /"management" / "banks" /testBankId1.value/ "dynamic-entities").GET <@(user1) - val responseGet = makeGetRequest(requestGet) - Then("We should get a 403") - responseGet.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetBankLevelDynamicEntities) - val errorMessage = responseGet.body.extract[ErrorMessage].message - errorMessage contains UserHasMissingRoles should be (true) - errorMessage contains CanGetBankLevelDynamicEntities.toString() should be (true) - errorMessage contains CanGetDynamicEntities.toString() should be (true) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanUpdateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanUpdateBankLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + CanUpdateSystemLevelDynamicEntity) { - Then("We grant the role and call it again") - Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanGetBankLevelDynamicEntities.toString) - val requestGet = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").GET <@ (user1) - val responseGet = makeGetRequest(requestGet) - responseGet.code should equal(200) - val json = responseGet.body \ "dynamic_entities" - val dynamicEntitiesGetJson = json.asInstanceOf[JArray] - - dynamicEntitiesGetJson.values should have size 1 - } - - { - // we try the different bank id. - - val requestGet = (v4_0_0_Request /"management" / "banks" /testBankId2.value/ "dynamic-entities").GET <@(user1) - val responseGet = makeGetRequest(requestGet) - Then("We should get a 403") - responseGet.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetBankLevelDynamicEntities) - val errorMessage = responseGet.body.extract[ErrorMessage].message - errorMessage contains UserHasMissingRoles should be (true) - errorMessage contains CanGetBankLevelDynamicEntities.toString() should be (true) - errorMessage contains CanGetDynamicEntities.toString() should be (true) + // can update system entity + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).PUT <@ (user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 200") + response400.code should equal(200) + val updateResponseJson = response400.body + updateResponseJson shouldEqual expectUpdatedResponseJson + // But can not update bankLevel entity { - Entitlement.entitlement.vend.addEntitlement(testBankId2.value, resourceUser1.userId, CanGetBankLevelDynamicEntities.toString) - val responseGet = makeGetRequest(requestGet) - Then("We should get a 200") - responseGet.code should equal(200) - val json = responseGet.body \ "dynamic_entities" - val dynamicEntitiesGetJson = json.asInstanceOf[JArray] - - dynamicEntitiesGetJson.values should have size 0 + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityIdBankLevel).PUT <@ (user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 404") + response400.code should equal(404) + response400.body.toString contains (DynamicEntityNotFoundByDynamicEntityId) should be(true) } + { + // can update bank level entity using + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / dynamicEntityIdBankLevel).PUT <@ (user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 200") + response400.code should equal(200) + val updateResponseJson = response400.body + + // But can not update system entity + { + val request400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / dynamicEntityId).PUT <@ (user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 404") + response400.code should equal(404) + response400.body.toString contains (DynamicEntityNotFoundByDynamicEntityId) should be(true) + } + } + + { + // myDynamic can update bank level entity + val request400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityIdBankLevel).PUT <@ (user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 200") + response400.code should equal(200) + val updateResponseJson = response400.body + + // myDynamic can update system entity + { + val request400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityId).PUT <@ (user1) + val response400 = makePutRequest(request400, compactRender(updateRequest)) + Then("We should get a 200") + response400.code should equal(200) + val updateResponseJson = response400.body + updateResponseJson shouldEqual expectUpdatedResponseJson + } + } } + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanGetSystemLevelDynamicEntities.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanGetBankLevelDynamicEntities.toString) + + { + // get system entity return one record + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities").GET <@ (user1) + val response400 = makeGetRequest(request400) + Then("We should get a 200") + response400.code should equal(200) + val json = response400.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + dynamicEntitiesGetJson.values should have size 1 + dynamicEntitiesGetJson.arr should contain(expectUpdatedResponseJson) + + // get bank entity return one record + { + val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value/ "dynamic-entities").GET <@(user1) + val response400 = makeGetRequest(request400) + Then("We should get a 200") + response400.code should equal(200) + val json = response400.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + dynamicEntitiesGetJson.values should have size 1 + } + + // get myDynamic can return 2 records + { + val request400 = (v4_0_0_Request / "my" / "dynamic-entities").GET <@ (user1) + val response400 = makeGetRequest(request400) + Then("We should get a 200") + response400.code should equal(200) + val json = response400.body \ "dynamic_entities" + val dynamicEntitiesGetJson = json.asInstanceOf[JArray] + dynamicEntitiesGetJson.values should have size 2 + } + } + + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanDeleteBankLevelDynamicEntity.toString) + When("We make a request v4.0.0 with the Role " + CanDeleteSystemLevelDynamicEntity) + + // delete system level entity using bank level endpoint -- failed + val requestDelete400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / dynamicEntityId).DELETE <@ (user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 404") + responseDelete400.code should equal(404) + responseDelete400.body.toString contains (DynamicEntityNotFoundByDynamicEntityId) should be(true) + + { + // delete system level entity using system level endpoint -- success + val requestDelete400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@ (user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 200") + responseDelete400.code should equal(200) + } + + { + // delete bank level entity using system level endpoint -- failed + val requestDelete400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@ (user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 404") + responseDelete400.code should equal(404) + responseDelete400.body.toString contains (DynamicEntityNotFoundByDynamicEntityId) should be(true) + + { + // delete bank level entity using bank level endpoint -- success + val requestDelete400 = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@ (user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 200") + responseDelete400.code should equal(200) + } } - } - - feature("Add a DynamicEntity v4.0.4- and test all the Foobar endpoints and Foobar Roles") { - scenario("We will call the endpoint with the proper Role " + canCreateDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) - When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) - - val entityWithBankId = parse( - s""" - |{ - | "bankId": "${testBankId1.value}", - | "FooBar": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val notBankIdEntity = parse( - s""" - |{ - | "FooBar1": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) - val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) - - val responseWithBankId = makePostRequest(request, write(entityWithBankId)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - - val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - +// than prepare 2 dynamic entity for delete my entities: { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankId should equal(testBankId1.value) - - val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) - val responseGetFoobars = makeGetRequest(requestGetFoobars) - responseGetFoobars.code should equal(200) - val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s - dynamicBankIdGetFoobars should equal(testBankId1.value) - - val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) - val responseGetFoobar = makeGetRequest(requestGetFoobar) - responseGetFoobar.code should equal(200) - val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankIdGetFoobar should equal(testBankId1.value) - - val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) - val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) - responseUpdateFoobar.code should equal(200) - val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s - responseUpdateFoobarName should equal("James Brown123") - - val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - When("When other user call the foobar endpoints, it need some roles") - val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - } - - { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request / "FooBar1").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar1" \ "foo_bar1_id").asInstanceOf[JString].s - - val requestGetFoobars = (dynamicEntity_Request / "FooBar1").GET <@(user1) - val responseGetFoobars = makeGetRequest(requestGetFoobars) - responseGetFoobars.code should equal(200) - - val requestGetFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).GET <@(user1) - val responseGetFoobar = makeGetRequest(requestGetFoobar) - responseGetFoobar.code should equal(200) - - val requestUpdateFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId).PUT <@(user1) - val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) - responseUpdateFoobar.code should equal(200) - val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar1" \ "name").asInstanceOf[JString].s - responseUpdateFoobarName should equal("James Brown123") - - val requestDeleteFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - When("When other user call the foobar endpoints, it need some roles") - val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar1").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - } - - } - - scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteDynamicEntity.toString) - When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) - - val entityWithBankId = parse( - s""" - |{ - | "bankId": "${testBankId1.value}", - | "FooBar": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val notBankIdEntity = parse( - s""" - |{ - | "FooBar1": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) - val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) - - val responseWithBankId = makePostRequest(request, write(entityWithBankId)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - val dynamicEntityIdWithBankId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s - - val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - val dynamicEntityIdNoBankId = (responseNoBankId.body \ "dynamicEntityId").asInstanceOf[JString].s - - { - Then("user1 can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankId should equal(testBankId1.value) - - Then("we grant user3 can get FooBar role ") - Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser3.userId, "CanGetDynamicEntity_FooBar") - val requestCreateFoobarUser3 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user3) - val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) - responseCreateFoobarUser3.code should equal(200) - - - Then("user1 delete the FooBar data") - val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - - - Then("user1 delete the FooBar entity") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityIdWithBankId).DELETE <@(user1) - val response400 = makeDeleteRequest(request400) - Then("We should get a 204") - response400.code should equal(204) + When("We make a request v4.0.0") + val response = makePostRequest(request, write(rightEntity)) + response.code should equal(201) + val dynamicEntityId = (response.body \ "dynamicEntityId").asInstanceOf[JString].s + //2rd: we create the bank level dynamic entity + val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) + responseBankLevel.code should equal(201) + val dynamicEntityIdBankLevel = (responseBankLevel.body \ "dynamicEntityId").asInstanceOf[JString].s + {//can delete system level + val requestDelete400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityId).DELETE <@ (user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 200") + responseDelete400.code should equal(200) + } - When("When user2 call the foobar endpoints, it need some roles") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) - val responseWithBankId = makePostRequest(request, write(entityWithBankId)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - - val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(201) - - When("When user1 call the foobar endpoints, it need some roles") - val requestCreateFoobarUser1 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) - val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) - responseCreateFoobarUser1.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - - val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) - responseCreateFoobarUser3Again.code should equal(403) - + {//can delete bank level + val requestDelete400 = (v4_0_0_Request / "my" / "dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@ (user1) + val responseDelete400 = makeDeleteRequest(requestDelete400) + Then("We should get a 200") + responseDelete400.code should equal(200) + } } - - { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request / "FooBar1").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar1" \ "foo_bar1_id").asInstanceOf[JString].s - - Then("we grant user3 can get FooBar role ") - Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar1") - val requestCreateFoobarUser3 = (dynamicEntity_Request / "FooBar1").GET <@(user3) - val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) - responseCreateFoobarUser3.code should equal(200) - - Then("user1 delete the FooBar data") - val requestDeleteFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - Then("user1 delete the FooBar entity") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityIdNoBankId).DELETE <@(user1) - val response400 = makeDeleteRequest(request400) - response400.code should equal(204) - - When("When user2 call the foobar endpoints, it need some roles") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) - val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - - val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar1").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(201) - - When("When user1 call the foobar endpoints, it need some roles") - val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar1").POST <@(user1) - val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) - responseCreateFoobarUser1.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - - val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) - responseCreateFoobarUser3Again.code should equal(403) - } - - } + } } - - feature("Add a DynamicEntity v4.0.4- test personal records.") { - scenario("We will call the endpoint with the proper Role " + canCreateDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) - When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) - - val entityWithBankId = parse( - s""" - |{ - | "bankId": "${testBankId1.value}", - | "FooBar": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val notBankIdEntity = parse( - s""" - |{ - | "FooBar1": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) - val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) - - val responseWithBankId = makePostRequest(request, write(entityWithBankId)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - - val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - - { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankId should equal(testBankId1.value) - - val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) - val responseGetFoobars = makeGetRequest(requestGetFoobars) - responseGetFoobars.code should equal(200) - val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s - dynamicBankIdGetFoobars should equal(testBankId1.value) - - val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) - val responseGetFoobar = makeGetRequest(requestGetFoobar) - responseGetFoobar.code should equal(200) - val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankIdGetFoobar should equal(testBankId1.value) - - val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) - val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) - responseUpdateFoobar.code should equal(200) - val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s - responseUpdateFoobarName should equal("James Brown123") - - val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - When("When other user call the foobar endpoints, it need some roles") - val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - } - - { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request / "FooBar1").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar1" \ "foo_bar1_id").asInstanceOf[JString].s - - val requestGetFoobars = (dynamicEntity_Request / "FooBar1").GET <@(user1) - val responseGetFoobars = makeGetRequest(requestGetFoobars) - responseGetFoobars.code should equal(200) - - val requestGetFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).GET <@(user1) - val responseGetFoobar = makeGetRequest(requestGetFoobar) - responseGetFoobar.code should equal(200) - - val requestUpdateFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId).PUT <@(user1) - val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) - responseUpdateFoobar.code should equal(200) - val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar1" \ "name").asInstanceOf[JString].s - responseUpdateFoobarName should equal("James Brown123") - - val requestDeleteFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - When("When other user call the foobar endpoints, it need some roles") - val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar1").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - } - - } - - scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteDynamicEntity.toString) - When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user1) - - val entityWithBankId = parse( - s""" - |{ - | "bankId": "${testBankId1.value}", - | "FooBar": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val notBankIdEntity = parse( - s""" - |{ - | "FooBar1": { - | "description": "description of this entity, can be markdown text.", - | "required": [ - | "name" - | ], - | "properties": { - | "name": { - | "type": "string", - | "maxLength": 20, - | "minLength": 3, - | "example": "James Brown", - | "description":"description of **name** field, can be markdown text." - | }, - | "number": { - | "type": "integer", - | "example": 69876172 - | } - | } - | } - |} - |""".stripMargin) - - val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) - val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) - - val responseWithBankId = makePostRequest(request, write(entityWithBankId)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - val dynamicEntityIdWithBankId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s - - val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - val dynamicEntityIdNoBankId = (responseNoBankId.body \ "dynamicEntityId").asInstanceOf[JString].s - - { - Then("user1 can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankId should equal(testBankId1.value) - - Then("we grant user3 can get FooBar role ") - Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser3.userId, "CanGetDynamicEntity_FooBar") - val requestCreateFoobarUser3 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user3) - val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) - responseCreateFoobarUser3.code should equal(200) - - - Then("user1 delete the FooBar data") - val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - - - Then("user1 delete the FooBar entity") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityIdWithBankId).DELETE <@(user1) - val response400 = makeDeleteRequest(request400) - Then("We should get a 204") - response400.code should equal(204) - - - - - When("When user2 call the foobar endpoints, it need some roles") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) - val responseWithBankId = makePostRequest(request, write(entityWithBankId)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - - val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(201) - - When("When user1 call the foobar endpoints, it need some roles") - val requestCreateFoobarUser1 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) - val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) - responseCreateFoobarUser1.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - - val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) - responseCreateFoobarUser3Again.code should equal(403) - - } - - { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request / "FooBar1").POST <@(user1) - val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(201) - val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar1" \ "foo_bar1_id").asInstanceOf[JString].s - - Then("we grant user3 can get FooBar role ") - Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar1") - val requestCreateFoobarUser3 = (dynamicEntity_Request / "FooBar1").GET <@(user3) - val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) - responseCreateFoobarUser3.code should equal(200) - - Then("user1 delete the FooBar data") - val requestDeleteFoobar = (dynamicEntity_Request / "FooBar1" / dynamicEntityId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(204) - - Then("user1 delete the FooBar entity") - val request400 = (v4_0_0_Request / "management" / "dynamic-entities" / dynamicEntityIdNoBankId).DELETE <@(user1) - val response400 = makeDeleteRequest(request400) - response400.code should equal(204) - - When("When user2 call the foobar endpoints, it need some roles") - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@(user2) - val responseNoBankId = makePostRequest(request, write(notBankIdEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - - val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar1").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(201) - - When("When user1 call the foobar endpoints, it need some roles") - val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar1").POST <@(user1) - val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) - responseCreateFoobarUser1.code should equal(403) - And("error should be " + UserHasMissingRoles + CanGetDynamicEntities) - responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - - val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) - responseCreateFoobarUser3Again.code should equal(403) - } - - } - } +// feature("Test all the CRUD Foobar Records and Foobar Roles") { +// scenario("We will call the endpoint with the proper Role " + canCreateSystemLevelDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) +// When("We make a request v4.0.0") +// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) +// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) +// val requestBankLevel = (v4_0_0_Request / "management" /"banks" /testBankId1.value/ "dynamic-entities").POST <@(user1) +// +// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) +// val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) +// +// val systemLevelEntity = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// systemLevelEntity.code should equal(201) +// +// { +// Then("we can insert the new FooBar data - SystemLevel") +// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// +// val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) +// val responseGetFoobars = makeGetRequest(requestGetFoobars) +// responseGetFoobars.code should equal(200) +// +// val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) +// val responseGetFoobar = makeGetRequest(requestGetFoobar) +// responseGetFoobar.code should equal(200) +// +// val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) +// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) +// responseUpdateFoobar.code should equal(200) +// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s +// responseUpdateFoobarName should equal("James Brown123") +// +// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// When("When other user call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// } +// +// val bankLevelEntity = makePostRequest(requestBankLevel, write(rightEntity)) +// Then("We should get a 201") +// bankLevelEntity.code should equal(201) +// +// { +// Then("we can insert the new FooBar data - BankLevel") +// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankId should equal(testBankId1.value) +// +// val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) +// val responseGetFoobars = makeGetRequest(requestGetFoobars) +// responseGetFoobars.code should equal(200) +// val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankIdGetFoobars should equal(testBankId1.value) +// +// val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) +// val responseGetFoobar = makeGetRequest(requestGetFoobar) +// responseGetFoobar.code should equal(200) +// val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankIdGetFoobar should equal(testBankId1.value) +// +// val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) +// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) +// responseUpdateFoobar.code should equal(200) +// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s +// responseUpdateFoobarName should equal("James Brown123") +// +// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// When("When other user call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// } +// +// } +// +// scenario("when user1 create fooBar, and delete the foobar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) +// When("We make a request v4.0.0") +// val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) +// val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) +// +// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) +// +// val response= makePostRequest(requestSystemLevel, write(rightEntity)) +// Then("We should get a 201") +// response.code should equal(201) +// val dynamicEntityId = (response.body \ "dynamicEntityId").asInstanceOf[JString].s +// +// { +// Then("we can insert the new FooBar data - SystemLevel") +// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// +// { +// Then("user2 can not get the foo bar records") +// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "FooBar").GET <@(user2) +// val responseCreateFoobarUser2 = makeGetRequest(requestCreateFoobarUser2) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// } +// +// Then("we grant user3 can get FooBar role, user3 can get the foobar records. ") +// Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") +// val requestCreateFoobarUser3 = (dynamicEntity_Request / "FooBar").GET <@(user3) +// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) +// responseCreateFoobarUser3.code should equal(200) +// +// { +// Then(s"user1 try to delete the FooBar entity, it will show the error $DynamicEntityOperationNotAllowed") +// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) +// val response400 = makeDeleteRequest(request400) +// response400.code should equal(400) +// response400.body.extract[ErrorMessage].message contains (DynamicEntityOperationNotAllowed) should be (true) +// } +// +// Then("user1 delete the FooBar data first") +// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / fooBarId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// Then("user1 delete the FooBar entity") +// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) +// val response400 = makeDeleteRequest(request400) +// response400.code should equal(200) +// +// Then("user2 create foobar dynamic entity") +// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) +// val responseNoBankId = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// responseNoBankId.code should equal(201) +// +// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(201) +// +// When("When user1 call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) +// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) +// responseCreateFoobarUser1.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) +// responseCreateFoobarUser3Again.code should equal(403) +// } +// +// val responseBankLevel= makePostRequest(requestBankLevel, write(rightEntity)) +// Then("We should get a 201") +// responseBankLevel.code should equal(201) +// val dynamicEntityIdBankLevel = (responseBankLevel.body \ "dynamicEntityId").asInstanceOf[JString].s +// +// { +// Then("user1 can insert the new FooBar data - BankLevel") +// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankId should equal(testBankId1.value) +// +// Then("we grant user3 can get FooBar role ") +// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser3.userId, "CanGetDynamicEntityAtOneBank_FooBar") +// val requestCreateFoobarUser3 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user3) +// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) +// responseCreateFoobarUser3.code should equal(200) +// +// +// Then("user1 delete the FooBar data") +// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / fooBarId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// Then("user1 delete the FooBar entity") +// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@(user1) +// val response400 = makeDeleteRequest(request400) +// Then("We should get a 200") +// response400.code should equal(200) +// +// When("When user2 call the foobar endpoints, it need some roles") +// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) +// val responseWithBankId = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// responseWithBankId.code should equal(201) +// +// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(201) +// +// When("When user1 call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser1 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) +// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) +// responseCreateFoobarUser1.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) +// responseCreateFoobarUser3Again.code should equal(403) +// +// } +// +// } +// } +// +// feature("Test Bank Level Dynamic Entities and Records") { +// scenario("One System Foobar, one Bank Level Foobar, check the roles for two users", VersionOfApi) { +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, CanCreateBankLevelDynamicEntity.toString) +// When("We make a request v4.0.0") +// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) +// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) +// val requestBankLevel = (v4_0_0_Request / "management" /"banks" /testBankId1.value/ "dynamic-entities").POST <@(user2) +// +// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) +// val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) +// +// val systemLevelEntity = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// systemLevelEntity.code should equal(201) +// +// val bankLevelEntity = makePostRequest(requestBankLevel, write(rightEntity)) +// Then("We should get a 201") +// bankLevelEntity.code should equal(201) +// +// Then("user1 can insert the new FooBar data - SystemLevel") +// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// +// val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) +// val responseGetFoobars = makeGetRequest(requestGetFoobars) +// responseGetFoobars.code should equal(200) +// +// val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) +// val responseGetFoobar = makeGetRequest(requestGetFoobar) +// responseGetFoobar.code should equal(200) +// +// val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) +// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) +// responseUpdateFoobar.code should equal(200) +// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s +// responseUpdateFoobarName should equal("James Brown123") +// +// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// When("When other user call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val requestGetFoobarsUser2 = (dynamicEntity_Request / "FooBar").GET <@(user2) +// val responseGetFoobarsUser2 = makeGetRequest(requestGetFoobarsUser2) +// responseGetFoobarsUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseGetFoobarsUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val requestGetFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user2) +// val responseGetFoobarUser2 = makeGetRequest(requestGetFoobarUser2) +// responseGetFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseGetFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val requestUpdateFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user2) +// val responseUpdateFoobarUser2 = makePutRequest(requestUpdateFoobarUser2, write(foobarUpdateObject)) +// responseUpdateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseUpdateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val requestDeleteFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user2) +// val responseDeleteFoobarUser2 = makeDeleteRequest(requestDeleteFoobarUser2) +// responseDeleteFoobarUser2.code should equal(403) +// +// { +// Then("User2 can insert the new FooBar data - BankLevel") +// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankId should equal(testBankId1.value) +// +// val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user2) +// val responseGetFoobars = makeGetRequest(requestGetFoobars) +// responseGetFoobars.code should equal(200) +// val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankIdGetFoobars should equal(testBankId1.value) +// +// val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user2) +// val responseGetFoobar = makeGetRequest(requestGetFoobar) +// responseGetFoobar.code should equal(200) +// val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankIdGetFoobar should equal(testBankId1.value) +// +// val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user2) +// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) +// responseUpdateFoobar.code should equal(200) +// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s +// responseUpdateFoobarName should equal("James Brown123") +// +// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user2) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// When("When other user call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// } +// +// } +// +// } +// +// feature("Test personal CRUD Records.") { +// scenario("We will call the endpoint with the proper Role " + canCreateSystemLevelDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) +// When("We make a request v4.0.0") +// val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) +// val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) +// +// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) +// val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) +// +// val responseSystemLevel = makePostRequest(requestSystemLevel, write(rightEntity)) +// Then("We should get a 201") +// responseSystemLevel.code should equal(201) +// +// val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) +// Then("We should get a 201") +// responseBankLevel.code should equal(201) +// +// { +// Then("we can insert the new FooBar data - BankLevel") +// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankId should equal(testBankId1.value) +// +// val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) +// val responseGetFoobars = makeGetRequest(requestGetFoobars) +// responseGetFoobars.code should equal(200) +// val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankIdGetFoobars should equal(testBankId1.value) +// +// val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) +// val responseGetFoobar = makeGetRequest(requestGetFoobar) +// responseGetFoobar.code should equal(200) +// val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s +// dynamicBankIdGetFoobar should equal(testBankId1.value) +// +// val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) +// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) +// responseUpdateFoobar.code should equal(200) +// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s +// responseUpdateFoobarName should equal("James Brown123") +// +// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// When("When other user call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// } +// +// { +// Then("we can insert the new FooBar data - SystemLevel") +// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// +// val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) +// val responseGetFoobars = makeGetRequest(requestGetFoobars) +// responseGetFoobars.code should equal(200) +// +// val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) +// val responseGetFoobar = makeGetRequest(requestGetFoobar) +// responseGetFoobar.code should equal(200) +// +// val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) +// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) +// responseUpdateFoobar.code should equal(200) +// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s +// responseUpdateFoobarName should equal("James Brown123") +// +// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// When("When other user call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// } +// +// } +// +// scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) +// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) +// When("We make a request v4.0.0") +// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) +// +// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) +// +// val responseWithBankId = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// responseWithBankId.code should equal(201) +// val dynamicEntityId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s +// +// +// { +// Then("user1 can insert the new FooBar data - SystemLevel") +// val requestCreateFoobar = (dynamicEntity_Request/ "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// +// Then("we grant user3 can get FooBar role ") +// Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") +// val requestCreateFoobarUser3 = (dynamicEntity_Request/ "FooBar").GET <@(user3) +// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) +// responseCreateFoobarUser3.code should equal(200) +// +// +// Then("user1 delete the FooBar data") +// val requestDeleteFoobar = (dynamicEntity_Request/ "FooBar" / fooBarId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// +// +// Then("user1 delete the FooBar entity") +// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) +// val response400 = makeDeleteRequest(request400) +// Then("We should get a 200") +// response400.code should equal(200) +// +// +// +// +// When("When user2 call the foobar endpoints, it need some roles") +// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) +// val responseWithBankId = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// responseWithBankId.code should equal(201) +// +// val requestCreateFoobarUser2 = (dynamicEntity_Request/"FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(201) +// +// When("When user1 call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser1 = (dynamicEntity_Request/"FooBar").POST <@(user1) +// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) +// responseCreateFoobarUser1.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) +// responseCreateFoobarUser3Again.code should equal(403) +// +// } +// +// { +// Then("we can insert the new FooBar data - BankLevel") +// val requestCreateFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").POST <@(user1) +// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) +// responseCreateFoobar.code should equal(201) +// val FooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s +// +// Then("we grant user3 can get FooBar role ") +// Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") +// val requestCreateFoobarUser3 = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").GET <@(user3) +// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) +// responseCreateFoobarUser3.code should equal(200) +// +// Then("user1 delete the FooBar data") +// val requestDeleteFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar" / FooBarId ).DELETE <@(user1) +// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) +// responseDeleteFoobar.code should equal(200) +// +// Then("user1 delete the FooBar entity") +// val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities" / dynamicEntityId).DELETE <@(user1) +// val response400 = makeDeleteRequest(request400) +// response400.code should equal(200) +// +// When("When user2 call the foobar endpoints, it need some roles") +// val request = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user2) +// val responseNoBankId = makePostRequest(request, write(rightEntity)) +// Then("We should get a 201") +// responseNoBankId.code should equal(201) +// +// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) +// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) +// responseCreateFoobarUser2.code should equal(201) +// +// When("When user1 call the foobar endpoints, it need some roles") +// val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) +// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) +// responseCreateFoobarUser1.code should equal(403) +// And("error should be " + UserHasMissingRoles) +// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) +// +// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) +// responseCreateFoobarUser3Again.code should equal(403) +// } +// +// } +// } } diff --git a/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala index 3675d0f9f..6075f2b63 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala @@ -631,7 +631,7 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { // prepare one dynamic entity FooBar private def addDynamicEntity(): APIResponse = { - addEntitlement(canCreateDynamicEntity) + addEntitlement(canCreateSystemLevelDynamicEntity) val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@ user1 val fooBar = s""" diff --git a/obp-api/src/test/scala/code/api/v4_0_0/GetScannedApiVersionsTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/GetScannedApiVersionsTest.scala index d1920955f..cecb9d840 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/GetScannedApiVersionsTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/GetScannedApiVersionsTest.scala @@ -49,7 +49,7 @@ class GetScannedApiVersionsTest extends V400ServerSetup { feature("Get all scanned API versions should works") { scenario("We get all the scanned API versions", ApiEndpoint, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) When("We make a request v4.0.0") val request = (v4_0_0_Request / "api" / "versions").GET diff --git a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala index 5c5ca8ea0..9c563ad65 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala @@ -405,7 +405,7 @@ class JsonSchemaValidationTest extends V400ServerSetup { } // prepare one dynamic entity FooBar private def addDynamicEntity(): APIResponse = { - addEntitlement(canCreateDynamicEntity) + addEntitlement(canCreateSystemLevelDynamicEntity) val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@ user1 val fooBar = s""" From 4456d3b273455064ea36bbe156519676f697dc81 Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 01:02:12 +0100 Subject: [PATCH 04/11] test/added the tests for system/bank Foobar endpoints --- .../entity/APIMethodsDynamicEntity.scala | 2 +- .../entity/helper/DynamicEntityHelper.scala | 12 +- .../main/scala/code/api/util/NewStyle.scala | 4 +- .../scala/code/api/v4_0_0/APIMethods400.scala | 4 +- .../dynamicEntity/DynamicEntityProvider.scala | 4 +- .../MapppedDynamicEntityProvider.scala | 6 +- .../code/api/v4_0_0/DynamicEntityTest.scala | 1255 ++++++++++------- 7 files changed, 723 insertions(+), 564 deletions(-) diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala b/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala index b42fe5803..66d39c56b 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/APIMethodsDynamicEntity.scala @@ -353,7 +353,7 @@ trait APIMethodsDynamicEntity { ) deleteResult: JBool = unboxResult(box.asInstanceOf[Box[JBool]], entityName) } yield { - (deleteResult, HttpCode.`204`(Some(cc))) + (deleteResult, HttpCode.`200`(Some(cc))) } } } diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala index 1f886f7a8..fdec52e27 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala @@ -66,9 +66,9 @@ object DynamicEntityHelper { private val implementedInApiVersion = ApiVersion.v4_0_0 // (Some(BankId), EntityName, DynamicEntityInfo) - def definitionsMap: Map[(Option[String], String), DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None).map(it => ((it.bankId, it.entityName), DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId))).toMap + def definitionsMap: Map[(Option[String], String), DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None, true).map(it => ((it.bankId, it.entityName), DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId))).toMap - def dynamicEntityRoles: List[String] = NewStyle.function.getDynamicEntities(None).flatMap(dEntity => DynamicEntityInfo.roleNames(dEntity.entityName, dEntity.bankId)) + def dynamicEntityRoles: List[String] = NewStyle.function.getDynamicEntities(None, true).flatMap(dEntity => DynamicEntityInfo.roleNames(dEntity.entityName, dEntity.bankId)) def doc: ArrayBuffer[ResourceDoc] = { val docs = operationToResourceDoc.values.toList @@ -595,24 +595,24 @@ case class DynamicEntityInfo(definition: String, entityName: String, bankId: Opt object DynamicEntityInfo { def canCreateRole(entityName: String, bankId:Option[String]): ApiRole = if(bankId.isDefined) - getOrCreateDynamicApiRole("CanCreateDynamicEntityAtOneBank_" + entityName, true) + getOrCreateDynamicApiRole("CanCreateDynamicEntity_" + entityName, true) else getOrCreateDynamicApiRole("CanCreateDynamicEntity_System" + entityName, false) def canUpdateRole(entityName: String, bankId:Option[String]): ApiRole = if(bankId.isDefined) - getOrCreateDynamicApiRole("CanUpdateDynamicEntityAtOneBank_" + entityName, true) + getOrCreateDynamicApiRole("CanUpdateDynamicEntity_" + entityName, true) else getOrCreateDynamicApiRole("CanUpdateDynamicEntity_System" + entityName, false) def canGetRole(entityName: String, bankId:Option[String]): ApiRole = if(bankId.isDefined) - getOrCreateDynamicApiRole("CanGetDynamicEntityAtOneBank_" + entityName, true) + getOrCreateDynamicApiRole("CanGetDynamicEntity_" + entityName, true) else getOrCreateDynamicApiRole("CanGetDynamicEntity_System" + entityName, false) def canDeleteRole(entityName: String, bankId:Option[String]): ApiRole = if(bankId.isDefined) - getOrCreateDynamicApiRole("CanDeleteDynamicEntityAtOneBank_" + entityName, true) + getOrCreateDynamicApiRole("CanDeleteDynamicEntity_" + entityName, true) else getOrCreateDynamicApiRole("CanDeleteDynamicEntity_System" + entityName, false) 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 b6c2fcafa..d1dbc9d0c 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -3105,7 +3105,7 @@ object NewStyle extends MdcLoggable{ else APIUtil.getPropsValue(s"dynamicEntity.cache.ttl.seconds", "30").toInt } - def getDynamicEntities(bankId: Option[String]): List[DynamicEntityT] = { + def getDynamicEntities(bankId: Option[String], returnBothBankAndSystemLevel: Boolean): List[DynamicEntityT] = { import scala.concurrent.duration._ validateBankId(bankId, None) @@ -3113,7 +3113,7 @@ object NewStyle extends MdcLoggable{ var cacheKey = (randomUUID().toString, randomUUID().toString, randomUUID().toString) CacheKeyFromArguments.buildCacheKey { Caching.memoizeSyncWithProvider(Some(cacheKey.toString()))(dynamicEntityTTL second) { - DynamicEntityProvider.connectorMethodProvider.vend.getDynamicEntities(bankId) + DynamicEntityProvider.connectorMethodProvider.vend.getDynamicEntities(bankId, returnBothBankAndSystemLevel) } } } 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 ecf09c82b..19d31a558 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 @@ -2009,7 +2009,7 @@ trait APIMethods400 { case "management" :: "system-dynamic-entities" :: Nil JsonGet req => { cc => for { - dynamicEntities <- Future(NewStyle.function.getDynamicEntities(None)) + dynamicEntities <- Future(NewStyle.function.getDynamicEntities(None, false)) } yield { val listCommons: List[DynamicEntityCommons] = dynamicEntities val jObjects = listCommons.map(_.jValue) @@ -2045,7 +2045,7 @@ trait APIMethods400 { case "management" :: "banks" :: bankId :: "dynamic-entities" :: Nil JsonGet req => { cc => for { - dynamicEntities <- Future(NewStyle.function.getDynamicEntities(Some(bankId))) + dynamicEntities <- Future(NewStyle.function.getDynamicEntities(Some(bankId),false)) } yield { val listCommons: List[DynamicEntityCommons] = dynamicEntities val jObjects = listCommons.map(_.jValue) diff --git a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala index de4687174..59ef29ddf 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala @@ -288,7 +288,7 @@ object ReferenceType { ) def referenceTypeNames: List[String] = { - val dynamicRefs: List[String] = NewStyle.function.getDynamicEntities(None) + val dynamicRefs: List[String] = NewStyle.function.getDynamicEntities(None, true) .map(entity => s"reference:${entity.entityName}") val staticRefs: List[String] = staticRefTypeToValidateFunction.keys.toList @@ -545,7 +545,7 @@ trait DynamicEntityProvider { // so --> here can not use bankId as parameters: def getByEntityName(bankId: Option[String], entityName: String): Box[DynamicEntityT] - def getDynamicEntities(bankId: Option[String]): List[DynamicEntityT] + def getDynamicEntities(bankId: Option[String], returnBothBankAndSystemLevel: Boolean): List[DynamicEntityT] def getDynamicEntitiesByUserId(userId: String): List[DynamicEntity] diff --git a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala index 8886b38f5..b6f353abe 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala @@ -34,8 +34,10 @@ object MappedDynamicEntityProvider extends DynamicEntityProvider with CustomJson ) - override def getDynamicEntities(bankId: Option[String]): List[DynamicEntity] = { - if (bankId.isEmpty)//If Bank id is empty, we only return the system level entity + override def getDynamicEntities(bankId: Option[String], returnBothBankAndSystemLevel: Boolean): List[DynamicEntity] = { + if(returnBothBankAndSystemLevel) + DynamicEntity.findAll() + else if (bankId.isEmpty)//If Bank id is empty, we only return the system level entity DynamicEntity.findAll(NullRef(DynamicEntity.BankId)) else DynamicEntity.findAll(By(DynamicEntity.BankId, bankId.get)) diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala index 9dc66f0bd..f4cb06b25 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala @@ -1041,554 +1041,711 @@ class DynamicEntityTest extends V400ServerSetup { } } -// feature("Test all the CRUD Foobar Records and Foobar Roles") { -// scenario("We will call the endpoint with the proper Role " + canCreateSystemLevelDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) -// When("We make a request v4.0.0") -// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) -// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) -// val requestBankLevel = (v4_0_0_Request / "management" /"banks" /testBankId1.value/ "dynamic-entities").POST <@(user1) -// -// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) -// val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) -// -// val systemLevelEntity = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// systemLevelEntity.code should equal(201) -// -// { -// Then("we can insert the new FooBar data - SystemLevel") -// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// -// val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) -// val responseGetFoobars = makeGetRequest(requestGetFoobars) -// responseGetFoobars.code should equal(200) -// -// val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) -// val responseGetFoobar = makeGetRequest(requestGetFoobar) -// responseGetFoobar.code should equal(200) -// -// val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) -// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) -// responseUpdateFoobar.code should equal(200) -// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s -// responseUpdateFoobarName should equal("James Brown123") -// -// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// When("When other user call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// } -// -// val bankLevelEntity = makePostRequest(requestBankLevel, write(rightEntity)) -// Then("We should get a 201") -// bankLevelEntity.code should equal(201) -// -// { -// Then("we can insert the new FooBar data - BankLevel") -// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankId should equal(testBankId1.value) -// -// val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) -// val responseGetFoobars = makeGetRequest(requestGetFoobars) -// responseGetFoobars.code should equal(200) -// val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankIdGetFoobars should equal(testBankId1.value) -// -// val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) -// val responseGetFoobar = makeGetRequest(requestGetFoobar) -// responseGetFoobar.code should equal(200) -// val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankIdGetFoobar should equal(testBankId1.value) -// -// val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) -// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) -// responseUpdateFoobar.code should equal(200) -// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s -// responseUpdateFoobarName should equal("James Brown123") -// -// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// When("When other user call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// } -// -// } -// -// scenario("when user1 create fooBar, and delete the foobar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) -// When("We make a request v4.0.0") -// val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) -// val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) -// -// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) -// -// val response= makePostRequest(requestSystemLevel, write(rightEntity)) -// Then("We should get a 201") -// response.code should equal(201) -// val dynamicEntityId = (response.body \ "dynamicEntityId").asInstanceOf[JString].s -// -// { -// Then("we can insert the new FooBar data - SystemLevel") -// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// -// { -// Then("user2 can not get the foo bar records") -// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "FooBar").GET <@(user2) -// val responseCreateFoobarUser2 = makeGetRequest(requestCreateFoobarUser2) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// } -// -// Then("we grant user3 can get FooBar role, user3 can get the foobar records. ") -// Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") -// val requestCreateFoobarUser3 = (dynamicEntity_Request / "FooBar").GET <@(user3) -// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) -// responseCreateFoobarUser3.code should equal(200) -// -// { -// Then(s"user1 try to delete the FooBar entity, it will show the error $DynamicEntityOperationNotAllowed") -// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) -// val response400 = makeDeleteRequest(request400) -// response400.code should equal(400) -// response400.body.extract[ErrorMessage].message contains (DynamicEntityOperationNotAllowed) should be (true) -// } -// -// Then("user1 delete the FooBar data first") -// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / fooBarId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// Then("user1 delete the FooBar entity") -// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) -// val response400 = makeDeleteRequest(request400) -// response400.code should equal(200) -// -// Then("user2 create foobar dynamic entity") -// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) -// val responseNoBankId = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// responseNoBankId.code should equal(201) -// -// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(201) -// -// When("When user1 call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) -// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) -// responseCreateFoobarUser1.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) -// responseCreateFoobarUser3Again.code should equal(403) -// } -// -// val responseBankLevel= makePostRequest(requestBankLevel, write(rightEntity)) -// Then("We should get a 201") -// responseBankLevel.code should equal(201) -// val dynamicEntityIdBankLevel = (responseBankLevel.body \ "dynamicEntityId").asInstanceOf[JString].s -// -// { -// Then("user1 can insert the new FooBar data - BankLevel") -// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankId should equal(testBankId1.value) -// -// Then("we grant user3 can get FooBar role ") -// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser3.userId, "CanGetDynamicEntityAtOneBank_FooBar") -// val requestCreateFoobarUser3 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user3) -// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) -// responseCreateFoobarUser3.code should equal(200) -// -// -// Then("user1 delete the FooBar data") -// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / fooBarId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// Then("user1 delete the FooBar entity") -// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@(user1) -// val response400 = makeDeleteRequest(request400) -// Then("We should get a 200") -// response400.code should equal(200) -// -// When("When user2 call the foobar endpoints, it need some roles") -// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) -// val responseWithBankId = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// responseWithBankId.code should equal(201) -// -// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(201) -// -// When("When user1 call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser1 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) -// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) -// responseCreateFoobarUser1.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) -// responseCreateFoobarUser3Again.code should equal(403) -// -// } -// -// } -// } -// -// feature("Test Bank Level Dynamic Entities and Records") { -// scenario("One System Foobar, one Bank Level Foobar, check the roles for two users", VersionOfApi) { -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, CanCreateBankLevelDynamicEntity.toString) -// When("We make a request v4.0.0") -// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) -// Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) -// val requestBankLevel = (v4_0_0_Request / "management" /"banks" /testBankId1.value/ "dynamic-entities").POST <@(user2) -// -// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) -// val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) -// -// val systemLevelEntity = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// systemLevelEntity.code should equal(201) -// -// val bankLevelEntity = makePostRequest(requestBankLevel, write(rightEntity)) -// Then("We should get a 201") -// bankLevelEntity.code should equal(201) -// -// Then("user1 can insert the new FooBar data - SystemLevel") -// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// -// val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) -// val responseGetFoobars = makeGetRequest(requestGetFoobars) -// responseGetFoobars.code should equal(200) -// -// val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) -// val responseGetFoobar = makeGetRequest(requestGetFoobar) -// responseGetFoobar.code should equal(200) -// -// val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) -// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) -// responseUpdateFoobar.code should equal(200) -// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s -// responseUpdateFoobarName should equal("James Brown123") -// -// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// When("When other user call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val requestGetFoobarsUser2 = (dynamicEntity_Request / "FooBar").GET <@(user2) -// val responseGetFoobarsUser2 = makeGetRequest(requestGetFoobarsUser2) -// responseGetFoobarsUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseGetFoobarsUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val requestGetFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user2) -// val responseGetFoobarUser2 = makeGetRequest(requestGetFoobarUser2) -// responseGetFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseGetFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val requestUpdateFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user2) -// val responseUpdateFoobarUser2 = makePutRequest(requestUpdateFoobarUser2, write(foobarUpdateObject)) -// responseUpdateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseUpdateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val requestDeleteFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user2) -// val responseDeleteFoobarUser2 = makeDeleteRequest(requestDeleteFoobarUser2) -// responseDeleteFoobarUser2.code should equal(403) -// -// { -// Then("User2 can insert the new FooBar data - BankLevel") -// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankId should equal(testBankId1.value) -// -// val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user2) -// val responseGetFoobars = makeGetRequest(requestGetFoobars) -// responseGetFoobars.code should equal(200) -// val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankIdGetFoobars should equal(testBankId1.value) -// -// val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user2) -// val responseGetFoobar = makeGetRequest(requestGetFoobar) -// responseGetFoobar.code should equal(200) -// val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankIdGetFoobar should equal(testBankId1.value) -// -// val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user2) -// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) -// responseUpdateFoobar.code should equal(200) -// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s -// responseUpdateFoobarName should equal("James Brown123") -// -// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user2) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// When("When other user call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// } -// -// } -// -// } -// -// feature("Test personal CRUD Records.") { -// scenario("We will call the endpoint with the proper Role " + canCreateSystemLevelDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) -// When("We make a request v4.0.0") -// val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) -// val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) -// -// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) -// val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) -// -// val responseSystemLevel = makePostRequest(requestSystemLevel, write(rightEntity)) -// Then("We should get a 201") -// responseSystemLevel.code should equal(201) -// -// val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) -// Then("We should get a 201") -// responseBankLevel.code should equal(201) -// -// { -// Then("we can insert the new FooBar data - BankLevel") -// val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankId should equal(testBankId1.value) -// -// val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) -// val responseGetFoobars = makeGetRequest(requestGetFoobars) -// responseGetFoobars.code should equal(200) -// val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankIdGetFoobars should equal(testBankId1.value) -// -// val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) -// val responseGetFoobar = makeGetRequest(requestGetFoobar) -// responseGetFoobar.code should equal(200) -// val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s -// dynamicBankIdGetFoobar should equal(testBankId1.value) -// -// val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) -// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) -// responseUpdateFoobar.code should equal(200) -// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s -// responseUpdateFoobarName should equal("James Brown123") -// -// val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// When("When other user call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// } -// -// { -// Then("we can insert the new FooBar data - SystemLevel") -// val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// -// val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) -// val responseGetFoobars = makeGetRequest(requestGetFoobars) -// responseGetFoobars.code should equal(200) -// -// val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) -// val responseGetFoobar = makeGetRequest(requestGetFoobar) -// responseGetFoobar.code should equal(200) -// -// val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) -// val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) -// responseUpdateFoobar.code should equal(200) -// val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s -// responseUpdateFoobarName should equal("James Brown123") -// -// val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// When("When other user call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// } -// -// } -// -// scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) -// Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) -// When("We make a request v4.0.0") -// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) -// -// val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) -// -// val responseWithBankId = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// responseWithBankId.code should equal(201) -// val dynamicEntityId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s -// -// -// { -// Then("user1 can insert the new FooBar data - SystemLevel") -// val requestCreateFoobar = (dynamicEntity_Request/ "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// -// Then("we grant user3 can get FooBar role ") -// Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") -// val requestCreateFoobarUser3 = (dynamicEntity_Request/ "FooBar").GET <@(user3) -// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) -// responseCreateFoobarUser3.code should equal(200) -// -// -// Then("user1 delete the FooBar data") -// val requestDeleteFoobar = (dynamicEntity_Request/ "FooBar" / fooBarId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// -// -// Then("user1 delete the FooBar entity") -// val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) -// val response400 = makeDeleteRequest(request400) -// Then("We should get a 200") -// response400.code should equal(200) -// -// -// -// -// When("When user2 call the foobar endpoints, it need some roles") -// val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) -// val responseWithBankId = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// responseWithBankId.code should equal(201) -// -// val requestCreateFoobarUser2 = (dynamicEntity_Request/"FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(201) -// -// When("When user1 call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser1 = (dynamicEntity_Request/"FooBar").POST <@(user1) -// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) -// responseCreateFoobarUser1.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) -// responseCreateFoobarUser3Again.code should equal(403) -// -// } -// -// { -// Then("we can insert the new FooBar data - BankLevel") -// val requestCreateFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").POST <@(user1) -// val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) -// responseCreateFoobar.code should equal(201) -// val FooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s -// -// Then("we grant user3 can get FooBar role ") -// Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") -// val requestCreateFoobarUser3 = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").GET <@(user3) -// val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) -// responseCreateFoobarUser3.code should equal(200) -// -// Then("user1 delete the FooBar data") -// val requestDeleteFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar" / FooBarId ).DELETE <@(user1) -// val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) -// responseDeleteFoobar.code should equal(200) -// -// Then("user1 delete the FooBar entity") -// val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities" / dynamicEntityId).DELETE <@(user1) -// val response400 = makeDeleteRequest(request400) -// response400.code should equal(200) -// -// When("When user2 call the foobar endpoints, it need some roles") -// val request = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user2) -// val responseNoBankId = makePostRequest(request, write(rightEntity)) -// Then("We should get a 201") -// responseNoBankId.code should equal(201) -// -// val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) -// val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) -// responseCreateFoobarUser2.code should equal(201) -// -// When("When user1 call the foobar endpoints, it need some roles") -// val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) -// val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) -// responseCreateFoobarUser1.code should equal(403) -// And("error should be " + UserHasMissingRoles) -// responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) -// -// val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) -// responseCreateFoobarUser3Again.code should equal(403) -// } -// -// } -// } + feature("Test CRUD Foobar Records and Roles (both Bank and System levels) ") { + scenario("We create the system and bank level entities, and check the Foobar roles ", ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + val requestBankLevel = (v4_0_0_Request / "management" /"banks" /testBankId1.value/ "dynamic-entities").POST <@(user1) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) + + val systemLevelEntity = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + systemLevelEntity.code should equal(201) + + { + Then("we can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + { + When("user 2 call the foobar endpoints, it need the roles") + Then("we can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseCreateFoobar.body.extract[ErrorMessage].message contains ("CanCreateDynamicEntity_SystemFooBar") should be (true) + + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseGetFoobars.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseGetFoobars.body.extract[ErrorMessage].message contains ("CanGetDynamicEntity_SystemFooBar") should be (true) + + val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user2) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseGetFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseGetFoobar.body.extract[ErrorMessage].message contains ("CanGetDynamicEntity_SystemFooBar") should be (true) + + val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user2) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseUpdateFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseUpdateFoobar.body.extract[ErrorMessage].message contains ("CanUpdateDynamicEntity_SystemFooBar") should be (true) + + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user2) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseDeleteFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseDeleteFoobar.body.extract[ErrorMessage].message contains ("CanDeleteDynamicEntity_SystemFooBar") should be (true) + } + + { + Then("we grant user2 the missing roles and CRUD again - SystemLevel") + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanCreateDynamicEntity_SystemFooBar") + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanUpdateDynamicEntity_SystemFooBar") + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanGetDynamicEntity_SystemFooBar") + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanDeleteDynamicEntity_SystemFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user2) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user2) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user2) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + } + } + + val bankLevelEntity = makePostRequest(requestBankLevel, write(rightEntity)) + Then("We should get a 201") + bankLevelEntity.code should equal(201) + + { + Then("we can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobars should equal(testBankId1.value) + + val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobar should equal(testBankId1.value) + + val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + { + When("user 2 call the foobar endpoints, it need the roles") + Then("we can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request / "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseCreateFoobar.body.extract[ErrorMessage].message contains ("CanCreateDynamicEntity_FooBar") should be (true) + + val requestGetFoobars = (dynamicEntity_Request /"banks"/ testBankId1.value / "FooBar").GET <@(user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseGetFoobars.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseGetFoobars.body.extract[ErrorMessage].message contains ("CanGetDynamicEntity_FooBar") should be (true) + + + val requestGetFoobar = (dynamicEntity_Request / "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user2) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseGetFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseGetFoobar.body.extract[ErrorMessage].message contains ("CanGetDynamicEntity_FooBar") should be (true) + + val requestUpdateFoobar = (dynamicEntity_Request / "banks"/ testBankId1.value /"FooBar" / dynamicEntityId).PUT <@(user2) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseUpdateFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseUpdateFoobar.body.extract[ErrorMessage].message contains ("CanUpdateDynamicEntity_FooBar") should be (true) + + val requestDeleteFoobar = (dynamicEntity_Request / "banks"/ testBankId1.value /"FooBar" / dynamicEntityId ).DELETE <@(user2) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseDeleteFoobar.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + responseDeleteFoobar.body.extract[ErrorMessage].message contains ("CanDeleteDynamicEntity_FooBar") should be (true) + } + + { + Then("we grant user2 roles and try CRUD again") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, "CanCreateDynamicEntity_FooBar") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, "CanGetDynamicEntity_FooBar") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, "CanUpdateDynamicEntity_FooBar") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, "CanDeleteDynamicEntity_FooBar") + + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobars should equal(testBankId1.value) + + val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user2) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobar should equal(testBankId1.value) + + val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user2) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + } + } + + } + + scenario("when user1 create fooBar, and delete the foobar entity, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, CanCreateBankLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanDeleteBankLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, CanDeleteBankLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + + val response= makePostRequest(requestSystemLevel, write(rightEntity)) + Then("We should get a 201") + response.code should equal(201) + val dynamicEntityId = (response.body \ "dynamicEntityId").asInstanceOf[JString].s + + { + Then("we can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + { + Then("user2 can not get the foo bar records") + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "FooBar").GET <@(user2) + val responseCreateFoobarUser2 = makeGetRequest(requestCreateFoobarUser2) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + + Then("we grant user2 can get FooBar role, user2 can get the foobar records. ") + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanGetDynamicEntity_SystemFooBar") + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").GET <@(user2) + val responseCreateFoobarUser2 = makeGetRequest(requestCreateFoobarUser2) + responseCreateFoobarUser2.code should equal(200) + + { + Then(s"user1 try to delete the FooBar entity, it will show the error $DynamicEntityOperationNotAllowed") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + response400.code should equal(400) + response400.body.extract[ErrorMessage].message contains (DynamicEntityOperationNotAllowed) should be (true) + } + + Then("user1 delete the FooBar data first") + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / fooBarId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + Then("user1 delete the FooBar entity") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + response400.code should equal(200) + + Then("user2 create foobar dynamic entity") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) + val responseNoBankId = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + responseNoBankId.code should equal(201) + + { + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + } + + When("When user1 call the foobar endpoints, it need some roles") + val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + + Then("we test the bank level") + val responseBankLevel= makePostRequest(requestBankLevel, write(rightEntity)) + Then("We should get a 201") + responseBankLevel.code should equal(201) + val dynamicEntityIdBankLevel = (responseBankLevel.body \ "dynamicEntityId").asInstanceOf[JString].s + + { + Then("user1 can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + { + Then("user2 need some roles") + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user2) + val responseCreateFoobarUser2 = makeGetRequest(requestCreateFoobarUser2) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + { + Then("we grant user2 can get FooBar role ") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser3.userId, "CanGetDynamicEntity_FooBar") + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user3) + val responseCreateFoobarUser2 = makeGetRequest(requestCreateFoobarUser2) + responseCreateFoobarUser2.code should equal(200) + } + + Then("user1 delete the FooBar data") + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / fooBarId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + Then("user1 delete the FooBar entity") + val request400 = (v4_0_0_Request / "management" / "banks"/ testBankId1.value / "dynamic-entities" / dynamicEntityIdBankLevel).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + Then("We should get a 200") + response400.code should equal(200) + + Then("When user2 call the foobar endpoints, it need some roles") + val request = (v4_0_0_Request / "management"/"banks"/ testBankId1.value /"dynamic-entities").POST <@(user2) + val responseWithBankId = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + responseWithBankId.code should equal(201) + + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + + When("When user1 call the foobar endpoints, it need some roles") + val requestCreateFoobarUser1 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + } + + } + + scenario("User1 create System Foobar, user2 create bank Foobar, test the roles..", VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, CanCreateBankLevelDynamicEntity.toString) + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) + + + When("user1 create system Foobar") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + val systemLevelEntity = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + systemLevelEntity.code should equal(201) + + Then("user1 create bank Foobar") + val requestBankLevel = (v4_0_0_Request / "management" /"banks" /testBankId1.value/ "dynamic-entities").POST <@(user2) + val bankLevelEntity = makePostRequest(requestBankLevel, write(rightEntity)) + Then("We should get a 201") + bankLevelEntity.code should equal(201) + + + Then("user1 can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + When("When user2 user call the system foobar endpoints, it need some roles") + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val requestGetFoobarsUser2 = (dynamicEntity_Request / "FooBar").GET <@(user2) + val responseGetFoobarsUser2 = makeGetRequest(requestGetFoobarsUser2) + responseGetFoobarsUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseGetFoobarsUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val requestGetFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user2) + val responseGetFoobarUser2 = makeGetRequest(requestGetFoobarUser2) + responseGetFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseGetFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val requestUpdateFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user2) + val responseUpdateFoobarUser2 = makePutRequest(requestUpdateFoobarUser2, write(foobarUpdateObject)) + responseUpdateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseUpdateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val requestDeleteFoobarUser2 = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user2) + val responseDeleteFoobarUser2 = makeDeleteRequest(requestDeleteFoobarUser2) + responseDeleteFoobarUser2.code should equal(403) + + { + Then("User2 can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobars should equal(testBankId1.value) + + val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user2) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobar should equal(testBankId1.value) + + val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user2) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user2) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + { + When("User1 call the foobar endpoints, it need some roles") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(403) + + val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(403) + + val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(403) + + val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(403) + + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(403) + } + } + + } + + } + + feature("Test personal CRUD Records.") { + scenario("We will call the endpoint with the proper Role " + canCreateSystemLevelDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) + + val responseSystemLevel = makePostRequest(requestSystemLevel, write(rightEntity)) + Then("We should get a 201") + responseSystemLevel.code should equal(201) + + val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) + Then("We should get a 201") + responseBankLevel.code should equal(201) + + { + Then("we can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankId should equal(testBankId1.value) + + val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobars should equal(testBankId1.value) + + val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s + dynamicBankIdGetFoobar should equal(testBankId1.value) + + val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + When("When other user call the foobar endpoints, it need some roles") + val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + + { + Then("we can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + When("When other user call the foobar endpoints, it need some roles") + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + } + + } + + scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + + val responseWithBankId = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + responseWithBankId.code should equal(201) + val dynamicEntityId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s + + + { + Then("user1 can insert the new FooBar data - SystemLevel") + val requestCreateFoobar = (dynamicEntity_Request/ "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + Then("we grant user3 can get FooBar role ") + Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") + val requestCreateFoobarUser3 = (dynamicEntity_Request/ "FooBar").GET <@(user3) + val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) + responseCreateFoobarUser3.code should equal(200) + + + Then("user1 delete the FooBar data") + val requestDeleteFoobar = (dynamicEntity_Request/ "FooBar" / fooBarId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + + + Then("user1 delete the FooBar entity") + val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + Then("We should get a 200") + response400.code should equal(200) + + + + + When("When user2 call the foobar endpoints, it need some roles") + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) + val responseWithBankId = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + responseWithBankId.code should equal(201) + + val requestCreateFoobarUser2 = (dynamicEntity_Request/"FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + + When("When user1 call the foobar endpoints, it need some roles") + val requestCreateFoobarUser1 = (dynamicEntity_Request/"FooBar").POST <@(user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) + responseCreateFoobarUser3Again.code should equal(403) + + } + + { + Then("we can insert the new FooBar data - BankLevel") + val requestCreateFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").POST <@(user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val FooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + Then("we grant user3 can get FooBar role ") + Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") + val requestCreateFoobarUser3 = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").GET <@(user3) + val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) + responseCreateFoobarUser3.code should equal(200) + + Then("user1 delete the FooBar data") + val requestDeleteFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar" / FooBarId ).DELETE <@(user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + + Then("user1 delete the FooBar entity") + val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities" / dynamicEntityId).DELETE <@(user1) + val response400 = makeDeleteRequest(request400) + response400.code should equal(200) + + When("When user2 call the foobar endpoints, it need some roles") + val request = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user2) + val responseNoBankId = makePostRequest(request, write(rightEntity)) + Then("We should get a 201") + responseNoBankId.code should equal(201) + + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + + When("When user1 call the foobar endpoints, it need some roles") + val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(403) + And("error should be " + UserHasMissingRoles) + responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + + val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) + responseCreateFoobarUser3Again.code should equal(403) + } + + } + } } From 197c6dac06ae74e9bad8e495415a7436f89e0525 Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 13:51:05 +0100 Subject: [PATCH 05/11] test/added the tests for system/bank myFoobar endpoints --- .../entity/helper/DynamicEntityHelper.scala | 19 +- .../code/api/v4_0_0/DynamicEntityTest.scala | 396 ++++++++++++------ 2 files changed, 274 insertions(+), 141 deletions(-) diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala index fdec52e27..37bd81805 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala @@ -20,6 +20,16 @@ import scala.collection.mutable.ArrayBuffer object EntityName { // unapply result structure: (BankId, entityName, id, isPersonalEntity) def unapply(url: List[String]): Option[(Option[String], String, String, Boolean)] = url match { + + //eg: /my/FooBar21 + case "my" :: entityName :: Nil => + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + .map(_ => (None, entityName, "", true)) + //eg: /my/FooBar21/FOO_BAR21_ID + case "my" :: entityName :: id :: Nil => + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + .map(_ => (None, entityName, id, true)) + //eg: /FooBar21 case entityName :: Nil => DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) @@ -30,15 +40,6 @@ object EntityName { .map(_ => (None, entityName, id, false)) - //eg: /my/FooBar21 - case "my" :: entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) - .map(_ => (None, entityName, "", true)) - //eg: /my/FooBar21/FOO_BAR21_ID - case "my" :: entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) - .map(_ => (None, entityName, id, true)) - //eg: /Banks/BANK_ID/my/FooBar21 case "banks" :: bankId :: "my" :: entityName :: Nil => DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala index f4cb06b25..c8d35956b 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala @@ -159,6 +159,11 @@ class DynamicEntityTest extends V400ServerSetup { | } |} |""".stripMargin) + + val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) + + val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) + feature("CRUD System Level Dynamic Entity endpoints") { @@ -1542,11 +1547,14 @@ class DynamicEntityTest extends V400ServerSetup { } feature("Test personal CRUD Records.") { - scenario("We will call the endpoint with the proper Role " + canCreateSystemLevelDynamicEntity , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { + scenario("User1 Create System Foobar, user1 and user2 both CRUD their own myFooBars. ", ApiEndpoint1, VersionOfApi) { Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanGetSystemLevelDynamicEntities.toString) + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanCreateDynamicEntity_SystemFooBar") + Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, "CanGetDynamicEntity_SystemFooBar") When("We make a request v4.0.0") - val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) - val requestBankLevel = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user1) + val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ (user1) val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) val foobarUpdateObject = parse("""{ "name":"James Brown123", "number":698761728}""".stripMargin) @@ -1555,197 +1563,321 @@ class DynamicEntityTest extends V400ServerSetup { Then("We should get a 201") responseSystemLevel.code should equal(201) - val responseBankLevel = makePostRequest(requestBankLevel, write(rightEntity)) - Then("We should get a 201") - responseBankLevel.code should equal(201) + Then("User1 and User2 both create system FooBar, and User2 can get 2 foobars") + + val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@ (user1) + val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) + responseCreateFoobarUser1.code should equal(201) + + val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@ (user2) + val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) + responseCreateFoobarUser2.code should equal(201) + + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@ (user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(2) { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user1) + Then("user1 CURD the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "my" / "FooBar").POST <@ (user1) val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) responseCreateFoobar.code should equal(201) val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - val dynamicBankId = (responseCreateFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankId should equal(testBankId1.value) - val requestGetFoobars = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").GET <@(user1) + val requestGetFoobars = (dynamicEntity_Request / "my" / "FooBar").GET <@ (user1) val responseGetFoobars = makeGetRequest(requestGetFoobars) responseGetFoobars.code should equal(200) - val dynamicBankIdGetFoobars = (responseGetFoobars.body \ "bank_id").asInstanceOf[JString].s - dynamicBankIdGetFoobars should equal(testBankId1.value) - val requestGetFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).GET <@(user1) + val requestGetFoobar = (dynamicEntity_Request / "my" / "FooBar" / dynamicEntityId).GET <@ (user1) val responseGetFoobar = makeGetRequest(requestGetFoobar) responseGetFoobar.code should equal(200) - val dynamicBankIdGetFoobar = (responseGetFoobar.body \ "bank_id").asInstanceOf[JString].s - dynamicBankIdGetFoobar should equal(testBankId1.value) - val requestUpdateFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId).PUT <@(user1) + val requestUpdateFoobar = (dynamicEntity_Request / "my" / "FooBar" / dynamicEntityId).PUT <@ (user1) val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) responseUpdateFoobar.code should equal(200) val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s responseUpdateFoobarName should equal("James Brown123") - val requestDeleteFoobar = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val requestDeleteFoobar = (dynamicEntity_Request / "my" / "FooBar" / dynamicEntityId).DELETE <@ (user1) val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) responseDeleteFoobar.code should equal(200) - - When("When other user call the foobar endpoints, it need some roles") - val requestCreateFoobarUser2 = (dynamicEntity_Request/ "banks"/ testBankId1.value / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(403) - And("error should be " + UserHasMissingRoles) - responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) } { - Then("we can insert the new FooBar data - SystemLevel") - val requestCreateFoobar = (dynamicEntity_Request / "FooBar").POST <@(user1) + Then("user2 CURD the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "my" / "FooBar").POST <@ (user2) val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) responseCreateFoobar.code should equal(201) val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@(user1) + val requestGetFoobars = (dynamicEntity_Request / "my" / "FooBar").GET <@ (user2) val responseGetFoobars = makeGetRequest(requestGetFoobars) responseGetFoobars.code should equal(200) - val requestGetFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).GET <@(user1) + val requestGetFoobar = (dynamicEntity_Request / "my" / "FooBar" / dynamicEntityId).GET <@ (user2) val responseGetFoobar = makeGetRequest(requestGetFoobar) responseGetFoobar.code should equal(200) - val requestUpdateFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId).PUT <@(user1) + val requestUpdateFoobar = (dynamicEntity_Request / "my" / "FooBar" / dynamicEntityId).PUT <@ (user2) val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) responseUpdateFoobar.code should equal(200) val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s responseUpdateFoobarName should equal("James Brown123") - val requestDeleteFoobar = (dynamicEntity_Request / "FooBar" / dynamicEntityId ).DELETE <@(user1) + val requestDeleteFoobar = (dynamicEntity_Request / "my" / "FooBar" / dynamicEntityId).DELETE <@ (user2) val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) responseDeleteFoobar.code should equal(200) + } - When("When other user call the foobar endpoints, it need some roles") - val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(403) - And("error should be " + UserHasMissingRoles) - responseCreateFoobarUser2.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) + { + Then("user1 Create the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "my" / "FooBar").POST <@ (user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + } + + { + Then("user2 Create the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "my" / "FooBar").POST <@ (user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + } + + { + Then("User1 get my foobar, only return his own records, only one") + val requestGetFoobars = (dynamicEntity_Request / "my" / "FooBar").GET <@ (user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(1) + } + { + Then("User2 get my foobar, only return his own records, only one") + val requestGetFoobars = (dynamicEntity_Request / "my" / "FooBar").GET <@ (user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(1) + } + + { + Then("User1 get system foobar, return 2 system records") + val requestGetFoobars = (dynamicEntity_Request / "FooBar").GET <@ (user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(2) } } - scenario("when user1 create fooBar, and delete the foorbar, user2 create foobar again. user1 should not have the role for it " , ApiEndpoint1, ApiEndpoint5, ApiEndpoint6, ApiEndpoint8, VersionOfApi) { - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanCreateSystemLevelDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanDeleteSystemLevelDynamicEntity.toString) - Entitlement.entitlement.vend.addEntitlement("", resourceUser2.userId, CanDeleteSystemLevelDynamicEntity.toString) + scenario("User1 Create Bank Foobar, user1 and user2 both CRUD their own myFooBars.", ApiEndpoint8, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanGetBankLevelDynamicEntities.toString) + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, "CanCreateDynamicEntity_FooBar") + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser2.userId, "CanGetDynamicEntity_FooBar") When("We make a request v4.0.0") - val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user1) + val requestSystemLevel = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST <@ (user1) - val foobarObject = parse("""{ "name":"James Brown", "number":698761728}""".stripMargin) - - val responseWithBankId = makePostRequest(request, write(rightEntity)) + val responseSystemLevel = makePostRequest(requestSystemLevel, write(rightEntity)) Then("We should get a 201") - responseWithBankId.code should equal(201) - val dynamicEntityId = (responseWithBankId.body \ "dynamicEntityId").asInstanceOf[JString].s + responseSystemLevel.code should equal(201) + Then("User1 and User2 both create bank FooBar, and User2 can get 2 foobars") { - Then("user1 can insert the new FooBar data - SystemLevel") - val requestCreateFoobar = (dynamicEntity_Request/ "FooBar").POST <@(user1) + val requestCreateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "FooBar").POST <@ (user1) val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) responseCreateFoobar.code should equal(201) - val fooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - - Then("we grant user3 can get FooBar role ") - Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") - val requestCreateFoobarUser3 = (dynamicEntity_Request/ "FooBar").GET <@(user3) - val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) - responseCreateFoobarUser3.code should equal(200) - - - Then("user1 delete the FooBar data") - val requestDeleteFoobar = (dynamicEntity_Request/ "FooBar" / fooBarId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(200) - - - - Then("user1 delete the FooBar entity") - val request400 = (v4_0_0_Request / "management" / "system-dynamic-entities" / dynamicEntityId).DELETE <@(user1) - val response400 = makeDeleteRequest(request400) - Then("We should get a 200") - response400.code should equal(200) - - - - - When("When user2 call the foobar endpoints, it need some roles") - val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@(user2) - val responseWithBankId = makePostRequest(request, write(rightEntity)) - Then("We should get a 201") - responseWithBankId.code should equal(201) - - val requestCreateFoobarUser2 = (dynamicEntity_Request/"FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(201) - - When("When user1 call the foobar endpoints, it need some roles") - val requestCreateFoobarUser1 = (dynamicEntity_Request/"FooBar").POST <@(user1) - val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) - responseCreateFoobarUser1.code should equal(403) - And("error should be " + UserHasMissingRoles) - responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - - val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) - responseCreateFoobarUser3Again.code should equal(403) - } { - Then("we can insert the new FooBar data - BankLevel") - val requestCreateFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").POST <@(user1) + val requestCreateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "FooBar").POST <@ (user2) val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) responseCreateFoobar.code should equal(201) - val FooBarId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s - Then("we grant user3 can get FooBar role ") - Entitlement.entitlement.vend.addEntitlement("", resourceUser3.userId, "CanGetDynamicEntity_FooBar") - val requestCreateFoobarUser3 = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar").GET <@(user3) - val responseCreateFoobarUser3 = makeGetRequest(requestCreateFoobarUser3) - responseCreateFoobarUser3.code should equal(200) + val requestGetFoobars = (dynamicEntity_Request / "banks" / testBankId1.value / "FooBar").GET <@ (user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) - Then("user1 delete the FooBar data") - val requestDeleteFoobar = (dynamicEntity_Request / "banks" /testBankId1.value / "FooBar" / FooBarId ).DELETE <@(user1) - val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) - responseDeleteFoobar.code should equal(200) - - Then("user1 delete the FooBar entity") - val request400 = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities" / dynamicEntityId).DELETE <@(user1) - val response400 = makeDeleteRequest(request400) - response400.code should equal(200) - - When("When user2 call the foobar endpoints, it need some roles") - val request = (v4_0_0_Request / "management" / "banks" /testBankId1.value / "dynamic-entities").POST <@(user2) - val responseNoBankId = makePostRequest(request, write(rightEntity)) - Then("We should get a 201") - responseNoBankId.code should equal(201) - - val requestCreateFoobarUser2 = (dynamicEntity_Request / "FooBar").POST <@(user2) - val responseCreateFoobarUser2 = makePostRequest(requestCreateFoobarUser2, write(foobarObject)) - responseCreateFoobarUser2.code should equal(201) - - When("When user1 call the foobar endpoints, it need some roles") - val requestCreateFoobarUser1 = (dynamicEntity_Request / "FooBar").POST <@(user1) - val responseCreateFoobarUser1 = makePostRequest(requestCreateFoobarUser1, write(foobarObject)) - responseCreateFoobarUser1.code should equal(403) - And("error should be " + UserHasMissingRoles) - responseCreateFoobarUser1.body.extract[ErrorMessage].message contains (UserHasMissingRoles) should be (true) - - val responseCreateFoobarUser3Again = makePostRequest(requestCreateFoobarUser3, write(foobarObject)) - responseCreateFoobarUser3Again.code should equal(403) + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(2) } + { + Then("user1 CURD the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").POST <@ (user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").GET <@ (user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar" / dynamicEntityId).GET <@ (user1) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar" / dynamicEntityId).PUT <@ (user1) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar" / dynamicEntityId).DELETE <@ (user1) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + } + + { + Then("user2 CURD the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").POST <@ (user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + val dynamicEntityId = (responseCreateFoobar.body \ "foo_bar" \ "foo_bar_id").asInstanceOf[JString].s + + val requestGetFoobars = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").GET <@ (user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + val requestGetFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar" / dynamicEntityId).GET <@ (user2) + val responseGetFoobar = makeGetRequest(requestGetFoobar) + responseGetFoobar.code should equal(200) + + val requestUpdateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar" / dynamicEntityId).PUT <@ (user2) + val responseUpdateFoobar = makePutRequest(requestUpdateFoobar, write(foobarUpdateObject)) + responseUpdateFoobar.code should equal(200) + val responseUpdateFoobarName = (responseUpdateFoobar.body \ "foo_bar" \ "name").asInstanceOf[JString].s + responseUpdateFoobarName should equal("James Brown123") + + val requestDeleteFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar" / dynamicEntityId).DELETE <@ (user2) + val responseDeleteFoobar = makeDeleteRequest(requestDeleteFoobar) + responseDeleteFoobar.code should equal(200) + } + + { + Then("user1 Create the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").POST <@ (user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + } + + { + Then("user2 Create the myFooBar") + val requestCreateFoobar = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").POST <@ (user2) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(201) + } + + { + Then("User1 get my foobar, only return his own records, only one") + val requestGetFoobars = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").GET <@ (user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(1) + } + { + Then("User2 get my foobar, only return his own records, only one") + val requestGetFoobars = (dynamicEntity_Request / "banks" / testBankId1.value / "my" / "FooBar").GET <@ (user2) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(1) + } + + { + Then("User1 get system foobar, return 2 system records") + val requestGetFoobars = (dynamicEntity_Request / "banks" / testBankId1.value / "FooBar").GET <@ (user1) + val responseGetFoobars = makeGetRequest(requestGetFoobars) + responseGetFoobars.code should equal(200) + + (responseGetFoobars.body \ "foo_bar_list").asInstanceOf[JArray].arr.size should be(2) + } } + + scenario("User1 Create System Level Foobar and set hasPersonalEntity = false, then there will be no my endpoints at all" , ApiEndpoint1, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement("", resourceUser1.userId, CanCreateSystemLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ (user1) + + val haspersonalEntityFalse = parse( + """ + |{ + | "FooBar": { + | "haspersonalentity": false, + | "description": "description of this entity, can be markdown text.", + | "required": [ + | "name" + | ], + | "properties": { + | "name": { + | "type": "string", + | "maxLength": 20, + | "minLength": 3, + | "example": "James Brown", + | "description":"description of **name** field, can be markdown text." + | }, + | "number": { + | "type": "integer", + | "example": 69876172 + | } + | } + | } + |} + |""".stripMargin) + + val responseSystemLevel = makePostRequest(requestSystemLevel, write(haspersonalEntityFalse)) + Then("We should get a 201") + responseSystemLevel.code should equal(201) + + val requestCreateFoobar = (dynamicEntity_Request / "my" / "FooBar").POST <@ (user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(400) + } + + scenario("User1 Create Bank Level Foobar and set hasPersonalEntity = false, then there will be no my endpoints at all" , ApiEndpoint1, VersionOfApi) { + Entitlement.entitlement.vend.addEntitlement(testBankId1.value, resourceUser1.userId, CanCreateBankLevelDynamicEntity.toString) + When("We make a request v4.0.0") + val requestSystemLevel = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST <@ (user1) + + val haspersonalEntityFalse = parse( + """ + |{ + | "FooBar": { + | "haspersonalentity": false, + | "description": "description of this entity, can be markdown text.", + | "required": [ + | "name" + | ], + | "properties": { + | "name": { + | "type": "string", + | "maxLength": 20, + | "minLength": 3, + | "example": "James Brown", + | "description":"description of **name** field, can be markdown text." + | }, + | "number": { + | "type": "integer", + | "example": 69876172 + | } + | } + | } + |} + |""".stripMargin) + + val responseSystemLevel = makePostRequest(requestSystemLevel, write(haspersonalEntityFalse)) + Then("We should get a 201") + responseSystemLevel.code should equal(201) + + val requestCreateFoobar = (dynamicEntity_Request/ "banks" / testBankId1.value / "my" / "FooBar").POST <@ (user1) + val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) + responseCreateFoobar.code should equal(400) + } + } } From 45463f0e055d72466295b0cd82bb97d226e56ee9 Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 14:54:13 +0100 Subject: [PATCH 06/11] feature/added the hasPersonalEntity field for DynamicEntity --- .../entity/helper/DynamicEntityHelper.scala | 287 +++++++++--------- .../scala/code/api/v4_0_0/APIMethods400.scala | 2 + .../dynamicEntity/DynamicEntityProvider.scala | 10 +- .../MapppedDynamicEntityProvider.scala | 4 +- .../code/api/v4_0_0/DynamicEntityTest.scala | 12 +- 5 files changed, 160 insertions(+), 155 deletions(-) diff --git a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala index 37bd81805..0417c5538 100644 --- a/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/entity/helper/DynamicEntityHelper.scala @@ -23,11 +23,11 @@ object EntityName { //eg: /my/FooBar21 case "my" :: entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty && definitionMap._2.hasPersonalEntity) .map(_ => (None, entityName, "", true)) //eg: /my/FooBar21/FOO_BAR21_ID case "my" :: entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == None && definitionMap._1._2 == entityName && definitionMap._2.bankId.isEmpty && definitionMap._2.hasPersonalEntity) .map(_ => (None, entityName, id, true)) //eg: /FooBar21 @@ -42,11 +42,11 @@ object EntityName { //eg: /Banks/BANK_ID/my/FooBar21 case "banks" :: bankId :: "my" :: entityName :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId) && definitionMap._2.hasPersonalEntity) .map(_ => (Some(bankId), entityName, "", true)) //eg: /Banks/BANK_ID/my/FooBar21/FOO_BAR21_ID case "banks" :: bankId :: "my" :: entityName :: id :: Nil => - DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId)) + DynamicEntityHelper.definitionsMap.find(definitionMap => definitionMap._1._1 == Some(bankId) && definitionMap._1._2 == entityName && definitionMap._2.bankId == Some(bankId) && definitionMap._2.hasPersonalEntity) .map(_ => (Some(bankId),entityName, id, true)) //contains Bank: @@ -67,7 +67,7 @@ object DynamicEntityHelper { private val implementedInApiVersion = ApiVersion.v4_0_0 // (Some(BankId), EntityName, DynamicEntityInfo) - def definitionsMap: Map[(Option[String], String), DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None, true).map(it => ((it.bankId, it.entityName), DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId))).toMap + def definitionsMap: Map[(Option[String], String), DynamicEntityInfo] = NewStyle.function.getDynamicEntities(None, true).map(it => ((it.bankId, it.entityName), DynamicEntityInfo(it.metadataJson, it.entityName, it.bankId, it.hasPersonalEntity))).toMap def dynamicEntityRoles: List[String] = NewStyle.function.getDynamicEntities(None, true).flatMap(dEntity => DynamicEntityInfo.roleNames(dEntity.entityName, dEntity.bankId)) @@ -138,6 +138,8 @@ object DynamicEntityHelper { private def createDocs(fun: (String, String) => ResourceDocTag) (dynamicEntityInfo: DynamicEntityInfo): mutable.Map[(DynamicEntityOperation, String), ResourceDoc] = { val entityName = dynamicEntityInfo.entityName + val hasPersonalEntity = dynamicEntityInfo.hasPersonalEntity + // e.g: "someMultiple-part_Name" -> ["Some", "Multiple", "Part", "Name"] val capitalizedNameParts = entityName.split("(?<=[a-z0-9])(?=[A-Z])|-|_").map(_.capitalize).filterNot(_.trim.isEmpty) val splitName = s"""${capitalizedNameParts.mkString(" ")}""" @@ -307,143 +309,144 @@ object DynamicEntityHelper { createdByBankId= dynamicEntityInfo.bankId ) - resourceDocs += (DynamicEntityOperation.GET_ALL, mySplitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildGetAllFunctionName(bankId, s"My$entityName"), - "GET", - s"$myResourceDocUrl", - s"Get My $splitName List", - s"""Get My $splitName List. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |Can do filter on the fields - |e.g: /${entityName}?name=James%20Brown&number=123.456&number=11.11 - |Will do filter by this rule: name == "James Brown" && (number==123.456 || number=11.11) - |""".stripMargin, - EmptyBody, - dynamicEntityInfo.getExampleList, - List( - UserNotLoggedIn, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.GET_ONE, mySplitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildGetOneFunctionName(bankId, s"My$entityName"), - "GET", - s"$myResourceDocUrl/$idNameInUrl", - s"Get My $splitName by id", - s"""Get My $splitName by id. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - |""".stripMargin, - EmptyBody, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.CREATE, mySplitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildCreateFunctionName(bankId, s"My$entityName"), - "POST", - s"$myResourceDocUrl", - s"Create new My $splitName", - s"""Create new My $splitName. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |""", - dynamicEntityInfo.getSingleExampleWithoutId, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - InvalidJsonFormat, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - createdByBankId= dynamicEntityInfo.bankId + if(hasPersonalEntity){ //only hasPersonalEntity == true, then create the myEndpoints + resourceDocs += (DynamicEntityOperation.GET_ALL, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildGetAllFunctionName(bankId, s"My$entityName"), + "GET", + s"$myResourceDocUrl", + s"Get My $splitName List", + s"""Get My $splitName List. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |Can do filter on the fields + |e.g: /${entityName}?name=James%20Brown&number=123.456&number=11.11 + |Will do filter by this rule: name == "James Brown" && (number==123.456 || number=11.11) + |""".stripMargin, + EmptyBody, + dynamicEntityInfo.getExampleList, + List( + UserNotLoggedIn, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId ) - - resourceDocs += (DynamicEntityOperation.UPDATE, mySplitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildUpdateFunctionName(bankId, s"My$entityName"), - "PUT", - s"$myResourceDocUrl/$idNameInUrl", - s"Update My $splitName", - s"""Update My $splitName. - |${dynamicEntityInfo.description} - | - |${dynamicEntityInfo.fieldsDescription} - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |""", - dynamicEntityInfo.getSingleExampleWithoutId, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - InvalidJsonFormat, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - Some(List(dynamicEntityInfo.canUpdateRole)), - createdByBankId= dynamicEntityInfo.bankId - ) - - resourceDocs += (DynamicEntityOperation.DELETE, mySplitNameWithBankId) -> ResourceDoc( - endPoint, - implementedInApiVersion, - buildDeleteFunctionName(bankId, s"My$entityName"), - "DELETE", - s"$myResourceDocUrl/$idNameInUrl", - s"Delete My $splitName by id", - s"""Delete My $splitName by id - | - |${methodRoutingExample(entityName)} - | - |${authenticationRequiredMessage(true)} - | - |""", - dynamicEntityInfo.getSingleExampleWithoutId, - dynamicEntityInfo.getSingleExample, - List( - UserNotLoggedIn, - UnknownError - ), - List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), - createdByBankId= dynamicEntityInfo.bankId - ) - + + resourceDocs += (DynamicEntityOperation.GET_ONE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildGetOneFunctionName(bankId, s"My$entityName"), + "GET", + s"$myResourceDocUrl/$idNameInUrl", + s"Get My $splitName by id", + s"""Get My $splitName by id. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + |""".stripMargin, + EmptyBody, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.CREATE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildCreateFunctionName(bankId, s"My$entityName"), + "POST", + s"$myResourceDocUrl", + s"Create new My $splitName", + s"""Create new My $splitName. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |""", + dynamicEntityInfo.getSingleExampleWithoutId, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + InvalidJsonFormat, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.UPDATE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildUpdateFunctionName(bankId, s"My$entityName"), + "PUT", + s"$myResourceDocUrl/$idNameInUrl", + s"Update My $splitName", + s"""Update My $splitName. + |${dynamicEntityInfo.description} + | + |${dynamicEntityInfo.fieldsDescription} + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |""", + dynamicEntityInfo.getSingleExampleWithoutId, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + InvalidJsonFormat, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + Some(List(dynamicEntityInfo.canUpdateRole)), + createdByBankId= dynamicEntityInfo.bankId + ) + + resourceDocs += (DynamicEntityOperation.DELETE, mySplitNameWithBankId) -> ResourceDoc( + endPoint, + implementedInApiVersion, + buildDeleteFunctionName(bankId, s"My$entityName"), + "DELETE", + s"$myResourceDocUrl/$idNameInUrl", + s"Delete My $splitName by id", + s"""Delete My $splitName by id + | + |${methodRoutingExample(entityName)} + | + |${authenticationRequiredMessage(true)} + | + |""", + dynamicEntityInfo.getSingleExampleWithoutId, + dynamicEntityInfo.getSingleExample, + List( + UserNotLoggedIn, + UnknownError + ), + List(apiTag, apiTagNewStyle, apiTagDynamicEntity, apiTagDynamic), + createdByBankId= dynamicEntityInfo.bankId + ) + } resourceDocs } @@ -493,7 +496,7 @@ object DynamicEntityHelper { |""".stripMargin } -case class DynamicEntityInfo(definition: String, entityName: String, bankId: Option[String]) { +case class DynamicEntityInfo(definition: String, entityName: String, bankId: Option[String], hasPersonalEntity: Boolean) { import net.liftweb.json 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 19d31a558..158d1a7df 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 @@ -2095,6 +2095,8 @@ trait APIMethods400 { |``` |${ReferenceType.referenceTypeAndExample.mkString("\n")} |``` + | + |Note: if you set `hasPersonalEntity` = false, then OBP will not generate the CRUD my FooBar endpoints. |""", dynamicEntityRequestBodyExample.copy(bankId = None), dynamicEntityResponseBodyExample.copy(bankId = None), diff --git a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala index 59ef29ddf..68e3a045f 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala @@ -35,7 +35,7 @@ trait DynamicEntityT { * @return */ def userId: String - def hasPersonalEntity: Option[Boolean] + def hasPersonalEntity: Boolean /** * Add Option(bank_id) to Dynamic Entity. @@ -365,7 +365,7 @@ case class DynamicEntityCommons(entityName: String, dynamicEntityId: Option[String] = None, userId: String, bankId: Option[String] , - hasPersonalEntity: Option[Boolean] + hasPersonalEntity: Boolean ) extends DynamicEntityT with JsonFieldReName object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommons] { @@ -411,11 +411,11 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo // validate whether json is object and have a single field, currently support one entity definition checkFormat(fields.nonEmpty, s"$DynamicEntityInstanceValidateFail The Json root object should have a single entity, but current have none.") - checkFormat(fields.size == 1, s"$DynamicEntityInstanceValidateFail The Json root object should have a single entity, but current entityNames: ${fields.map(_.name).mkString(", ")}") + checkFormat(fields.size <= 2, s"$DynamicEntityInstanceValidateFail The Json root object should at most two fields: entity and hasPersonalEntity, but current entityNames: ${fields.map(_.name).mkString(", ")}") - val hasPersonalEntity: Option[Boolean] = fields.filter(_.name=="hasPersonalEntity").map(_.value.asInstanceOf[JBool].values).headOption + val hasPersonalEntity: Boolean = fields.filter(_.name=="hasPersonalEntity").map(_.value.asInstanceOf[JBool].values).headOption.getOrElse(true) - val JField(entityName, metadataJson) = fields.filter(_.name!="bankId").head + val JField(entityName, metadataJson) = fields.filter(_.name!="hasPersonalEntity").head val namePattern = "[-_A-Za-z0-9]+".r.pattern // validate entity name diff --git a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala index b6f353abe..25ed44222 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/MapppedDynamicEntityProvider.scala @@ -66,7 +66,7 @@ object MappedDynamicEntityProvider extends DynamicEntityProvider with CustomJson .MetadataJson(dynamicEntity.metadataJson) .UserId(dynamicEntity.userId) .BankId(dynamicEntity.bankId.getOrElse(null)) - .HasPersonalEntity(dynamicEntity.hasPersonalEntity.getOrElse(true)) + .HasPersonalEntity(dynamicEntity.hasPersonalEntity) .saveMe() } catch { case e => @@ -105,7 +105,7 @@ class DynamicEntity extends DynamicEntityT with LongKeyedMapper[DynamicEntity] w override def metadataJson: String = MetadataJson.get override def userId: String = UserId.get override def bankId: Option[String] = if (BankId.get == null || BankId.get.isEmpty) None else Some(BankId.get) - override def hasPersonalEntity: Option[Boolean] = Option(HasPersonalEntity.get) + override def hasPersonalEntity: Boolean = HasPersonalEntity.get } object DynamicEntity extends DynamicEntity with LongKeyedMetaMapper[DynamicEntity] { diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala index c8d35956b..d122461e7 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala @@ -1803,11 +1803,11 @@ class DynamicEntityTest extends V400ServerSetup { When("We make a request v4.0.0") val requestSystemLevel = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ (user1) - val haspersonalEntityFalse = parse( + val hasPersonalEntityFalse = parse( """ |{ + | "hasPersonalEntity": false, | "FooBar": { - | "haspersonalentity": false, | "description": "description of this entity, can be markdown text.", | "required": [ | "name" @@ -1829,7 +1829,7 @@ class DynamicEntityTest extends V400ServerSetup { |} |""".stripMargin) - val responseSystemLevel = makePostRequest(requestSystemLevel, write(haspersonalEntityFalse)) + val responseSystemLevel = makePostRequest(requestSystemLevel, write(hasPersonalEntityFalse)) Then("We should get a 201") responseSystemLevel.code should equal(201) @@ -1843,11 +1843,11 @@ class DynamicEntityTest extends V400ServerSetup { When("We make a request v4.0.0") val requestSystemLevel = (v4_0_0_Request / "management" / "banks" / testBankId1.value / "dynamic-entities").POST <@ (user1) - val haspersonalEntityFalse = parse( + val hasPersonalEntityFalse = parse( """ |{ + | "hasPersonalEntity": false, | "FooBar": { - | "haspersonalentity": false, | "description": "description of this entity, can be markdown text.", | "required": [ | "name" @@ -1869,7 +1869,7 @@ class DynamicEntityTest extends V400ServerSetup { |} |""".stripMargin) - val responseSystemLevel = makePostRequest(requestSystemLevel, write(haspersonalEntityFalse)) + val responseSystemLevel = makePostRequest(requestSystemLevel, write(hasPersonalEntityFalse)) Then("We should get a 201") responseSystemLevel.code should equal(201) From f2495dcbf682eed8b2ed453df46ffcc1f6be8eab Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 16:06:29 +0100 Subject: [PATCH 07/11] tests/fixed the failed tests --- .../src/main/scala/code/api/v4_0_0/APIMethods400.scala | 4 +--- .../bankconnectors/rest/RestConnector_vMar2019.scala | 2 +- .../StoredProcedureConnector_vDec2019.scala | 2 +- .../scala/code/dynamicEntity/DynamicEntityProvider.scala | 2 +- .../api/v4_0_0/AuthenticationTypeValidationTest.scala | 9 ++++----- .../test/scala/code/api/v4_0_0/DynamicEntityTest.scala | 6 ++++-- .../scala/code/api/v4_0_0/ForceErrorValidationTest.scala | 5 ++--- .../scala/code/api/v4_0_0/JsonSchemaValidationTest.scala | 1 - .../com/openbankproject/commons/dto/JsonsTransfer.scala | 4 +++- 9 files changed, 17 insertions(+), 18 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 6f679b5af..5b7ec104a 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 @@ -2145,9 +2145,7 @@ trait APIMethods400 { |``` |${ReferenceType.referenceTypeAndExample.mkString("\n")} |``` - | Note: BankId filed is optional, - | if you add it, the entity will be the Bank level. - | if you omit it, the entity will be the System level. + | Note: if you set `hasPersonalEntity` = false, then OBP will not generate the CRUD my FooBar endpoints. |""", dynamicEntityRequestBodyExample.copy(bankId = None), dynamicEntityResponseBodyExample, 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 95f587ad6..e5b1af24a 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 @@ -6491,7 +6491,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = { import com.openbankproject.commons.dto.{OutBoundDynamicEntityProcess => OutBound, InBoundDynamicEntityProcess => InBound} val url = getUrl(callContext, "dynamicEntityProcess") - val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull , operation, entityName, requestBody, entityId, bankId, queryParameters) + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull , operation, entityName, requestBody, entityId, bankId, queryParameters, userId, isPersonalEntity) val result: OBPReturnType[Box[JValue]] = sendRequest[InBound](url, HttpMethods.POST, req, callContext).map(convertToTuple(callContext)) result } diff --git a/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala b/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala index e7f0fde51..169fae994 100644 --- a/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala @@ -6474,7 +6474,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { callContext: Option[CallContext]): OBPReturnType[Box[JValue]] = { import com.openbankproject.commons.dto.{InBoundDynamicEntityProcess => InBound, OutBoundDynamicEntityProcess => OutBound} val procedureName = StringHelpers.snakify("dynamicEntityProcess") - val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull , operation, entityName, requestBody, entityId, bankId, queryParameters) + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull , operation, entityName, requestBody, entityId, bankId, queryParameters,userId, isPersonalEntity) val result: OBPReturnType[Box[JValue]] = sendRequest[InBound](procedureName, req, callContext).map(convertToTuple(callContext)) result } diff --git a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala index 68e3a045f..2d5345401 100644 --- a/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala +++ b/obp-api/src/main/scala/code/dynamicEntity/DynamicEntityProvider.scala @@ -530,7 +530,7 @@ object DynamicEntityCommons extends Converter[DynamicEntityT, DynamicEntityCommo * example case classes, as an example schema of DynamicEntity, for request body example usage * @param FooBar */ -case class DynamicEntityFooBar(bankId: Option[String], FooBar: DynamicEntityDefinition, dynamicEntityId: Option[String] = None, userId: Option[String] = None) +case class DynamicEntityFooBar(bankId: Option[String], FooBar: DynamicEntityDefinition, dynamicEntityId: Option[String] = None, userId: Option[String] = None, hasPersonalEntity:Boolean = true) case class DynamicEntityDefinition(description: String, required: List[String],properties: DynamicEntityFullBarFields) case class DynamicEntityFullBarFields(name: DynamicEntityStringTypeExample, number: DynamicEntityIntTypeExample) case class DynamicEntityStringTypeExample(`type`: DynamicEntityFieldType, minLength: Int, maxLength: Int, example: String, description: String) diff --git a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala index b062d93ea..bd5792977 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala @@ -327,10 +327,10 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { scenario(s"We will call the endpoint $ApiEndpoint1 with invalid FooBar", ApiEndpoint1, VersionOfApi) { addOneAuthenticationTypeValidation(allowedDirectLogin, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response= makePostRequest(request, newFooBar) Then("We should get a 400") response.code should equal(400) @@ -345,10 +345,10 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { scenario(s"We will call the endpoint $ApiEndpoint1 with valid FooBar", ApiEndpoint1, VersionOfApi) { addOneAuthenticationTypeValidation(allowedAll, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response= makePostRequest(request, newFooBar) Then("We should get a 201") response.code should equal(201) @@ -408,7 +408,6 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { val fooBar = s""" |{ - | "bankId": "$bankId", | "FooBar": { | "description": "description of this entity, can be markdown text.", | "required": [ diff --git a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala index d122461e7..b0e32ac8e 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/DynamicEntityTest.scala @@ -1835,7 +1835,8 @@ class DynamicEntityTest extends V400ServerSetup { val requestCreateFoobar = (dynamicEntity_Request / "my" / "FooBar").POST <@ (user1) val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(400) + responseCreateFoobar.code should equal(404) + responseCreateFoobar.body.toString contains (s"$InvalidUri") should be (true) } scenario("User1 Create Bank Level Foobar and set hasPersonalEntity = false, then there will be no my endpoints at all" , ApiEndpoint1, VersionOfApi) { @@ -1875,7 +1876,8 @@ class DynamicEntityTest extends V400ServerSetup { val requestCreateFoobar = (dynamicEntity_Request/ "banks" / testBankId1.value / "my" / "FooBar").POST <@ (user1) val responseCreateFoobar = makePostRequest(requestCreateFoobar, write(foobarObject)) - responseCreateFoobar.code should equal(400) + responseCreateFoobar.code should equal(404) + responseCreateFoobar.body.toString contains (s"$InvalidUri") should be (true) } } diff --git a/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala index 6075f2b63..d5a79571d 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala @@ -91,7 +91,7 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { addDynamicEntity() When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST + val request = (dynamicEntity_Request / "FooBar").POST val response = makePostRequest(request, correctFooBar, ("Force-Error", "OBP-20006")) Then("We should get a 401") @@ -632,11 +632,10 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { // prepare one dynamic entity FooBar private def addDynamicEntity(): APIResponse = { addEntitlement(canCreateSystemLevelDynamicEntity) - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@ user1 + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ user1 val fooBar = s""" |{ - | "bankId": "$bankId", | "FooBar": { | "description": "description of this entity, can be markdown text.", | "required": [ diff --git a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala index 9c563ad65..90e75d1fb 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala @@ -410,7 +410,6 @@ class JsonSchemaValidationTest extends V400ServerSetup { val fooBar = s""" |{ - | "bankId": "$bankId", | "FooBar": { | "description": "description of this entity, can be markdown text.", | "required": [ diff --git a/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala b/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala index b81c09d28..54f2f1742 100644 --- a/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala +++ b/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala @@ -986,7 +986,9 @@ case class OutBoundDynamicEntityProcess (outboundAdapterCallContext: OutboundAda requestBody: Option[JObject], entityId: Option[String], bankId: Option[String], - queryParameters: Option[Map[String, List[String]]]) extends TopicTrait + queryParameters: Option[Map[String, List[String]]], + userId: Option[String], + isPersonalEntity: Boolean)extends TopicTrait case class InBoundDynamicEntityProcess (inboundAdapterCallContext: InboundAdapterCallContext, status: Status, data: JValue) extends InBoundTrait[JValue] // because swagger generate not support JValue type, so here supply too xxxDoc TO generate correct request and response body example From 245d11ee18f6e70735299a0bb3707be4dc99df43 Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 17:00:19 +0100 Subject: [PATCH 08/11] tests/fixed the failed tests2 --- .../AuthenticationTypeValidationTest.scala | 8 ++-- .../api/v4_0_0/ForceErrorValidationTest.scala | 40 +++++++++--------- .../api/v4_0_0/JsonSchemaValidationTest.scala | 16 +++---- .../RestConnector_vMar2019_frozen_meta_data | Bin 113090 -> 113145 bytes 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala index bd5792977..dabdabca1 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala @@ -326,7 +326,7 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { feature(s"test AuthenticationTypeValidation endpoints version $VersionOfApi - Validate dynamic entity endpoint request body") { scenario(s"We will call the endpoint $ApiEndpoint1 with invalid FooBar", ApiEndpoint1, VersionOfApi) { addOneAuthenticationTypeValidation(allowedDirectLogin, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") - addDynamicEntity() + addSystemDynamicEntity() addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") @@ -344,7 +344,7 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { scenario(s"We will call the endpoint $ApiEndpoint1 with valid FooBar", ApiEndpoint1, VersionOfApi) { addOneAuthenticationTypeValidation(allowedAll, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") - addDynamicEntity() + addSystemDynamicEntity() addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") @@ -402,9 +402,9 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { response } // prepare one dynamic entity FooBar - private def addDynamicEntity(): APIResponse = { + private def addSystemDynamicEntity(): APIResponse = { grantEntitlement(canCreateSystemLevelDynamicEntity) - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@ user1 + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ user1 val fooBar = s""" |{ diff --git a/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala index d5a79571d..1cd8f05dc 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/ForceErrorValidationTest.scala @@ -88,7 +88,7 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { } scenario(s"We will call the dynamic entity endpoint without authentication", VersionOfApi) { - addDynamicEntity() + addSystemDynamicEntity() When("We make a request v4.0.0") val request = (dynamicEntity_Request / "FooBar").POST @@ -410,11 +410,11 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { ////// dynamic entity feature(s"test dynamic entity endpoints Force-Error, version $VersionOfApi - authenticated access") { scenario(s"We will call the endpoint $ApiEndpoint3 with Force-Error have wrong format header", VersionOfApi) { - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response = makePostRequest(request, correctFooBar, ("Force-Error" -> "OBP-xxxx")) Then("We should get a 400") @@ -426,11 +426,11 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { } scenario(s"We will call the endpoint $ApiEndpoint3 with Force-Error header value not support by current endpoint", VersionOfApi) { - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response = makePostRequest(request, correctFooBar, ("Force-Error" -> "OBP-20009")) Then("We should get a 400") response.code should equal(400) @@ -441,11 +441,11 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { } scenario(s"We will call the endpoint $ApiEndpoint3 with Response-Code header value is not Int", VersionOfApi) { - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response = makePostRequest(request, correctFooBar, ("Force-Error" -> "OBP-20006"), ("Response-Code" -> "not_integer")) Then("We should get a 400") response.code should equal(400) @@ -456,11 +456,11 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { } scenario(s"We will call the endpoint $ApiEndpoint3 with correct Force-Error header value", VersionOfApi) { - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response = makePostRequest(request, correctFooBar, ("Force-Error" -> "OBP-20006")) Then("We should get a 403") response.code should equal(403) @@ -473,11 +473,11 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { } scenario(s"We will call the endpoint $ApiEndpoint3 with correct Force-Error header value and Response-Code value", VersionOfApi) { - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response = makePostRequest(request, correctFooBar, ("Force-Error" -> "OBP-20006"), ("Response-Code" -> "444")) Then("We should get a 444") response.code should equal(444) @@ -491,11 +491,11 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { scenario(s"We will call the endpoint $ApiEndpoint3 with correct Force-Error header value, but 'enable.force_error=false'", VersionOfApi) { setPropsValues("enable.force_error"->"false") - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response = makePostRequest(request, correctFooBar, ("Force-Error" -> "OBP-20006")) Then("We should not get a 403") response.code should not equal(403) @@ -630,7 +630,7 @@ class ForceErrorValidationTest extends V400ServerSetup with PropsReset { } // prepare one dynamic entity FooBar - private def addDynamicEntity(): APIResponse = { + private def addSystemDynamicEntity(): APIResponse = { addEntitlement(canCreateSystemLevelDynamicEntity) val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ user1 val fooBar = diff --git a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala index 90e75d1fb..a190c4ebf 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala @@ -328,11 +328,11 @@ class JsonSchemaValidationTest extends V400ServerSetup { feature(s"test JSON Schema Validation endpoints version $VersionOfApi - Validate dynamic entity endpoint request body") { scenario(s"We will call the endpoint $ApiEndpoint1 with invalid FooBar", ApiEndpoint1, VersionOfApi) { addOneValidation(jsonSchemaFooBar, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response= makePostRequest(request, wrongFooBar) Then("We should get a 400") response.code should equal(400) @@ -345,11 +345,11 @@ class JsonSchemaValidationTest extends V400ServerSetup { scenario(s"We will call the endpoint $ApiEndpoint1 with valid FooBar", ApiEndpoint1, VersionOfApi) { addOneValidation(jsonSchemaFooBar, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") - addDynamicEntity() - addStringEntitlement("CanCreateDynamicEntity_FooBar", bankId) + addSystemDynamicEntity() + addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") When("We make a request v4.0.0") - val request = (dynamicEntity_Request / "banks" / bankId / "FooBar").POST <@ user1 + val request = (dynamicEntity_Request / "FooBar").POST <@ user1 val response= makePostRequest(request, correctFooBar) Then("We should get a 201") response.code should equal(201) @@ -404,9 +404,9 @@ class JsonSchemaValidationTest extends V400ServerSetup { response } // prepare one dynamic entity FooBar - private def addDynamicEntity(): APIResponse = { + private def addSystemDynamicEntity(): APIResponse = { addEntitlement(canCreateSystemLevelDynamicEntity) - val request = (v4_0_0_Request / "management" / "dynamic-entities").POST <@ user1 + val request = (v4_0_0_Request / "management" / "system-dynamic-entities").POST <@ user1 val fooBar = s""" |{ diff --git a/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data b/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data index 6979422b75ed335a8ce77b31462c696533a9689e..cec76c2c9e16b82bb91f9eaee0f9349a65450d98 100644 GIT binary patch delta 80 zcmX@~neFFiwuUW?Y$jZsB@7&?c_o=8mD3F~7)7V6nlMh07RW3PNG&SP&r8g41240cP5NiS^$K_9IgNW delta 53 zcmezQneEVLwuUW?Y$janB@7&?c_o=8mD3kiGKx-DHDR1G{hA4*8B0=PUN%UqX!{&f H#@H4BAF~sg From cfc9b11387378a376e9a2696a68a73fb664a58ba Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 18:05:36 +0100 Subject: [PATCH 09/11] tests/fixed the failed tests3 --- .../code/api/v4_0_0/AuthenticationTypeValidationTest.scala | 2 +- .../test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala index dabdabca1..9b74e9155 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala @@ -325,7 +325,7 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { feature(s"test AuthenticationTypeValidation endpoints version $VersionOfApi - Validate dynamic entity endpoint request body") { scenario(s"We will call the endpoint $ApiEndpoint1 with invalid FooBar", ApiEndpoint1, VersionOfApi) { - addOneAuthenticationTypeValidation(allowedDirectLogin, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") + addOneAuthenticationTypeValidation(allowedDirectLogin, s"OBPv4.0.0-dynamicEntity_createFooBar") addSystemDynamicEntity() addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") diff --git a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala index a190c4ebf..8ae253ae4 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/JsonSchemaValidationTest.scala @@ -327,7 +327,7 @@ class JsonSchemaValidationTest extends V400ServerSetup { feature(s"test JSON Schema Validation endpoints version $VersionOfApi - Validate dynamic entity endpoint request body") { scenario(s"We will call the endpoint $ApiEndpoint1 with invalid FooBar", ApiEndpoint1, VersionOfApi) { - addOneValidation(jsonSchemaFooBar, s"OBPv4.0.0-dynamicEntity_createFooBar_${bankId}") + addOneValidation(jsonSchemaFooBar, s"OBPv4.0.0-dynamicEntity_createFooBar_") addSystemDynamicEntity() addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") From fe7ba0c076608f04dd7f71a76ab0b94df732d0ef Mon Sep 17 00:00:00 2001 From: hongwei Date: Thu, 10 Nov 2022 23:13:12 +0100 Subject: [PATCH 10/11] tests/fixed the failed tests4 --- .../code/api/v4_0_0/AuthenticationTypeValidationTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala index 9b74e9155..8852f2f6b 100644 --- a/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala +++ b/obp-api/src/test/scala/code/api/v4_0_0/AuthenticationTypeValidationTest.scala @@ -325,7 +325,7 @@ class AuthenticationTypeValidationTest extends V400ServerSetup { feature(s"test AuthenticationTypeValidation endpoints version $VersionOfApi - Validate dynamic entity endpoint request body") { scenario(s"We will call the endpoint $ApiEndpoint1 with invalid FooBar", ApiEndpoint1, VersionOfApi) { - addOneAuthenticationTypeValidation(allowedDirectLogin, s"OBPv4.0.0-dynamicEntity_createFooBar") + addOneAuthenticationTypeValidation(allowedDirectLogin, s"OBPv4.0.0-dynamicEntity_createFooBar_") addSystemDynamicEntity() addStringEntitlement("CanCreateDynamicEntity_SystemFooBar", "") From 01f12a5fe19aa1f3edacc1e303f7b6b2cec15510 Mon Sep 17 00:00:00 2001 From: hongwei Date: Wed, 14 Dec 2022 16:05:37 +0100 Subject: [PATCH 11/11] test/fixed the failed RestConnector_vMar2019_frozen_meta_data test --- .../RestConnector_vMar2019_frozen_meta_data | Bin 113110 -> 113165 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data b/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data index e13b1dd27a885f515a4e4eeb1892c93fe5dbdaeb..de70249c348058077eacb7985393d203276fc140 100644 GIT binary patch delta 66 zcmV-I0KNa#^9GId27t5y8Z-e3mm4$zvKtU-b5Lb+b8l{8Y(;K#X>@sX00%;EZ){~@ YZkNk60XUcNk^vc$?KcUx3pD}DgfLPVi2wiq delta 43 zcmV+`0M!4D^aj@R27t5y8Z-e1mm4$zvX|;K0X76;VQy=a0hkk)+^+#&x3Dz