diff --git a/src/examples/plannedFaceToFace.ts b/src/examples/plannedFaceToFace.ts new file mode 100644 index 0000000..9087653 --- /dev/null +++ b/src/examples/plannedFaceToFace.ts @@ -0,0 +1,16 @@ +import plannedFaceToFace from '../statementCreators/plannedFaceToFace'; + +const statement = plannedFaceToFace({ + actionDate: new Date(), + activityUrl: 'https://demo.example.org/courses/demo-course', + siteUrl: 'https://demo.example.org', + siteName: 'Demo Example Site', + platformUrl: 'https://example.org', + platformName: 'Example Platform', + userId: '123', + userIdProviderUrl: 'https://demo.example.org', + userEmail: 'demo@example.org', + userDisplayName: 'Demo User', +}); + +export default statement; diff --git a/src/statementConstants/activityTypes.ts b/src/statementConstants/activityTypes.ts index d310d4e..33b3a61 100644 --- a/src/statementConstants/activityTypes.ts +++ b/src/statementConstants/activityTypes.ts @@ -60,6 +60,11 @@ export const document = 'http://id.tincanapi.com/activitytype/document'; */ export const event = 'http://activitystrea.ms/schema/1.0/event'; +/** + * Represents a face to face meeting or appointment + */ +export const faceToFace = 'https://w3id.org/xapi/acrossx/activities/face-to-face-discussion'; + /** * Represents a graphical image. * https://registry.tincanapi.com/#uri/activityType/65 diff --git a/src/statementConstants/verbs.ts b/src/statementConstants/verbs.ts index 3e13d6e..f877d83 100644 --- a/src/statementConstants/verbs.ts +++ b/src/statementConstants/verbs.ts @@ -30,6 +30,7 @@ export const liked = createVerb('https://w3id.org/xapi/acrossx/verbs/liked', 'li export const loggedIn = createVerb('https://w3id.org/xapi/adl/verbs/logged-in', 'logged into'); export const loggedOut = createVerb('https://w3id.org/xapi/adl/verbs/logged-out', 'logged out of'); export const opened = createVerb('http://activitystrea.ms/schema/1.0/open', 'opened'); +export const planned = createVerb('https://w3id.org/xapi/dod-isd/verbs/planned', 'planned'); export const posted = createVerb('https://w3id.org/xapi/acrossx/verbs/posted', 'posted'); export const registered = createVerb('http://adlnet.gov/expapi/verbs/registered', 'registered to'); export const replied = createVerb('http://id.tincanapi.com/verb/replied', 'replied'); diff --git a/src/statementCreators/plannedFaceToFace.ts b/src/statementCreators/plannedFaceToFace.ts new file mode 100644 index 0000000..8f70d72 --- /dev/null +++ b/src/statementCreators/plannedFaceToFace.ts @@ -0,0 +1,57 @@ +import UserSiteAction from '../actionUtils/UserSiteAction'; +import { faceToFace, site, source } from '../statementConstants/activityTypes'; +import { planned } from '../statementConstants/verbs'; +import createActivity from '../statementUtils/createActivity'; +import createAgent from '../statementUtils/createAgent'; +import createTimestamp from '../statementUtils/createTimestamp'; +import { Extensions, Statement } from '../statementUtils/types'; + +export interface PlannedFaceToFaceAction extends UserSiteAction { + /** The URL where the activity can be accessed. */ + readonly activityUrl: string; + + /** The human readable name for the activity. */ + readonly activityName?: string; + + /** Additional properties of the activity. */ + readonly activityExtensions?: Extensions; +} + +/** + * Creates an xAPI Statement to represent a user planning a face-to-face meeting. + */ +export default function plannedFaceToFace(action: PlannedFaceToFaceAction): Statement { + return { + timestamp: createTimestamp(action.actionDate), + actor: createAgent({ + displayName: action.userDisplayName, + id: action.userId, + idProviderUrl: action.userIdProviderUrl, + email: action.userEmail, + }), + verb: planned, + object: createActivity({ + type: faceToFace, + url: action.siteUrl, + name: action.activityName, + extensions: action.activityExtensions, + }), + context: { + platform: action.platformName, + language: 'en', + extensions: action.contextExtensions, + contextActivities: { + grouping: [createActivity({ + type: site, + url: action.siteUrl, + name: action.siteName, + })], + category: [createActivity({ + type: source, + url: action.platformUrl, + name: action.platformName, + })], + }, + }, + }; +}