Design for easy way to update content
Problem Statement
Currently to update the content implementation team needs to make multiple calls, which makes it a difficult process. Additionally there is no auditing in place to track as content was updated by whom. There should be an easier way to update the content.
SB-10220 - Getting issue details... STATUS
Solution Approach
Solution approach to overcome the problem has below approaches
APPROACH 1
- Sunbird Platform will expose an API for end user to initiate update content
- Sunbird Platform will log the request in DB and pass the user a generated process Id
- Sunbird Platform will send the request with processId to kafka message queue
- Request will be picked up by Learning platform and would start the processing of update content based on the request
- Sunbird Platform will use a listener to get the status update and store in DB from the kafka based on processId
Approach 2
- Sunbird Platform will expose an API for end user to initiate update content
- Sunbird Platform will internally call Content Service with the request provided by User.
- Content Service will initiate the update process through kafka pipeline and will return unique process ID identifying the process.
- For valid response from Content Service, processId with other details will be saved in Sunbird platform DB
- On user call to get status, Sunbird Platform will call Content Service.
pros and cons of both approaches
| approaches | pros | cons |
|---|---|---|
1.without content service | loosely coupled | |
| 2.with content service | dependent on content service, duplicate storage of statuses and processes by Content Service and Sunbird platform |
Problem Statement
What is the API for update content?
Solution approach
URL:
POST /v1/job/start
Headers:
Authorization
X-authenticated-user-token
Request Params:
| name | type | description |
|---|---|---|
| scriptName | String | name of the script to be run by Content Service |
| version | String | the version of the script |
| attributes | Array | attributes to be updated, will work as arguments to the script |
Response Params:
| name | type | description |
|---|---|---|
| processId | String | unique identifier of the process started for the request, needed to get the status of the process |
Errors:
| status code | error code | error message |
|---|---|---|
| 400 | MANDATORY_PARAMETER_MISSING | Mandatory parameter {script,version} is missing. |
Sample Request and Response:
Request
{
request : {
"scriptName" : "course_rename",
"version" : "1.2",
"attributes" : [{
"field" : "name"
"oldValue" : "AB",
"newValue" : "ab"
},{
"field" : "orgDetails"
"oldValue" : {
"courseName" : "AB"
},
"newValue" : {
"courseName" : "ab"
}
}]
}
}
Response
{
"id": "api.job",
"result": {
"processId" : "01262366359399628812"
}
}
Problem Statement
How we store the process information in DB
Solution approach
content_update_process table structure should be as below
| column | type | description | Index |
|---|---|---|---|
| id | text | holds process id | PRIMARY |
| scriptName | text | name of the script to run | |
| version | text | the version of the script | |
| request | text | holds the input request as it is | |
| status | text | the status last received from content service | |
| message | text | message from content service in case of failure | |
| createdBy | text | userId of one who invoked the process | SECONDARY |
| createdAt | timestamp | when the process was started | |
| updatedAt | timestamp | when the process was last updated |
Problem Statement
What is the API for getting the process status
Solution approach
URL:job
GET /v1/job/status/{processId}
Headers:
Authorization
X-authenticated-user-token
Request Params:
None
Response Params:
| name | type | description |
|---|---|---|
| status | text | status as COMPLETED or FAILURE |
| message | text | contains error messages in case of failure |
Errors:
| status code | error code | error message |
|---|---|---|
| 400 | INVALID_PROCESS_ID | Invalid Process Id |
Sample Request and Response:
Request
GET /v1/job/status/01262366359399628812
Response
{
"id": "api.job.status",
"result": {
"status" : "FAILURE",
"message" : "Operation to update failed"
}
}
Problem Statement
What is the API for get all the processes by a user
Solution approach
URL:
GET /v1/job/list
Headers:
Authorization
X-authenticated-user-token
Request Params:
None
Response Params:
returns an array of processes related to user
| name | type | description |
|---|---|---|
| processId | text | the process id |
| script | text | the script for which process exists |
| version | text | version of the script |
Errors:
None
Sample Request and Response:
Request
GET /v1/job/processes
Response
{
"id": "api.job.processes",
"result": {
processes : [{
"processId" : "01262366359399628812",
"script" : "course_rename",
"version" : "1.2"
}]
}
}
Deprecated SOLUTION APPROACH
Solution approach is divided into multiple part
There should be generated key to facilitate the process of update of content in a channel by anyone who has the key, hence bypassing the user authentication process . The details of the master key generation design and approach are here (Master Key APIs).Auditing of the update of the content by keys.