Groups
Business context:
A logged in user should be able to see groups created by him/her + groups in which s/he is a member
As a logged in user, I should be able to view all my groups, So that I can perform various actions within the group
Acceptance criteria:
Pre-conditions:
Logged in user has clicked the option to view all groups
Verify that:
User is able to view all groups where s/he is admin (group can be created by him/her or assigned to him/her )
User is able to view all groups in which s/he is a member
A group has a special indication if s/he is the Admin of that group (group creator or assigned as admin)
All the groups where s/he is an admin is shown first, followed by groups that s/he is part of
Groups are ordered by creation date - recent to last (within admin & non-admin sections)
User sees an option to create a group
Form Configs Associated:
Master Component List
Following are the list of components required to be re-used across Mobile & Portal :
Please refer to following link for CC
https://github.com/Sunbird-Ed/SunbirdEd-consumption-ngcomponents/
Component | Component Invocation | Component - Type |
---|---|---|
Course |
| Card |
Announcement |
| View Only-Card |
Chat | <sb-chat-room [chatRoomId]={{?}}></sb-chat-room> | Module |
Discussion Board | <sb-discussion-board boardId={{?}}></sb-discussion-board> | Module |
Text Book |
| Card |
Content |
| Card |
Collection |
| Card |
CardGrid (Portal) | <sb-cards-grid [contents]={{?}} cardType=”Library | Course | Any”></sb-cards-grid> | Grid |
Activity Creation Form Config (Against Version)
Any Form Configs associated with the config will completely gets driven by backend metdata to associate forms. There is a generic Abstracted Library being built called as SB-forms. Please refer the link below:
Type | Config |
---|---|
AnnouncementCreate | {formName:””,fields:[{TextBox},{TextArea},{CheckBox},{Submit}]} |
ChatCreate | {formName:””,fields:[{TextBox},{TextArea},{CheckBox},{Submit}]} |
Discussion BoardCreate | {formName:””,fields:[formName:””,{TextBox},{TextArea},{CheckBox},{Submit}]} |
…. |
|
Element Config
Drop Down Config
{
"code": "category",
"type": "select",
"default": "loginRegistraction",
"templateOptions": {
"placeHolder": "Select Category",
"multiple": false,
"hidden": true,
"dataSource": DATASOURCETYPE.LOCAL || DATASOURCE.CLOSURE || DATASOURCE.API
"options": CLOSURE || INDEPENDENT SERVICE CALL || [
{
"value": "content",
"label": "Content"
},
{
"value": "loginRegistraction",
"label": "Login/Registration"
},
{
"value": "teacherTraining",
"label": "Teacher Training"
},
{
"value": "otherissues",
"label": "Other Issues"
}
]
}
}
TextBox Config
{
code: "declared-school-name",
type: FieldConfigInputType.INPUT,
defaultValue: 'hello Defalut value',
templateOptions: {
label: 'Sample Input',
placeHolder: "ENTER_SCHOOL_NAME"
}
},
Back End Design
Group
Cassandra
{
"id": uuid, // PARTITION key
"name": human_friendly_name, // need not be unique [Indexed]
"activities": "[{
"activity_id": "activityId" //Extra Added.
}]", // MAP [NO index created. No need to query specific]
"createdBy": uuid,
"groupActivities":[], //Extra Added
"createdOn": timestamp,
"updatedBy": uuid,
"updatedOn": timestamp,
"status": "active", "inactive",
"joinStrategy": InvitationOnly, Moderation - TBD
}
PRIMARY_KEY(id, name)
Groups can be deleted only by the creator, not by the admin.
ElasticSearch
Solution 1:
The idea is to try eliminate ES. We will start doing reads directly from primary database.
activities is expanded as map. All other details flow to ES.
Solution 2:
Have a separate table meant to have multiple information sourced with a content.
Activity_Data
Cassandra
{
"id": activity_id/plugin_id,
"activityInstanceId" : "do_id1",
"type": "Course"
"validity" :
"data": {
"name": "The big bang theory",
"orgName": ""
// Extra Meta} // Not indexed, just serves as a placeholder to store any runtime data.
}
PRIMARY_KEY(id, activityInstanceId)
Group_Member
Cassandra
{
"id": group_uuid, // PARTITION key
"memberId": userId // This is not an array, because we need to capture information who added, when added etc
"role": [
"isAdmin", "isMember", "// We can add moderator"
],
"addedBy": uuid,
"addedOn": timestamp,
"removedBy": uuid,
"removedOn": timestamp,
"updatedBy": uuid,
"updatedOn": timestamp
}
PRIMARY_KEY(id, role, memberId)
Plugin Registry
Cassandra
{
"id": plugin_instance_id, // PARTITION key
"ver": "1.0",
"isActive": boolean,
"shortId": "org.ekstep.launcher",
"author": "string", // Default to "Sunbird"
"description": "",
"publishedDate": "",
"data": {
}
}
PRIMARY_KEY(id, author, isActive)
API
Groups
|
|
|
---|---|---|
GroupListing Against a User | 1 API read |
|
Members against a Group | 1 API read |
|
Activities Listing | 1 API read |
|
Create a Group |
|
|
Update a Group |
|
|
Delete the Group (Mostly Soft Delete) |
|
|
Group |
|
|
Discussion Points
Discussion Points |
|
---|---|
User Course should be changed to User Group Course. |
|
Enable All API on Course Consumption to be Group Context Driven |
|
Enabling Feature Selection Based on Groups |
|
Metadata Storage Against a Group in same table vs different table |
|