This document covers the design and modifications needed to support events related use cases in Sunbird.
Below use cases have been considered when creating the spec
A single event listed (eg: a ask me anything session)
A collection of events (eg: a multi-day conference with one event each for the specific sessions)
Recurring events (eg: a 4 month course being taught on Mondays & Fridays)
A collection with an event within (eg: a content collection with training material, leading up to a live session)
Event Model
Event Attributes
"name", "code", //identifier "description", "status", // [live, draft, retired, cancelled] "posterImage", //main image to show on the UI "thumbnail", //small image to show for listing "moreDetailsLink", //link to more details of the event "language", "ageGroup", "topics", "participationMethod", //[by invitation link, by registration, by scope {<org>, <group>}] "startDate", "endDate", "startTime", "endTime", "bookingStartDate", "bookingEndDate", "totalSeats", "availableSeats", "eventType", //[online, offline, online_and_offline] "onlineProvider", //should this be an edge instead, as there would be a known set of providers ? "onlineProviderConfig", //meeting id, password or direct links can be captured here "venue", //venue of physical location in case of offline meeting. Should this be an edge instead? "recordingLink", "recordingLinkPassword", "dialcodes", "createdOn", "createdBy", "updatedOn", "updatedBy", "flagReasons", "flags", "flaggedBy", "lastFlaggedOn"
Event Relations
eventSet hasSequenceMember event collection hasSequenceMember event event associatedTo content or collection //link to all the content shared as part of event
Event APIs
Create Event
Update Event
Publish Event
Read Event
Search Events
Link Content to Event
EventSet Attributes
EventSet will be a collection of Event objects. Below are the additional attributes that EventSet will have apart from Event, barring a few which will be stored at event level (startTime, endTime, recordingLink, flagReasons, flags, flaggedBy, lastFlaggedOne)
"scheduleType", //[recurring, non-recurring] "schedule", //recurring template -> { repeatEvery:<N>, repeatEveryType:<days|weeks|months|years>, //if weeks selected: repeatOnDays:[<day of week1>,..], //e.g. every Monday and Friday //if month selected: repeatOnWeek:<N>, repeatOnWeekday:<day of the week>, //e.g. Every Second Thursday of the month startTime: <startTime>, endTime: <endTime> } //non-recurring template [{date:<date>,startTime:<startTime>,endTime:<endTime>}]
EventSet Relations
eventSet hasSequenceMember event collection hasSequenceMember eventSet
Updated Enrolment table design
Changes to be done:
Auto-create a batch for every event set & event on publish (similar to how auto batch creation is done for some courses currently).
Generalise user_enrolment table to work with any type of asset (not just collections).
Generalise content_state to capture status of child events in an event set or a collection (similar to how status of child content in a collection in currently captured)
Enhance enrolment and content-state APIs to work for all asset types (i.e. events and event sets).
Generalise async status_aggregator job to work for all asset types (i.e. events and event sets).
Iteration 2:
Generalisation of certificate config and certificate issue
Generalisation of reporting jobs
Iteration 3:
Make batches optional for enrolment and tracking
Telemetry and tracking - Online Events
When an online event is launched, the browser will redirect to the respective event platform, so telemetry events cannot be produced, since Sunbird is not in control of those platforms. However most platforms offer APIs to request attendee data, or webhooks to receive participant data.
For each user who enrolled to the event, we need to be able to store
Did they join the event or not
How much time did they join for
Based on this the “attendance” will be marked.
The current user enrollment table does not have these, so a revised design of the enrollment table is necessary.
Venues & Configuration for online events
Offline events can be mapped to venues. For online events, we can use the various providers as venues. Each instance of the provider config will be a venue. This allows doing checks to ensure there is only one event at a time happening at a venue.
Online Events Interface
The online events will be implemented using an interface that allows integrating multiple providers like Zoom, Gotomeeting, Google Meet, Jitsi etc. Proposed interface methods
createEvent()
addParticipant()
getParticipantJoinLink()
getHostJoinLink()
getRecording()
getAttendance()
UI Components - Consumption
Each component will be configured via the form API. All decisions in the UI should be configured. This will give flexibility to the implementation to show / hide things.
List of Events
<sb-event-list listconfig="[listConfig]"></sb-event-list>
<sb-event-calendar listconfig="[listConfig]"></sb-event-calendar>
<sb-event-grid listconfig="[listConfig]"></sb-event-grid>
Event Details
Event Details (with variations for upcoming, ongoing & complete stages, list of related content eg: recordings)
<sb-event-details identifier="[identifier]"></sb-event-details>
List of Attendees
For Event manager, screen to view attendees and download attendance data
<sb-event-attendees identifier="[identifier]"></sb-event-attendees>
UI Components - Creation
For creation, the new hierarchy editor will be used. A plugin will be created for adding support to create events within this editor.
List of Services
getEventList(listConfig)
getEvent(identifier)
getParticipation()
getAttendeeJoinLink()
getHostJoinLink()
getEventFormConfig()
createEvent()
updateEvent()
deleteEvent()
getEventAttendees()
Additional Roles Needed
Event Creator
Can create / edit / publish events
Can view and download the attendee list for a event
API Endpoints (Work In Progress)
Create Event
Edit Event
Publish Event
Create Participation
Delete Participation
Get attendees list
Get attendees CSV export
Get join link