Tincan is a json store of activities that one has performed in an LMS. The LMS can be a web or mobile or desktop app. http://tincanapi.com/
Tincan uses json format to store data http://en.wikipedia.org/wiki/JSON , http://www.json.org/
1. Tincan runs as an application on it's own.
2. Any LMS (like Expertus one) has to register as a client application through the web page provided by Tincan app. LMS is approved by the admin of tincan app. Once it is approved, LMS needs to follow Oauth(2.0) to authenticate itself and start using the API.
3. In case of multi tenent applications each company/site can register itself as an app in tincan so that data is kept seperated. This is needed because tincan assumes an actor (LMS user) is unique and is identified by email in our case. In case more than one site in the multi tenant LMS has the same user, this helps to differentiate his actions on each site.
4. LMS is provided with the oauth access token using which it can store records in LRS through the REST API.
5. The record is stored in raw format. Each record is called a statement.
6. The following things are separated from the record.
7. The LMS can query the statements, using the search API provided by app.
8. The LMS can get the info of agents, verbs and etc. using their APIs.
With the implementation of above algorithm we can provide a simple search interface as shown. The rest API implemented will be based upon https://cloud.scorm.com/sc/user/LRSView so that it could be queried from any querying agent that can query an LRS.
Record.tinsearch(actor_identifier, verb_identifier, object_identifier, start_time, end_time, search_term)
The above interface will help build almost any query for the purpose of report generation or for other purposes. External applications can use the LRS service via a REST interface explained here https://wiki.exphosted.com/doku.php/tincan_api_rest
We provide a REStful api as explained here https://wiki.exphosted.com/doku.php/tincan_api_rest
The following verbs will be supported: http://adlnet.gov/expapi/verbs/
The following gems are used to build this app
json dump: A column that contains the json dump of data app id: An id that relates which app has put in the data This table will be modeled in Rails app along with an REST API that will help any application put in data into the LRS.
The following validations should be done on JSON record
An example Tincan statement
Suggestion: Why can’t we allow people to put their own regexp for an app to validate a statement being inserted?
Table Name: users
| Column Name | Type | Description |
|---|---|---|
| id | Integer | For internal Rails purpose |
| String | email of the login | |
| hashed_password | String | SHA2 / SHA1 hash of the password |
| recovery_token | String | Password recovery token |
| token_expires_at | DateTime | Time at which token expires |
| created_at | DateTime | For internal Rails purpose |
| updated_at | DateTime | For internal Rails purpose |
Table Name: client_applications
| Column Name | Type | Description |
|---|---|---|
| id | Integer | For internal Rails purpose |
| name | String | Name of the application |
| key | String | Key for the app to be used in authentication |
| user_id | Integer | Identifies to which user the app belongs |
| created_at | DateTime | For internal Rails purpose |
| updated_at | DateTime | For internal Rails purpose |
Table Name: statements
| Column Name | Type | Description | Example Content |
|---|---|---|---|
| id | Integer | For internal Rails purpose | |
| guid | String | This is the id of statement in Tincan statement (must be unique) | |
| client_application_id | Integer | Id of application to which the statement belongs | |
| content | Text | Json content that's stored | Please checkout this link |
| tracked_at | DateTime | Time at which record was created (this is extracted from json) | |
| verb_id | Integer | The id in the Verb model is mapped here and indexed | |
| actor_id | Integer | The id in the actor model is mapped here and indexed | |
| tincan_object_id | Integer | id of object Polymorphed between Actor, Activity and Statement (by default its activity) | |
| tincan_object_type | Integer | The type of Polymorphed tincan_object is mapped here | |
| created_at | DateTime | For internal Rails purpose | |
| updated_at | DateTime | For internal Rails purpose |
Table Name: actors
| Name | Type | Description |
|---|---|---|
| id | Integer | For internal Rails purpose se |
| type | String | Describing what the agent is - (Agent/Group) - By default its agent |
| identifier | String | mbox / mboxsha/ openid |
| identifier_type | Integer | The identifier type (0-mbox, 1-mbox hash, 2-openid) |
| content | Text | The content dump of the actor |
| created_at | DateTime | For internal Rails purpose |
| updated_at | DateTime | For internal Rails purpose |
Table Name: verbs
| Name | Type | Description | Example Content |
|---|---|---|---|
| id | Integer | For internal Rails purpose | |
| spec_id | String | id of the verb extracted from the Record | |
| content | Text | The raw text content of the verb that was last pushed | { “id”: “http://adlnet.gov/expapi/verbs/experienced”, “display”: {“en-US”: “experienced”} } |
| created_at | DateTime | For internal Rails purpose | |
| updated_at | DateTime | For internal Rails purpose |
Table Name: activities
| Column Name | Type | Description | Example Content |
|---|---|---|---|
| id | Integer | For internal Rails purpose | |
| spec_id | String | The id of activity present in the Tincan statement | |
| content | Text | The raw text content of the activity object that was last pushed | { “id”: “http://example.com/activities/solo-hang-gliding”, “definition”: {“name”: { “en-US”: “Solo Hang Gliding” }} |
| created_at | DateTime | For internal Rails purpose | |
| updated_at | DateTime | For internal Rails purpose |
Table Name: results
| Name | Type | Description |
|---|---|---|
| id | Integer | For internal Rails purpose |
| statement_id | Integer | Links the Statement model to the result |
| success | boolean | Says weather the person has succeeded in the activity |
| completion | boolean | Says weather the person has completed the activity |
| response | String | The response / or remarks for this result |
| duration | Decimal | Duration in seconds |
| created_at | DateTime | For internal Rails purpose |
| updated_at | DateTime | For internal Rails purpose |
Table Name: scores
| Column Name | Type | Description |
|---|---|---|
| id | Integer | Unique identifier in the DB |
| result_id | Integer | Links the result model to the score |
| raw | Decimal | The score the student has obtained |
| min | Decimal | The minimum test score |
| max | Decimal | The maximum score that can be obtained |
| created_at | DateTime | For internal Rails purpose |
| updated_at | DateTime | For internal Rails purpose |
Fetching records is an important issue. So searching of some sort must be provided. These are the methoods that could be followed
A sample client will be built that demos how to consume the REST APIs.
Example - https://github.com/adlnet/experienceapi_client_examples/tree/master/1.0
Will also explore API gee to test API end points.
1) Converting scorm to tin can statements - http://tincanapi.co.uk/pages/SCORM_to_Tin_Can_API.html
2) Authoring tools that support tincan api.
3) How LMSs can launch tincan activities ?
This is specific to the LMS's player. They can launch in any possible way and track the statemtents. In general, to play articulate and capitivate content, some examples and code is available and can be found at http://tincanapi.co.uk/ under the section “Code and samples”
Following are the list of enhacnements planned for the expertus tincan LRS.
1) Client app login and Reporting -
Allow each client app to login from the UI to view their statements reports. Some of the initial set of reports could be like below.
2) Tincan LRS Connectors/Launchers -
Some libraries should be provided to the client apps to be able to easily send statemtents to tincan LRS. Initially these connectors support Drupal, google course builder and learnexa app(or any rails app).
References -
Drupal -
https://drupal.org/node/1829346
https://github.com/phkemper/xapi
Google course builder -
https://code.google.com/r/fugu13-tincan-course-builder/
3) Refreshed UI -
UI of the tincan LRS app needs to be redesigned.