From 30a82f124625f7a5289646e15694c225bfac0d9a Mon Sep 17 00:00:00 2001 From: Lydia Ross Date: Wed, 2 Jan 2019 16:56:39 +0000 Subject: [PATCH 1/5] adds activity type, verb and starts recipe --- src/statementConstants/activityTypes.ts | 5 +++ src/statementConstants/verbs.ts | 1 + src/statementCreators/plannedFaceToFace.ts | 37 ++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 src/statementCreators/plannedFaceToFace.ts 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..6ed8cba --- /dev/null +++ b/src/statementCreators/plannedFaceToFace.ts @@ -0,0 +1,37 @@ +import UserSiteActivityAction from '../actionUtils/UserSiteActivityAction'; +import { faceToFace, source } from '../statementConstants/activityTypes'; +import { planned } from '../statementConstants/verbs'; +import createActivity from '../statementUtils/createActivity'; +import createAgent from '../statementUtils/createAgent'; +import { Statement } from '../statementUtils/types'; + + +export interface FaceToFaceAction extends UserSiteActivityAction { + /** URL to access the survey. */ + readonly existingDate: string; +} + +/** + * Creates an xAPI Statement to represent a user planning a face-to-face meeting. + */ +export default function plannedFaceToFace(action: FaceToFaceAction): Statement { + return { + timestamp: action.existingDate, + actor: createAgent({ + displayName: action.userDisplayName, + id: action.userId, + idProviderUrl: action.userIdProviderUrl, + email: action.userEmail, + }), + verb: planned, + object: createActivity({ + type: faceToFace, + url: action.activityUrl, + name: 'appointment', + }), + context: { + platform: action.platformName, + language: 'en', + }, + }; +} From aab316609cd7e63df742ae8d40c64dda75b4737c Mon Sep 17 00:00:00 2001 From: Lydia Ross Date: Thu, 3 Jan 2019 10:10:22 +0000 Subject: [PATCH 2/5] adds context, timestamp and interface --- src/statementCreators/plannedFaceToFace.ts | 38 +++++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/statementCreators/plannedFaceToFace.ts b/src/statementCreators/plannedFaceToFace.ts index 6ed8cba..cbf316c 100644 --- a/src/statementCreators/plannedFaceToFace.ts +++ b/src/statementCreators/plannedFaceToFace.ts @@ -1,22 +1,28 @@ -import UserSiteActivityAction from '../actionUtils/UserSiteActivityAction'; -import { faceToFace, source } from '../statementConstants/activityTypes'; +import { faceToFace, source, site } from '../statementConstants/activityTypes'; import { planned } from '../statementConstants/verbs'; import createActivity from '../statementUtils/createActivity'; import createAgent from '../statementUtils/createAgent'; -import { Statement } from '../statementUtils/types'; +import createTimestamp from '../statementUtils/createTimestamp'; +import { Statement, Extensions } from '../statementUtils/types'; +import UserSiteAction from '../actionUtils/UserSiteAction'; +export interface PlannedFaceToFaceAction extends UserSiteAction { + /** The URL where the activity can be accessed. */ + readonly activityUrl: string; -export interface FaceToFaceAction extends UserSiteActivityAction { - /** URL to access the survey. */ - readonly existingDate: 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: FaceToFaceAction): Statement { +export default function plannedFaceToFace(action: PlannedFaceToFaceAction): Statement { return { - timestamp: action.existingDate, + timestamp: createTimestamp(action.actionDate), actor: createAgent({ displayName: action.userDisplayName, id: action.userId, @@ -27,11 +33,25 @@ export default function plannedFaceToFace(action: FaceToFaceAction): Statement { object: createActivity({ type: faceToFace, url: action.activityUrl, - name: 'appointment', + 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, + })], + }, }, }; } From dd05d3f48e535c8a775002df13aaf38cbe446ab8 Mon Sep 17 00:00:00 2001 From: Lydia Ross Date: Thu, 3 Jan 2019 13:30:37 +0000 Subject: [PATCH 3/5] Adds example implementation of planned face to face --- src/examples/plannedFaceToFace.ts | 16 ++++++++++++++++ src/statementCreators/plannedFaceToFace.ts | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/examples/plannedFaceToFace.ts 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/statementCreators/plannedFaceToFace.ts b/src/statementCreators/plannedFaceToFace.ts index cbf316c..563e004 100644 --- a/src/statementCreators/plannedFaceToFace.ts +++ b/src/statementCreators/plannedFaceToFace.ts @@ -32,7 +32,7 @@ export default function plannedFaceToFace(action: PlannedFaceToFaceAction): Stat verb: planned, object: createActivity({ type: faceToFace, - url: action.activityUrl, + url: action.siteUrl, name: action.activityName, extensions: action.activityExtensions, }), From 9d11bc34c8a759972a1ef84d8b04bd9fcf9ac85e Mon Sep 17 00:00:00 2001 From: Lydia Ross Date: Thu, 3 Jan 2019 13:41:14 +0000 Subject: [PATCH 4/5] Alphabetises imports --- src/statementCreators/plannedFaceToFace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/statementCreators/plannedFaceToFace.ts b/src/statementCreators/plannedFaceToFace.ts index 563e004..9e425eb 100644 --- a/src/statementCreators/plannedFaceToFace.ts +++ b/src/statementCreators/plannedFaceToFace.ts @@ -1,9 +1,9 @@ -import { faceToFace, source, site } from '../statementConstants/activityTypes'; +import { faceToFace, site, source } from '../statementConstants/activityTypes'; import { planned } from '../statementConstants/verbs'; +import { Extensions, Statement } from '../statementUtils/types'; import createActivity from '../statementUtils/createActivity'; import createAgent from '../statementUtils/createAgent'; import createTimestamp from '../statementUtils/createTimestamp'; -import { Statement, Extensions } from '../statementUtils/types'; import UserSiteAction from '../actionUtils/UserSiteAction'; export interface PlannedFaceToFaceAction extends UserSiteAction { From ef53adaac5c57e7463675bddb931daca65de43ad Mon Sep 17 00:00:00 2001 From: Lydia Ross Date: Thu, 3 Jan 2019 13:48:35 +0000 Subject: [PATCH 5/5] Alphabetises imports --- src/statementCreators/plannedFaceToFace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/statementCreators/plannedFaceToFace.ts b/src/statementCreators/plannedFaceToFace.ts index 9e425eb..8f70d72 100644 --- a/src/statementCreators/plannedFaceToFace.ts +++ b/src/statementCreators/plannedFaceToFace.ts @@ -1,10 +1,10 @@ +import UserSiteAction from '../actionUtils/UserSiteAction'; import { faceToFace, site, source } from '../statementConstants/activityTypes'; import { planned } from '../statementConstants/verbs'; -import { Extensions, Statement } from '../statementUtils/types'; import createActivity from '../statementUtils/createActivity'; import createAgent from '../statementUtils/createAgent'; import createTimestamp from '../statementUtils/createTimestamp'; -import UserSiteAction from '../actionUtils/UserSiteAction'; +import { Extensions, Statement } from '../statementUtils/types'; export interface PlannedFaceToFaceAction extends UserSiteAction { /** The URL where the activity can be accessed. */