...
Introduction
This wiki explains the design and implementation of bulk upload of questions.
Jira issue: https://project-sunbird.atlassian.net/browse/SB-23374
Problem
...
Statement:
How to upload bulk questions using CSV?
How to pass additional details to the API such as createdBy, Question Categories, Channel, etc… ?
How to upload bulk questions using CSV?Approach 1 Design Enable Bulk question creation.
Enable Bulk question creation and link them to sections(Units).
Enable Bulk question creation with common metadata ex: questionType, channel, createdBy, status, licence and BGMS.
Solution 1:
Create a generate QuML API for various interaction types such that it takes required parameters as input and generates a QuML output. The API takes input as a CSV file and Question Category (For example MCQ, Subjective, etc.)JSON body. This API is responsible for validating and creating questions on the platform.
The endpoint for bulk upload of Question is
/question/v1/bulkupload
Mandatory fields cannot be null or empty.
If the server doesn't support the media type, it should return HTTP status code 415 (Unsupported Media Type).
HEADER PARAMETERS:
Content-Type (*required) |
Media types can be:-
|
X-Channel-ID (*required) |
It the Unique Id to identify the root organization to which the user belongs |
REQUEST BODY: multipart/form-data
file (*required) |
This is a .csv file. Each line of the file is a data record, separated by commas |
Here is an example of a POST request that includes multipart/form-data:
Code Block |
---|
curl --location --request POST '<HOST_URL>/question/v1 |
...
/bulkupload' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'X-Channel-ID: sunbird' \
--form 'File=@"/qumlTest.csv"' |
REQUEST BODY: application/JSON:
fileUrl (*required) |
|
Additional Properties (Optional) | createdBy, questionType, author, stage OR status |
Here is an example of a POST request that includes JSON data:
Code Block |
---|
curl --location --request POST '<HOST_URL>/question/v1/bulkupload' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'X-Channel-ID: sunbird' \
--header 'Content-Type: application/json' \
--data-raw '{
"request" : {
"fileUrl": "https://dockstaging.blob.com/do_123/test.csv",
"questionType": "MCQ",
"createdBy": "ae94b68c-a535-4dce-8e7a-fb9662b0ad68",
"author": "SCERT Haryana",
"status": "Live"
}
}' |
Response Samples:
Code Block | ||
---|---|---|
| ||
{
"id": "api.v1.bulkupload",
"ver": "1.0",
"ts": "2021-10-20T09:20:59.943Z",
"params": {
"resmsgid": "09faf370-3187-11ec-b57e-5ffde477525a",
"msgid": "095a6db0-3187-11ec-b57e-5ffde477525a",
"status": "successful",
"err": null,
"errmsg": null
},
"responseCode": "OK",
"result": {
"processId": "112ed159-c805-4df5-9da3-3fcd73122cc2",
}
} |
Scenario | API |
---|---|
Bulk upload Questions only |
|
Bulk upload Questions and link them to QuestionSet |
|
Bulk upload Questions and link them to section under QuestionSet |
|
Bulk upload Questions with common metadata |
|
Solution 2:
Create a generate QuML API for various interaction types such that it takes required parameters as input and generates a QuML output. The API takes input as an array of questions.
The endpoint for bulk upload of Question is
/question/v1/bulkupload
Mandatory fields cannot be null or empty.
HEADER PARAMETERS:
Content-Type (*required) |
The possible media types can be:-
|
X-Channel-ID (*required) |
It the Unique Id to identify the root organization to which the user belongs |
REQUEST BODY SCHEMA: application/JSON:
JSON The body is the representation of the resource object for creating questions, which is an array of parameters that describes the question.
Code Block |
---|
{
"request": {
"question": [
{
"metadata": {
"framework": "ekstep_ncert_k-12",
"channel": "01309282781705830427",
"name": "TestQuestion",
"code": "9ae33d1e-a682-f30c-04b5-9bda236650ac",
"mimeType": "application/vnd.sunbird.question",
"primaryCategory": "Multiple Choice Question",
},
"collection": [
{
"identifier": "do_11324642736155033614",
"unitId": "do_11324642761348710417"
}
],
"stage": "Review"
}
]
}
} |
Response Samples:
Code Block | ||
---|---|---|
| ||
{
"id": "api.v1.bulkupload",
"ver": "1.0",
"ts": "2021-10-20T09:20:59.943Z",
"params": {
"resmsgid": "09faf370-3187-11ec-b57e-5ffde477525a",
"msgid": "095a6db0-3187-11ec-b57e-5ffde477525a",
"status": "successful",
"err": null,
"errmsg": null
},
"responseCode": "OK",
"result": {
"processId": "112ed159-c805-4df5-9da3-3fcd73122cc2",
}
} |
Conclusion:
<TODO>