Moving app-scoped custom activity events to studies raises a number of issues that should be addressed in the move.
First and foremost, schedules are global in scope along with studies, so if a study defines a set of events, the schedule may or may not be valid since it could reference events from another study.
Second, the existing system supports study burst designs, but only indirectly through automatic custom events. These events themselves represent time sequences that are not directly represented in the model.
To address these issues, I propose the following changes.
Scope schedules 1:1 with studies in our API
The long-term plan had been for studies to be associated to protocols, which would have referenced one or more study arms and schedules which could be associated to those study arms. If we eliminate the protocol from the domain design, the study becomes the primary object for this purpose. What this means however is that a schedule can only be used in the context of a study. If a study designer wanted to reuse a schedule (or events, or study arms) these would need to be copied into the new study. It would no longer be possible to just reference the same protocol as the original study.
Therefore, remove the following APIs:
GET /v5/schedules POST /v5/schedules GET /v5/schedules/{guid} GET /v5/schedules/{guid}/timeline POST /v5/schedules/{guid} POST /v5/schedules/{guid}/publish DELETE /v5/schedules/{guid}
Add the following APIs (to be phased out with the introduction of multi-arm studies):
GET /v5/studies/{studyId}/schedule - will create a starter record if it doesn't exist POST /v5/studies/{studyId}/schedule - will create the record if it doesn't exist GET /v5/studies/{studyId}/timeline - transitional
Schedule publication will happen only as part of changing the phase of the study from design. The schedule will only be deleted when the study is deleted. Now events can be defined in a study, referenced from a schedule, and we can expand to multiple arms/schedules later that will share this set of event definitions.
Add events to the study object
Move the configuration from the App to the Study object with some improvements:
class Study { List<CustomEvent> customEvents; List<AutoCustomEvent> automaticCustomEvents; List<StudyBurst> studyBursts; }
Custom events and automatic custom events will function identically to their App model counter-parts, but they will be configured with some additional information, through some model collections (objects will be in separate tables):
/** * This is the same event as in the App map, but with a display label. */ class CustomEvent { String identifier; String label; ActivityEventUpdateType updateType; } /** * Almost identical to automatic custom events in the App, but with a label * and a means of finding all the automatic custom events that are generated * from a study burst configuration. */ class AutomaticCustomEvent { String identifier; String label; String studyBurstPrefix; String originEventId; Period offset; // positive or negative }
The new configuration is the StudyBurst
, which describes how to generate a set of automatic custom events:
class StudyBurst { String prefix; String originEventId; String int occurrences; Period interval; // positive or negative }
On study create and update, the server will remove all automatic custom events with a studyBurstPrefix
, then iterate through the study burst configurations and create the automatic custom events specified by that configuration.
For example, a study burst named “foo” triggered from “enrollment” four times, at an interval of P1W, would (in the old notation) generate the automatic custom events “foo1 → enrollment:P1W”, “foo2 → enrollment:P2W”, “foo3 → enrollment:P3W”, “foo4 → enrollment:P4W”.
Initially a schedule would need to reference these automatic custom events, but we can probably include a study burst reference in the Session object and expand that when generating a timeline, so that the client still works with automatic custom events, which is what it finds in the participant’s event map.
This last part is a drag for Alina until we can improve the system; I will try and do that when I add the ability to associate multiple event IDs as triggers for a given session.
Make automatic custom events mutable
Once created, it should be possible to change the timestamp associated with an automatic custom event through the existing study custom event APIs.