Unverified Commit bc754baf authored by Anil Gupta's avatar Anil Gupta Committed by GitHub
Browse files

Issue #SB-25737 merge: Merge pull request #718 from shiva-rakshith/visiblity-private-api

SB-25737 - Content & Collection Private Read API
parents 0dbb74ba 9469ad68
s-debug AmiableAnil-patch-1 Gcloud_copy Gcloud_fix Remove_unwantedCode_Gcloud_fix bulk-upload-comptenecy-mapping bulk-upload-excelsheet bulk-upload-test_excel bulk_upload csp-migration dependabot/maven/platform-core/platform-telemetry/ch.qos.logback-logback-core-1.2.9 dependabot/maven/search-api/search-core/org.apache.httpcomponents-httpclient-4.5.13 knowlg-friday knowlg-oneclick local-setup-kube master patch-1 patch-2 patch-3 poc_bulk_upload qs-schema rahul_bulk_upload_postgres release-4.10.0 release-4.10.1 release-4.3.0 release-4.4.0 release-4.5.0 release-4.6.0 release-4.7.0 release-4.7.0-debug release-4.8.0 release-4.8.0-debug release-4.9.0 release-4.9.1 release-5.0.0 release-5.0.1 release-5.1.0 release-5.1.0-content release-5.2.0 release-5.3.0 revert-718-visiblity-private-api revert-719-assessment-private-read-api revert-720-visiblity-public-search-api revert-721-visiblity-private-search-api release-5.2.0_RC2 release-5.2.0_RC1 release-5.1.0_RC1 release-5.0.0_RC2 release-5.0.0_RC1 release-4.10.0_RC2 release-4.10.0_RC1 release-4.9.1_RC1 release-4.9.0_RC8 release-4.9.0_RC7 release-4.9.0_RC6 release-4.9.0_RC5 release-4.9.0_RC4 release-4.9.0_RC3 release-4.9.0_RC2 release-4.9.0_RC1 release-4.8.0_RC5 release-4.8.0_RC4 release-4.8.0_RC3 release-4.8.0_RC2 release-4.8.0_RC1 release-4.7.0_RC6 release-4.7.0_RC5 release-4.7.0_RC4 release-4.7.0_RC3 release-4.7.0_RC2 release-4.7.0_RC1 release-4.6.0_RC2 release-4.6.0_RC1 release-4.5.0_RC2 release-4.5.0_RC1 release-4.4.0_RC6 release-4.4.0_RC5 release-4.4.0_RC4 release-4.4.0_RC3 release-4.4.0_RC2 release-4.4.0_RC1 release-4.3.0_RC10 release-4.3.0_RC9 release-4.3.0_RC8 release-4.3.0_RC7 release-4.3.0_RC6 release-4.3.0_RC5 release-4.3.0_RC4 release-4.3.0_RC3 release-4.3.0_RC2
No related merge requests found
Showing with 123 additions and 0 deletions
+123 -0
......@@ -39,6 +39,7 @@ class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageSe
request.getOperation match {
case "createContent" => create(request)
case "readContent" => read(request)
case "readPrivateContent" => privateRead(request)
case "updateContent" => update(request)
case "uploadContent" => upload(request)
case "retireContent" => retire(request)
......@@ -88,6 +89,30 @@ class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageSe
})
}
def privateRead(request: Request): Future[Response] = {
val responseSchemaName: String = request.getContext.getOrDefault(ContentConstants.RESPONSE_SCHEMA_NAME, "").asInstanceOf[String]
val fields: util.List[String] = JavaConverters.seqAsJavaListConverter(request.get("fields").asInstanceOf[String].split(",").filter(field => StringUtils.isNotBlank(field) && !StringUtils.equalsIgnoreCase(field, "null"))).asJava
request.getRequest.put("fields", fields)
if (StringUtils.isBlank(request.getRequest.getOrDefault("channel", "").asInstanceOf[String])) throw new ClientException("ERR_INVALID_CHANNEL", "Please Provide Channel!")
DataNode.read(request).map(node => {
val metadata: util.Map[String, AnyRef] = NodeUtil.serialize(node, fields, node.getObjectType.toLowerCase.replace("image", ""), request.getContext.get("version").asInstanceOf[String])
metadata.put("identifier", node.getIdentifier.replace(".img", ""))
val response: Response = ResponseHandler.OK
if (StringUtils.equalsIgnoreCase(metadata.getOrDefault("channel", "").asInstanceOf[String],request.getRequest.getOrDefault("channel", "").asInstanceOf[String])) {
if (responseSchemaName.isEmpty) {
response.put("content", metadata)
}
else {
response.put(responseSchemaName, metadata)
}
response
}
else {
throw new ClientException("ERR_INCORRECT_CHANNEL", "Channel id is not matched")
}
})
}
def update(request: Request): Future[Response] = {
populateDefaultersForUpdation(request)
if (StringUtils.isBlank(request.getRequest.getOrDefault("versionKey", "").asInstanceOf[String])) throw new ClientException("ERR_INVALID_REQUEST", "Please Provide Version Key!")
......
......@@ -265,6 +265,66 @@ class TestContentActor extends BaseSpec with MockFactory {
val response = callActor(request, Props(new ContentActor()))
assert(response.getResponseCode == ResponseCode.CLIENT_ERROR)
}
it should "return success response for 'readPrivateContent'" in {
implicit val oec: OntologyEngineContext = mock[OntologyEngineContext]
val graphDB = mock[GraphService]
(oec.graphService _).expects().returns(graphDB)
val node = getNode("Content", Some(new util.HashMap[String, AnyRef]() {
{
put("name", "Content")
put("visibility","Private")
put("channel","abc-123")
}
}))
(graphDB.getNodeByUniqueId(_: String, _: String, _: Boolean, _: Request)).expects(*, *, *, *).returns(Future(node))
implicit val ss = mock[StorageService]
val request = getContentRequest()
request.getContext.put("identifier","do1234")
request.getRequest.put("channel", "abc-123")
request.putAll(mapAsJavaMap(Map("identifier" -> "do_1234", "fields" -> "")))
request.setOperation("readPrivateContent")
val response = callActor(request, Props(new ContentActor()))
assert("successful".equals(response.getParams.getStatus))
}
it should "return client error for 'readPrivateContent' if channel is 'blank'" in {
implicit val oec: OntologyEngineContext = mock[OntologyEngineContext]
val graphDB = mock[GraphService]
implicit val ss = mock[StorageService]
val request = getContentRequest()
request.getContext.put("identifier","do1234")
request.putAll(mapAsJavaMap(Map("identifier" -> "do_1234", "fields" -> "")))
request.setOperation("readPrivateContent")
val response = callActor(request, Props(new ContentActor()))
assert(response.getResponseCode == ResponseCode.CLIENT_ERROR)
assert(response.getParams.getErr == "ERR_INVALID_CHANNEL")
assert(response.getParams.getErrmsg == "Please Provide Channel!")
}
it should "return client error for 'readPrivateContent' if channel is mismatched" in {
implicit val oec: OntologyEngineContext = mock[OntologyEngineContext]
val graphDB = mock[GraphService]
(oec.graphService _).expects().returns(graphDB)
val node = getNode("Content", Some(new util.HashMap[String, AnyRef]() {
{
put("name", "Content")
put("visibility","Private")
put("channel","abc-123")
}
}))
(graphDB.getNodeByUniqueId(_: String, _: String, _: Boolean, _: Request)).expects(*, *, *, *).returns(Future(node)).anyNumberOfTimes()
implicit val ss = mock[StorageService]
val request = getContentRequest()
request.getContext.put("identifier","do1234")
request.getRequest.put("channel", "abc")
request.putAll(mapAsJavaMap(Map("identifier" -> "do_1234", "fields" -> "")))
request.setOperation("readPrivateContent")
val response = callActor(request, Props(new ContentActor()))
assert(response.getResponseCode == ResponseCode.CLIENT_ERROR)
assert(response.getParams.getErr == "ERR_INCORRECT_CHANNEL")
assert(response.getParams.getErrmsg == "Channel id is not matched")
}
it should "return success response for 'updateContent'" in {
implicit val oec: OntologyEngineContext = mock[OntologyEngineContext]
......
......@@ -62,6 +62,16 @@ class CollectionController @Inject()(@Named(ActorNames.CONTENT_ACTOR) contentAc
getResult(ApiId.READ_COLLECTION, contentActor, readRequest, version = apiVersion)
}
def privateRead(identifier: String, mode: Option[String], fields: Option[String]) = Action.async { implicit request =>
val headers = commonHeaders()
val content = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]]
content.putAll(headers)
content.putAll(Map("identifier" -> identifier, "mode" -> mode.getOrElse("read"), "fields" -> fields.getOrElse("")).asJava)
val readRequest = getRequest(content, headers, "readPrivateContent")
setRequestContext(readRequest, version, objectType, schemaName)
getResult(ApiId.READ_PRIVATE_COLLECTION, contentActor, readRequest, version = apiVersion)
}
def update(identifier: String) = Action.async { implicit request =>
val headers = commonHeaders()
val body = requestBody()
......
......@@ -57,6 +57,16 @@ class ContentController @Inject()(@Named(ActorNames.CONTENT_ACTOR) contentActor:
getResult(ApiId.READ_CONTENT, contentActor, readRequest, version = apiVersion)
}
def privateRead(identifier: String, mode: Option[String], fields: Option[String]) = Action.async { implicit request =>
val headers = commonHeaders()
val content = new java.util.HashMap().asInstanceOf[java.util.Map[String, Object]]
content.putAll(headers)
content.putAll(Map("identifier" -> identifier, "mode" -> mode.getOrElse("read"), "fields" -> fields.getOrElse("")).asJava)
val readRequest = getRequest(content, headers, "readPrivateContent")
setRequestContext(readRequest, version, objectType, schemaName)
getResult(ApiId.READ_PRIVATE_CONTENT, contentActor, readRequest, version = apiVersion)
}
def update(identifier: String) = Action.async { implicit request =>
val headers = commonHeaders()
val body = requestBody()
......
......@@ -8,6 +8,7 @@ object ApiId {
//Content APIs
val CREATE_CONTENT = "api.content.create"
val READ_CONTENT = "api.content.read"
val READ_PRIVATE_CONTENT = "api.content.private.read"
val UPDATE_CONTENT = "api.content.update"
val UPLOAD_CONTENT = "api.content.upload"
val RETIRE_CONTENT = "api.content.retire"
......@@ -61,6 +62,7 @@ object ApiId {
//Collection V4 apis
val CREATE_COLLECTION = "api.collection.create"
val READ_COLLECTION = "api.collection.read"
val READ_PRIVATE_COLLECTION = "api.collection.private.read"
val UPDATE_COLLECTION = "api.collection.update"
val RETIRE_COLLECTION = "api.collection.retire"
val COPY_COLLECTION = "api.collection.copy"
......
......@@ -67,6 +67,7 @@ POST /asset/v4/copy/:identifier controllers.v4.AssetController.
POST /collection/v4/create controllers.v4.CollectionController.create
PATCH /collection/v4/update/:identifier controllers.v4.CollectionController.update(identifier:String)
GET /collection/v4/read/:identifier controllers.v4.CollectionController.read(identifier:String, mode:Option[String], fields:Option[String])
GET /collection/v4/private/read/:identifier controllers.v4.CollectionController.privateRead(identifier:String, mode:Option[String], fields:Option[String])
POST /collection/v4/flag/:identifier controllers.v4.CollectionController.flag(identifier:String)
POST /collection/v4/flag/accept/:identifier controllers.v4.CollectionController.acceptFlag(identifier:String)
DELETE /collection/v4/discard/:identifier controllers.v4.CollectionController.discard(identifier:String)
......@@ -85,6 +86,7 @@ POST /collection/v4/reject/:identifier controllers.v4.CollectionControlle
POST /content/v4/create controllers.v4.ContentController.create
PATCH /content/v4/update/:identifier controllers.v4.ContentController.update(identifier:String)
GET /content/v4/read/:identifier controllers.v4.ContentController.read(identifier:String, mode:Option[String], fields:Option[String])
GET /content/v4/private/read/:identifier controllers.v4.ContentController.privateRead(identifier:String, mode:Option[String], fields:Option[String])
POST /content/v4/upload/url/:identifier controllers.v4.ContentController.uploadPreSigned(identifier:String, type: Option[String])
POST /content/v4/upload/:identifier controllers.v4.ContentController.upload(identifier:String, fileFormat: Option[String], validation: Option[String])
POST /content/v4/copy/:identifier controllers.v4.ContentController.copy(identifier:String, mode:Option[String], type:String ?= "deep")
......
......@@ -37,6 +37,13 @@ class CollectionSpec extends BaseSpec {
status(result) must equalTo(OK)
}
"return success response for private read API" in {
val controller = app.injector.instanceOf[controllers.v4.CollectionController]
val result = controller.privateRead("do_123", None, None)(FakeRequest())
isOK(result)
status(result) must equalTo(OK)
}
"return success response for hierarchy add API" in {
val controller = app.injector.instanceOf[controllers.v4.CollectionController]
val result = controller.addHierarchy()(FakeRequest())
......
......@@ -39,6 +39,13 @@ class ContentSpec extends BaseSpec {
status(result) must equalTo(OK)
}
"return success response for private read API" in {
val controller = app.injector.instanceOf[controllers.v4.ContentController]
val result = controller.privateRead("do_123", None, None)(FakeRequest())
isOK(result)
status(result) must equalTo(OK)
}
"return success response for flag API" in {
val controller = app.injector.instanceOf[controllers.v4.ContentController]
val result = controller.flag("do_123")(FakeRequest())
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment