Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Introduction

This wiki explain explains the current design and implementation of progress and score monitoring of content and collections. The , the challenges we have at scale and the proposed design to handle them.

...

The sunbird platform supports monitoring of collection progress and score monitoringcomputation. It uses the below APIs to capture the content progress data, generates progress and score metrics and provide the summary.

...

With Viewer-Service, we will support progress monitoring at individual content level as well (i.e.: all types of content can be monitored for progress). Below details explain how the data will be stored for a content consumption in different scenarios.

...

Action

Progress in Context

Rahul opens the “single-digit-addition” content after going into the course “class-1-maths” when batch-1 is active

Complete

Rahul opens the “single-digit-addition” content after searching for it

Not Started

batch-1 has expired and Rahul has rejoined batch-2 and opened the content “single-digit-addition”

Not Started

Inverse: Rahul completes the “single-digit-addition” content after searching for it organically. Later, Rahul opens the same content via the ToC of the course “class-1-maths“

Not Started

Rahul opens the “double-digit-addition” content after going into the course “class-1-maths” when batch-1 is active

Not Started

Rahul opens the “double-digit-addition” content after searching for it

Complete

...

  1. There might be cases where a program is launched with a course which the user is already part of or completed. The user needs to redo the entire course again (consumption outside of Context will not be considered towards the specific Context)

  2. User experience will be complex if the user sees two courses (one within a program and another outside of the program). The user might complete the course assuming it is part of program and would probably realise that he hasn’t taken it in the context of the program

  3. There would be multiple steps required by user to reach a content within the context of a program. Will make the discovery and browsing experience complex. (may not always be possible to ensure that users ‘discover’ relevant content in the context they are supposed to)

...

  • Every new instance adapting the sunbird platform will have to select one of the option from 3 context modes, this would allow the application to mange manage the user in avoiding the consumption of content more than once based of specific predefined rules

  • Mode for any instance will be one to one mapping

  • With the extended design, progress and score monitoring of the user consumption can be done for any new context like program, event etc

...

Scenario

Write Request

Read Request

1

Carry Forward Consumption

  • The content consumed is marked as complete irrespective of context

Code Block
languagejs
{
    "userid": "<<userid>>"
    "collectionid" : "<<courseid>>",
    "contentid" :"<<contenid>>"
}

Note: Progress will be captured directly under the context

Code Block
languagejson
{
  "userIduserid": "<<userid>>",
  "collectionIdcollectionid": "<<courseid>>",
  "contentIdcontentid": "<<contentid>>"
}

2

Copy Forward Consumption

  • The content consumed is marked as complete along with new entry in the database for the context

Code Block
languagejs
{
    "userid": "<<userid>>",
    "collectionid": "<<courseid>>",
    "contextid": "<<programid>>",
    "contentid": "<<contentid>>"
}

Code Block
languagejson
{
  "userIduserid": "<<userid>>",
  "collectionIdcollectionid": "<<courseid>>",
  "contentIdcontentid": "<<contentid>>"
}

3

Strict Mode Consumption

  • The content will be consumed as new one every time

Code Block
languagejs
{
    "userid": "<<userid>>",
    "collectionid": "<<courseid>>",
    "contextid": "<<programid>>",
    "contentid": "<<contenid>>"
}

...

For view start, end and update, courseId collectionId and batchId contextId are non-mandatory. This would enable to monitor the progress for any content which is not part of a coursecollection.
This is handled in two ways:

  • If, collectionId and batchId contextId are part of the request, then, individual content progress and overall collection progress is captured and computed.

...

Expand
titleGET - /v1/summary/list/:userId

Response:

Code Block
languagejson
{
  "id": "api.summary.list",
  "ver": "v1",
  "ts": "2021-06-23 05:59:54:984+0000",
  "params": {
    "resmsgid": null,
    "msgid": "95e4942d-cbe8-477d-aebd-ad8e6de4bfc8",
    "err": null,
    "status": "success",
    "errmsg": null
  },
  "responseCode": "OK",
  "result": {
    "summary": [
      {
        "userId": "{{userId}}",
        "collectionId": "{{collectionId}}",
        "batchIdcontextId": "{{batchId}}",
        "enrolledDate": 1624275377301,
        "active": true,
        "contentStatus": {
          "{{contentId}}": {{status}}
        },
        "assessmentStatus": {
          "assessmentId": {
            "score": {{best_score}},
            "max_score": {{max_score}}
          }
        },
        "collection": {
          "identifier": "{{collectionId}}",
          "name": "{{collectionName}}",
          "logo": "{{logo Url}}",
          "leafNodesCount": {{leafNodeCount}},
          "description": "{{description}}"
        },
        "issuedCertificates": [{
          "name": "{{certName}}",
          "id": "certificateId",
          "token": "{{certToken}}",
          "lastIssuedOn": "{{lastIssuedOn}}"
        }],
        "completedOn": {{completion_date}},
        "progress": {{progress}},
        "status": {{status}}
      }
    ]
  }
}

...

Expand
titleDELETE - /v1/summary/delete/:userId - To Delete specific enrolments

Request:

Code Block
{
    "request": {
        "userId": "{{userId}}",
        "collectionId" : "{{collectionId}}",
        "batchIdcontextId": "{{batchId}}"
    }
}

Response:

Code Block
languagejson
Response: 
{
    "id": "api.summary.delete",
    "ver": "v1",
    "ts": "2021-06-23 05:37:40:575+0000",
    "params": {
        "resmsgid": null,
        "msgid": "5e763bc2-b072-440d-916e-da787881b1b9",
        "err": null,
        "status": "success",
        "errmsg": null
    },
    "responseCode": "OK",
    "result": {}
}

...