diff --git a/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionActor.scala b/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionActor.scala index 8f429f13aed9e6103f4b4bb587cecd8155056367..3f0ed87fcb1437c297a0ffddc7aa44b1fc3d7849 100644 --- a/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionActor.scala +++ b/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionActor.scala @@ -85,7 +85,8 @@ class QuestionActor @Inject()(implicit oec: OntologyEngineContext) extends BaseA val propsToRemove = Platform.getStringList("import.remove_props.question", java.util.Arrays.asList()).asScala.toList val topicName = Platform.config.getString("import.output_topic_name") val reqLimit = Platform.getInteger("import.request_size_limit", 200) - ImportConfig(topicName, reqLimit, requiredProps, validStages, propsToRemove) + val validSourceStatus = Platform.getStringList("import.valid_source_status", java.util.Arrays.asList("Live", "Unlisted")).asScala.toList + ImportConfig(topicName, reqLimit, requiredProps, validStages, propsToRemove, validSourceStatus) } def systemUpdate(request: Request): Future[Response] = { diff --git a/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionSetActor.scala b/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionSetActor.scala index f5b5742d91f31af26f23b1de5bf1f0aed548313c..7ce6838699a399dfecca23c406ec9edf61e2419c 100644 --- a/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionSetActor.scala +++ b/assessment-api/assessment-actors/src/main/scala/org/sunbird/actors/QuestionSetActor.scala @@ -135,7 +135,8 @@ class QuestionSetActor @Inject()(implicit oec: OntologyEngineContext) extends Ba val propsToRemove = Platform.getStringList("import.remove_props.questionset", java.util.Arrays.asList()).asScala.toList val topicName = Platform.config.getString("import.output_topic_name") val reqLimit = Platform.getInteger("import.request_size_limit", 200) - ImportConfig(topicName, reqLimit, requiredProps, validStages, propsToRemove) + val validSourceStatus = Platform.getStringList("import.valid_source_status", java.util.Arrays.asList("Live", "Unlisted")).asScala.toList + ImportConfig(topicName, reqLimit, requiredProps, validStages, propsToRemove, validSourceStatus) } def systemUpdate(request: Request): Future[Response] = { diff --git a/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionActorTest.scala b/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionActorTest.scala index 3adc821102999e3c2c43922061045cc22d7264b7..67c2f62af48c56155a04dd470a6268eb8d100a13 100644 --- a/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionActorTest.scala +++ b/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionActorTest.scala @@ -214,13 +214,14 @@ class QuestionActorTest extends BaseSpec with MockFactory { resp.put("question", new util.HashMap[String, AnyRef](){{ put("framework", "NCF") put("channel", "test") + put("status", "Live") }}) (hUtil.get(_: String, _: String, _: util.Map[String, String])).expects(*, *, *).returns(resp) (oec.kafkaClient _).expects().returns(kfClient) (kfClient.send(_: String, _: String)).expects(*, *).returns(None) val request = getQuestionRequest() request.getRequest.put("question", new util.HashMap[String, AnyRef](){{ - put("source", "https://dock.sunbirded.org/api/question/v1/read/do_11307822356267827219477") + put("source", "https://dock.sunbirded.org/api/question/v1/read/do_113486481122729984143") put("metadata", new util.HashMap[String, AnyRef](){{ put("name", "Test Question") put("description", "Test Question") diff --git a/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionSetActorTest.scala b/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionSetActorTest.scala index 74f7d2dad358dbae24867b5f2f9cb12c2df7cf0a..3f94322b8a9b99c18e8ee2fb07a0f14ec3934a05 100644 --- a/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionSetActorTest.scala +++ b/assessment-api/assessment-actors/src/test/scala/org/sunbird/actors/QuestionSetActorTest.scala @@ -427,13 +427,14 @@ class QuestionSetActorTest extends BaseSpec with MockFactory { resp.put("questionset", new util.HashMap[String, AnyRef](){{ put("framework", "NCF") put("channel", "test") + put("status", "Live") }}) (hUtil.get(_: String, _: String, _: util.Map[String, String])).expects(*, *, *).returns(resp) (oec.kafkaClient _).expects().returns(kfClient) (kfClient.send(_: String, _: String)).expects(*, *).returns(None) val request = getQuestionSetRequest() request.getRequest.put("questionset", new util.HashMap[String, AnyRef](){{ - put("source", "https://dock.sunbirded.org/api/questionset/v1/read/do_11307822356267827219477") + put("source", "https://dock.sunbirded.org/api/questionset/v1/read/do_113486480153952256140") put("metadata", new util.HashMap[String, AnyRef](){{ put("name", "Test QuestionSet") put("description", "Test QuestionSet") diff --git a/content-api/content-actors/src/main/scala/org/sunbird/content/actors/ContentActor.scala b/content-api/content-actors/src/main/scala/org/sunbird/content/actors/ContentActor.scala index 3668f1b9b6ebdd6c86d2b4c1fcf682a51818acd2..16ebcc64df2573a74f522be0a50f22de8346f965 100644 --- a/content-api/content-actors/src/main/scala/org/sunbird/content/actors/ContentActor.scala +++ b/content-api/content-actors/src/main/scala/org/sunbird/content/actors/ContentActor.scala @@ -252,7 +252,8 @@ class ContentActor @Inject() (implicit oec: OntologyEngineContext, ss: StorageSe val propsToRemove = Platform.getStringList("import.remove_props", java.util.Arrays.asList("downloadUrl", "variants", "previewUrl", "streamingUrl", "itemSets")).asScala.toList val topicName = Platform.config.getString("import.output_topic_name") val reqLimit = Platform.getInteger("import.request_size_limit", 200) - ImportConfig(topicName, reqLimit, requiredProps, validStages, propsToRemove) + val validSourceStatus = Platform.getStringList("import.valid_source_status", java.util.Arrays.asList()).asScala.toList + ImportConfig(topicName, reqLimit, requiredProps, validStages, propsToRemove, validSourceStatus) } def systemUpdate(request: Request): Future[Response] = { diff --git a/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/ImportManager.scala b/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/ImportManager.scala index a45e8bec62691c091f366d184c2f7bb1d4527a98..561cee2c18dd1d951130eec3c4ed56aaa99e89a1 100644 --- a/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/ImportManager.scala +++ b/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/ImportManager.scala @@ -21,7 +21,7 @@ import scala.collection.mutable import scala.concurrent.{ExecutionContext, Future} -case class ImportConfig(topicName: String, requestLimit: Integer, requiredProps: List[String], validContentStage: List[String], propsToRemove: List[String]) +case class ImportConfig(topicName: String, requestLimit: Integer, requiredProps: List[String], validContentStage: List[String], propsToRemove: List[String], validSourceStatus: List[String]) class ImportManager(config: ImportConfig) { @@ -58,6 +58,8 @@ class ImportManager(config: ImportConfig) { val stage: String = obj.getOrDefault(ImportConstants.STAGE, "").toString val reqMetadata: util.Map[String, AnyRef] = obj.getOrDefault(ImportConstants.METADATA, new util.HashMap[String, AnyRef]()).asInstanceOf[util.Map[String, AnyRef]] val sourceMetadata: util.Map[String, AnyRef] = getMetadata(source, request.getContext.get("objectType").asInstanceOf[String].toLowerCase()) + if(StringUtils.isNotBlank(source) && config.validSourceStatus.nonEmpty && MapUtils.isNotEmpty(sourceMetadata) && !config.validSourceStatus.contains(sourceMetadata.getOrDefault("status", "").asInstanceOf[String])) + throw new ClientException(ImportErrors.ERR_SOURCE_STATUS_VALIDATION, ImportErrors.ERR_SOURCE_STATUS_VALIDATION_MSG + config.validSourceStatus.asJava) val finalMetadata: util.Map[String, AnyRef] = if (MapUtils.isNotEmpty(sourceMetadata)) { sourceMetadata.putAll(reqMetadata) sourceMetadata.put(ImportConstants.SOURCE, source) diff --git a/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/error/ImportErrors.scala b/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/error/ImportErrors.scala index 2308f5617228b5b755c49f34e3728f8054a2459a..237a7f386eee1411eef99c4bb0001ed20e086bb6 100644 --- a/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/error/ImportErrors.scala +++ b/platform-modules/import-manager/src/main/scala/org/sunbird/object/importer/error/ImportErrors.scala @@ -9,6 +9,7 @@ object ImportErrors { val ERR_REQUIRED_PROPS_VALIDATION: String = "ERR_REQUIRED_PROPS_VALIDATION" val BE_JOB_REQUEST_EXCEPTION: String = "BE_JOB_REQUEST_EXCEPTION" val ERR_OBJECT_STAGE_VALIDATION: String = "ERR_OBJECT_STAGE_VALIDATION" + val ERR_SOURCE_STATUS_VALIDATION: String = "ERR_SOURCE_STATUS_VALIDATION" //Error Messages val ERR_INVALID_IMPORT_REQUEST_MSG: String = "Invalid Request! Please Provide Valid Request." @@ -17,4 +18,5 @@ object ImportErrors { val ERR_REQUIRED_PROPS_VALIDATION_MSG: String = "Validation Failed! Mandatory Properties Are " val BE_JOB_REQUEST_EXCEPTION_MSG: String = "Kafka Event Is Not Generated Properly." val ERR_OBJECT_STAGE_VALIDATION_MSG: String = "Object Stage Validation Failed! Valid Object Stages Are " + val ERR_SOURCE_STATUS_VALIDATION_MSG: String = "Source Object Status Not Qualified For Import Operation. Please Provide Valid Source With Status " } diff --git a/platform-modules/import-manager/src/test/scala/org/sunbird/object/importer/ImportManagerTest.scala b/platform-modules/import-manager/src/test/scala/org/sunbird/object/importer/ImportManagerTest.scala index 742962c0320ff53500c7c4e51641b5117c63dad8..8cf27c05b5324600ff30e1fda2603f078898fa06 100644 --- a/platform-modules/import-manager/src/test/scala/org/sunbird/object/importer/ImportManagerTest.scala +++ b/platform-modules/import-manager/src/test/scala/org/sunbird/object/importer/ImportManagerTest.scala @@ -22,7 +22,7 @@ class ImportManagerTest extends AsyncFlatSpec with Matchers with AsyncMockFactor val REQUIRED_PROPS = List("name", "code", "mimeType", "contentType", "artifactUrl", "framework") val VALID_OBJECT_STAGE = List("create", "upload", "review", "publish") val PROPS_TO_REMOVE = List("downloadUrl","variants","previewUrl","streamingUrl","itemSets") - lazy val importConfig = ImportConfig(AUTO_CREATE_TOPIC_NAME, REQUEST_LIMIT, REQUIRED_PROPS, VALID_OBJECT_STAGE, PROPS_TO_REMOVE) + lazy val importConfig = ImportConfig(AUTO_CREATE_TOPIC_NAME, REQUEST_LIMIT, REQUIRED_PROPS, VALID_OBJECT_STAGE, PROPS_TO_REMOVE, List()) lazy val importMgr = new ImportManager(importConfig) "getRequest with list input" should "return request data as list with java types" in {