Commit b8da56d9 authored by rheafernandes's avatar rheafernandes
Browse files

Added changes to support multiple frameworks

parent cca29501
schema-updates 3.9.0-prod-fix 4.1.0_fixes AmiableAnil-patch-1 Gcloud_copy Gcloud_fix Remove_unwantedCode_Gcloud_fix actors-test bulk-upload-comptenecy-mapping bulk-upload-excelsheet bulk-upload-test_excel bulk_upload code-cleanup 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-fix local-setup-kube m-4.2.0 master master-data org-target-enhancement patch-1 patch-2 patch-3 poc_bulk_upload qs-schema rahul_bulk_upload_postgres release-3.5.0 release-3.6.0 release-3.6.0.1 release-3.7.0 release-3.8.0 release-3.9.0 release-4.0.0 release-4.1.0 release-4.10.0 release-4.10.1 release-4.2.0 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 review-4.1.0 s-debug schema-update-4.0 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 release-4.3.0_RC1 release-4.2.0_RC13 release-4.2.0_RC12 release-4.2.0_RC11 release-4.2.0_RC10 release-4.2.0_RC9 release-4.2.0_RC8 release-4.2.0_RC7 release-4.2.0_RC6 release-4.2.0_RC5 release-4.2.0_RC4 release-4.2.0_RC3 release-4.2.0_RC2 release-4.2.0_RC1 release-4.1.0_RC13 release-4.1.0_RC12 release-4.1.0_RC11 release-4.1.0_RC10 release-4.1.0_RC9 release-4.1.0_RC8 release-4.1.0_RC7 release-4.1.0_RC6 release-4.1.0_RC5 release-4.1.0_RC4 release-4.1.0_RC3 release-4.1.0_RC2 release-4.1.0_RC1 release-4.0.0_RC9 release-4.0.0_RC8 release-4.0.0_RC7 release-4.0.0_RC6 release-4.0.0_RC5 release-4.0.0_RC4 release-4.0.0_RC3 release-4.0.0_RC2 release-4.0.0_RC1 release-3.9.0_RC12 release-3.9.0_RC11 release-3.9.0_RC10 release-3.9.0_RC9 release-3.9.0_RC8 release-3.9.0_RC7 release-3.9.0_RC6 release-3.9.0_RC5 release-3.9.0_RC4 release-3.9.0_RC3 release-3.9.0_RC2 release-3.9.0_RC1 release-3.8.0_RC9 release-3.8.0_RC8 release-3.8.0_RC7 release-3.8.0_RC6 release-3.8.0_RC5 release-3.8.0_RC4 release-3.8.0_RC3 release-3.8.0_RC2 release-3.8.0_RC1 release-3.7.0_RC1 release-3.6.0_RC5 release-3.6.0_RC4 release-3.6.0_RC3 release-3.6.0_RC2 release-3.6.0_RC1 release-3.5.0 release-3.5.0_RC2 release-3.5.0_RC1
No related merge requests found
Showing with 64 additions and 5 deletions
+64 -5
......@@ -4,19 +4,21 @@ import java.util
import java.util.concurrent.CompletionException
import java.io.File
import com.mashape.unirest.http.{HttpResponse, Unirest}
import org.apache.commons.io.FilenameUtils
import javax.inject.Inject
import org.apache.commons.collections4.CollectionUtils
import org.apache.commons.lang3.StringUtils
import org.sunbird.actor.core.BaseActor
import org.sunbird.cache.impl.RedisCache
import org.sunbird.content.util.{AcceptFlagManager, CopyManager, DiscardManager, FlagManager, RetireManager}
import org.sunbird.cloudstore.StorageService
import org.sunbird.common.{ContentParams, Platform, Slug}
import org.sunbird.common.{ContentParams, JsonUtils, Platform, Slug}
import org.sunbird.common.dto.{Request, Response, ResponseHandler}
import org.sunbird.common.exception.ClientException
import org.sunbird.common.exception.{ClientException, ServerException}
import org.sunbird.content.dial.DIALManager
import org.sunbird.content.mgr.ImportManager
import org.sunbird.util.RequestUtil
import org.sunbird.util.{ChannelConstants, RequestUtil}
import org.sunbird.content.upload.mgr.UploadManager
import org.sunbird.graph.OntologyEngineContext
import org.sunbird.graph.dac.model.Node
......@@ -24,12 +26,16 @@ import org.sunbird.graph.nodes.DataNode
import org.sunbird.graph.utils.NodeUtil
import scala.collection.JavaConverters
import scala.collection.JavaConverters._
import scala.concurrent.{ExecutionContext, Future}
class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageService) extends BaseActor {
implicit val ec: ExecutionContext = getContext().dispatcher
val ORGANISATIONAL_FRAMEWORK_TERMS = List("organisationBoardIds", "organisationGradeLevelIds", "organisationSubjectIds", "organisationMediumIds", "organisationTopicsIds")
val TARGET_FRAMEWORK_TERMS = List("targetFrameworkIds", "targetBoardIds", "targetGradeLevelIds", "targetSubjectIds", "targetMediumIds", "targetTopicIds")
override def onReceive(request: Request): Future[Response] = {
request.getOperation match {
case "createContent" => create(request)
......@@ -144,6 +150,7 @@ class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageSe
def importContent(request: Request): Future[Response] = ImportManager.importContent(request)
def populateDefaultersForCreation(request: Request) = {
validateAndSetMultiFrameworks(request)
setDefaultsBasedOnMimeType(request, ContentParams.create.name)
setDefaultLicense(request)
}
......@@ -158,6 +165,7 @@ class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageSe
}
def populateDefaultersForUpdation(request: Request) = {
validateAndSetMultiFrameworks(request)
if (request.getRequest.containsKey(ContentParams.body.name)) request.put(ContentParams.artifactUrl.name, null)
}
......@@ -197,4 +205,54 @@ class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageSe
node
}
private def validateAndSetMultiFrameworks(request: Request): Unit = {
val orgTermIds: List[String] = request.getRequest.asScala
.filter(entry => ORGANISATIONAL_FRAMEWORK_TERMS.contains(entry._1))
.flatMap(entry => entry._2 match {
case e: String => List(e)
case e: util.List[String] => e.asScala
}).toList
val orgTermMap = getValidatedTerms(orgTermIds)
if (StringUtils.isNotBlank(request.get("organisationFrameworkId").asInstanceOf[String]))
request.getRequest.putIfAbsent("framework", request.get("organisationFrameworkId").asInstanceOf[String])
val boardIds = request.getRequest.getOrDefault("organisationBoardIds", new util.ArrayList[String]()).asInstanceOf[util.List[String]]
if (CollectionUtils.isNotEmpty(boardIds))
request.getRequest.putIfAbsent("board", orgTermMap(boardIds.get(0)).asInstanceOf[String])
val mediumIds = request.getRequest.getOrDefault("organisationMediumIds", new util.ArrayList[String]()).asInstanceOf[util.List[String]]
if (CollectionUtils.isNotEmpty(mediumIds))
request.getRequest.putIfAbsent("medium", mediumIds.asScala.map(id => orgTermMap(id)).toList.asJava)
val subjectIds = request.getRequest.getOrDefault("organisationSubjectIds", new util.ArrayList[String]()).asInstanceOf[util.List[String]]
if (CollectionUtils.isNotEmpty(subjectIds))
request.getRequest.putIfAbsent("subject", subjectIds.asScala.map(id => orgTermMap(id)).toList.asJava)
val gradeIds = request.getRequest.getOrDefault("organisationGradeLevelIds", new util.ArrayList[String]()).asInstanceOf[util.List[String]]
if (CollectionUtils.isNotEmpty(gradeIds))
request.getRequest.putIfAbsent("gradeLevel", gradeIds.asScala.map(id => orgTermMap(id)).toList.asJava)
val topicIds = request.getRequest.getOrDefault("organisationTopicsIds", new util.ArrayList[String]()).asInstanceOf[util.List[String]]
if (CollectionUtils.isNotEmpty(topicIds))
request.getRequest.putIfAbsent("topics", topicIds.asScala.map(id => orgTermMap(id)).toList.asJava)
val targetTermIds: List[String] = request.getRequest.asScala
.filter(entry => TARGET_FRAMEWORK_TERMS.contains(entry._1))
.flatMap(_._2.asInstanceOf[util.List[String]].asScala).toList
getValidatedTerms(targetTermIds)
}
private def getValidatedTerms(termIds: List[String]): Map[String, AnyRef] = {
if(termIds.nonEmpty) {
val url: String = if (Platform.config.hasPath("composite.search.url")) Platform.config.getString("composite.search.url") else "https://dev.sunbirded.org/action/composite/v3/search"
val httpResponse: HttpResponse[String] = Unirest.post(url).header("Content-Type", "application/json")
.body(s"""{"request":{"filters":{"objectType":"Term", "identifier": ${termIds.mkString("[\"", "\", \"", "\"]")
}},"fields":["name"]}}""").asString
if (200 != httpResponse.getStatus)
throw new ServerException("ERR_CONTENT_CREATE", "Error while fetching Framework Terms data.")
val response: Response = JsonUtils.deserialize(httpResponse.getBody, classOf[Response])
val termList: util.List[util.Map[String, AnyRef]] = response.getResult.getOrDefault("Term", new util.ArrayList[util.Map[String, AnyRef]]).asInstanceOf[util.ArrayList[util.Map[String, AnyRef]]]
if (termList.isEmpty)
throw new ClientException("ERR_CONTENT_CREATE", s"Term ids are not found for list: $termIds ")
val termMap = termList.asScala.map(entry => entry.getOrDefault("identifier", "").asInstanceOf[String] -> entry.getOrDefault("name", "")).toMap
val invalidTermIds = CollectionUtils.disjunction(termIds.asJava, termMap.keys.asJava)
if(CollectionUtils.isNotEmpty(invalidTermIds))
throw new ClientException("ERR_CONTENT_CREATE", s"Term ids are not found for list: $invalidTermIds ")
termMap
} else Map()
}
}
......@@ -31,7 +31,8 @@ class TestContentActor extends BaseSpec with MockFactory {
implicit val ss = mock[StorageService]
implicit val oec: OntologyEngineContext = mock[OntologyEngineContext]
val request = getContentRequest()
val content = mapAsJavaMap(Map("name" -> "New Content", "code" -> "1234", "mimeType"-> "application/pdf", "contentType" -> "Resource"))
val content = mapAsJavaMap(Map("name" -> "New Content", "code" -> "1234", "mimeType"-> "application/pdf", "contentType" -> "Resource",
"organisationFrameworkId" -> "NCF", "organisationBoardIds" -> new util.ArrayList[String](){{add("ncf_board_cbse")}}))
request.put("content", content)
assert(true)
val response = callActor(request, Props(new ContentActor()))
......@@ -280,7 +281,7 @@ class TestContentActor extends BaseSpec with MockFactory {
implicit val ss = mock[StorageService]
val request = getContentRequest()
request.getContext.put("identifier","do1234")
request.putAll(mapAsJavaMap(Map("description" -> "updated description")))
request.putAll(mapAsJavaMap(Map("description" -> "updated description","organisationFrameworkId" -> "NCF", "organisationBoardIds" -> new util.ArrayList[String](){{add("ncf_board_cbse")}})))
request.setOperation("updateContent")
val response = callActor(request, Props(new ContentActor()))
assert("failed".equals(response.getParams.getStatus))
......
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