musora-content-services 2.77.2 → 2.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -3
- package/.coderabbit.yaml +0 -0
- package/.editorconfig +0 -0
- package/.github/pull_request_template.md +0 -0
- package/.github/workflows/conventional-commits.yaml +0 -0
- package/.github/workflows/docs.js.yml +0 -0
- package/.github/workflows/node.js.yml +0 -0
- package/.prettierignore +0 -0
- package/.prettierrc +0 -0
- package/.yarnrc.yml +1 -0
- package/CHANGELOG.md +19 -0
- package/README.md +0 -0
- package/babel.config.cjs +0 -0
- package/docs/ContentOrganization.html +0 -0
- package/docs/Forums.html +0 -0
- package/docs/Gamification.html +2 -2
- package/docs/TestUser.html +0 -0
- package/docs/UserManagementSystem.html +0 -0
- package/docs/api_types.js.html +0 -0
- package/docs/config.js.html +0 -0
- package/docs/content-org_content-org.js.html +0 -0
- package/docs/content-org_guided-courses.ts.html +0 -0
- package/docs/content-org_learning-paths.ts.html +0 -0
- package/docs/content-org_playlists-types.js.html +0 -0
- package/docs/content-org_playlists.js.html +0 -0
- package/docs/content.js.html +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/forums_categories.ts.html +0 -0
- package/docs/forums_discussions.js.html +0 -0
- package/docs/forums_forum.js.html +0 -0
- package/docs/forums_forums.ts.html +0 -0
- package/docs/forums_posts.ts.html +0 -0
- package/docs/forums_threads.ts.html +0 -0
- package/docs/gamification_awards.js.html +0 -0
- package/docs/gamification_awards.ts.html +26 -12
- package/docs/gamification_gamification.js.html +2 -2
- package/docs/gamification_types.js.html +0 -0
- package/docs/global.html +0 -0
- package/docs/index.html +0 -0
- package/docs/liveTesting.ts.html +0 -0
- package/docs/module-Accounts.html +0 -0
- package/docs/module-Awards.html +106 -6
- package/docs/module-Categories.html +0 -0
- package/docs/module-Config.html +0 -0
- package/docs/module-Content-Services-V2.html +0 -0
- package/docs/module-ForumCategories.html +0 -0
- package/docs/module-ForumDiscussions.html +0 -0
- package/docs/module-Forums.html +0 -0
- package/docs/module-GuidedCourses.html +0 -0
- package/docs/module-Interests.html +0 -0
- package/docs/module-LearningPaths.html +0 -0
- package/docs/module-Onboarding.html +0 -0
- package/docs/module-Payments.html +0 -0
- package/docs/module-Permissions.html +0 -0
- package/docs/module-Playlists.html +0 -0
- package/docs/module-ProgressRow.html +0 -0
- package/docs/module-Railcontent-Services.html +0 -0
- package/docs/module-Sanity-Services.html +0 -0
- package/docs/module-Sessions.html +0 -0
- package/docs/module-Threads.html +0 -0
- package/docs/module-UserActivity.html +0 -0
- package/docs/module-UserChat.html +0 -0
- package/docs/module-UserManagement.html +0 -0
- package/docs/module-UserMemberships.html +0 -0
- package/docs/module-UserNotifications.html +0 -0
- package/docs/module-UserProfile.html +0 -0
- package/docs/progress-row_method-card.js.html +0 -0
- package/docs/railcontent.js.html +0 -0
- package/docs/sanity.js.html +0 -0
- package/docs/scripts/collapse.js +0 -0
- package/docs/scripts/commonNav.js +0 -0
- package/docs/scripts/linenumber.js +0 -0
- package/docs/scripts/nav.js +0 -0
- package/docs/scripts/polyfill.js +0 -0
- package/docs/scripts/prettify/Apache-License-2.0.txt +0 -0
- package/docs/scripts/prettify/lang-css.js +0 -0
- package/docs/scripts/prettify/prettify.js +0 -0
- package/docs/scripts/search.js +0 -0
- package/docs/styles/jsdoc.css +0 -0
- package/docs/styles/prettify.css +0 -0
- package/docs/userActivity.js.html +0 -0
- package/docs/user_account.ts.html +0 -0
- package/docs/user_chat.js.html +0 -0
- package/docs/user_interests.js.html +0 -0
- package/docs/user_management.js.html +0 -0
- package/docs/user_memberships.js.html +0 -0
- package/docs/user_memberships.ts.html +0 -0
- package/docs/user_notifications.js.html +0 -0
- package/docs/user_onboarding.ts.html +0 -0
- package/docs/user_payments.ts.html +0 -0
- package/docs/user_permissions.js.html +0 -0
- package/docs/user_profile.js.html +0 -0
- package/docs/user_sessions.js.html +0 -0
- package/docs/user_types.js.html +0 -0
- package/docs/user_user-management-system.js.html +0 -0
- package/jest.config.js +0 -0
- package/jsdoc.json +0 -0
- package/package.json +1 -1
- package/src/contentMetaData.js +0 -0
- package/src/filterBuilder.js +0 -0
- package/src/index.d.ts +8 -2
- package/src/index.js +8 -2
- package/src/infrastructure/http/HttpClient.ts +0 -0
- package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
- package/src/infrastructure/http/index.ts +0 -0
- package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
- package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
- package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
- package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
- package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
- package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
- package/src/lib/httpHelper.js +0 -0
- package/src/lib/lastUpdated.js +0 -0
- package/src/services/api/types.js +0 -0
- package/src/services/api/types.ts +0 -0
- package/src/services/config.js +0 -0
- package/src/services/content-org/content-org.js +0 -0
- package/src/services/content-org/guided-courses.ts +0 -0
- package/src/services/content-org/learning-paths.ts +96 -11
- package/src/services/content-org/playlists-types.js +0 -0
- package/src/services/content-org/playlists.js +0 -0
- package/src/services/content.js +0 -0
- package/src/services/contentAggregator.js +8 -5
- package/src/services/contentLikes.js +0 -0
- package/src/services/contentProgress.js +0 -0
- package/src/services/dataContext.js +0 -0
- package/src/services/dateUtils.js +0 -0
- package/src/services/eventsAPI.js +0 -0
- package/src/services/forums/categories.ts +1 -1
- package/src/services/forums/forums.ts +0 -0
- package/src/services/forums/posts.ts +0 -0
- package/src/services/forums/threads.ts +0 -0
- package/src/services/forums/types.ts +0 -0
- package/src/services/gamification/awards.ts +24 -10
- package/src/services/gamification/gamification.js +0 -0
- package/src/services/imageSRCBuilder.js +0 -0
- package/src/services/imageSRCVerify.js +0 -0
- package/src/services/liveTesting.ts +0 -0
- package/src/services/progress-row/method-card.js +0 -0
- package/src/services/railcontent.js +0 -0
- package/src/services/recommendations.js +0 -0
- package/src/services/sanity.js +1 -0
- package/src/services/types.js +0 -0
- package/src/services/user/account.ts +0 -0
- package/src/services/user/chat.js +0 -0
- package/src/services/user/interests.js +0 -0
- package/src/services/user/management.js +0 -0
- package/src/services/user/memberships.ts +0 -0
- package/src/services/user/notifications.js +0 -0
- package/src/services/user/onboarding.ts +0 -0
- package/src/services/user/payments.ts +0 -0
- package/src/services/user/permissions.js +0 -0
- package/src/services/user/profile.js +0 -0
- package/src/services/user/sessions.js +0 -0
- package/src/services/user/types.js +0 -0
- package/src/services/user/user-management-system.js +0 -0
- package/src/services/userActivity.js +0 -0
- package/test/HttpClient.test.js +0 -0
- package/test/content.test.js +0 -0
- package/test/contentLikes.test.js +0 -0
- package/test/contentProgress.test.js +0 -0
- package/test/dataContext.test.js +0 -0
- package/test/forum.test.js +0 -0
- package/test/imageSRCBuilder.test.js +0 -0
- package/test/imageSRCVerify.test.js +0 -0
- package/test/initializeTests.js +0 -0
- package/test/learningPaths.test.js +0 -0
- package/test/lib/lastUpdated.test.js +0 -0
- package/test/live/contentProgressLive.test.js +0 -0
- package/test/live/railcontentLive.test.js +0 -0
- package/test/localStorageMock.js +0 -0
- package/test/log.js +0 -0
- package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
- package/test/mockData/mockData_progress_content.json +0 -0
- package/test/mockData/mockData_sanity_progress_content.json +0 -0
- package/test/mockData/mockData_user_practices.json +0 -0
- package/test/notifications.test.js +0 -0
- package/test/progressRows.test.js +0 -0
- package/test/sanityQueryService.test.js +0 -0
- package/test/streakMessage.test.js +0 -0
- package/test/user/permissions.test.js +0 -0
- package/test/userActivity.test.js +0 -0
- package/tools/generate-index.cjs +0 -0
|
File without changes
|
|
File without changes
|
package/src/lib/httpHelper.js
CHANGED
|
File without changes
|
package/src/lib/lastUpdated.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/src/services/config.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -5,9 +5,25 @@
|
|
|
5
5
|
import { fetchHandler } from '../railcontent.js'
|
|
6
6
|
import { fetchByRailContentId, fetchByRailContentIds, fetchMethodV2Structure } from '../sanity.js'
|
|
7
7
|
import { addContextToContent } from '../contentAggregator.js'
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
contentStatusCompleted,
|
|
10
|
+
contentStatusReset,
|
|
11
|
+
getProgressState,
|
|
12
|
+
getProgressStateByIds
|
|
13
|
+
} from '../contentProgress.js'
|
|
9
14
|
|
|
10
15
|
const BASE_PATH: string = `/api/content-org`
|
|
16
|
+
const LEARNING_PATHS_PATH = `${BASE_PATH}/v1/user/learning-paths`
|
|
17
|
+
|
|
18
|
+
interface ActiveLearningPathResponse {
|
|
19
|
+
user_id: number,
|
|
20
|
+
brand: string,
|
|
21
|
+
active_learning_path_id: number,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
11
27
|
|
|
12
28
|
/**
|
|
13
29
|
* Gets today's daily session for the user.
|
|
@@ -16,7 +32,7 @@ const BASE_PATH: string = `/api/content-org`
|
|
|
16
32
|
*/
|
|
17
33
|
export async function getDailySession(brand: string, userDate: Date) {
|
|
18
34
|
const stringDate = userDate.toISOString().split('T')[0]
|
|
19
|
-
const url: string = `${
|
|
35
|
+
const url: string = `${LEARNING_PATHS_PATH}/daily-session/get-or-create`
|
|
20
36
|
const body = { brand: brand, userDate: stringDate }
|
|
21
37
|
return await fetchHandler(url, 'POST', null, body)
|
|
22
38
|
}
|
|
@@ -33,7 +49,7 @@ export async function updateDailySession(
|
|
|
33
49
|
keepFirstLearningPath: boolean
|
|
34
50
|
) {
|
|
35
51
|
const stringDate = userDate.toISOString().split('T')[0]
|
|
36
|
-
const url: string = `${
|
|
52
|
+
const url: string = `${LEARNING_PATHS_PATH}/daily-session/update`
|
|
37
53
|
const body = { brand: brand, userDate: stringDate, keepFirstLearningPath: keepFirstLearningPath }
|
|
38
54
|
return await fetchHandler(url, 'POST', null, body)
|
|
39
55
|
}
|
|
@@ -43,17 +59,19 @@ export async function updateDailySession(
|
|
|
43
59
|
* @param brand
|
|
44
60
|
*/
|
|
45
61
|
export async function getActivePath(brand: string) {
|
|
46
|
-
const url: string = `${
|
|
62
|
+
const url: string = `${LEARNING_PATHS_PATH}/active-path/get-or-create`
|
|
47
63
|
const body = { brand: brand }
|
|
48
64
|
return await fetchHandler(url, 'POST', null, body)
|
|
49
65
|
}
|
|
50
66
|
|
|
67
|
+
// todo this should be removed once we handle active path gen only through
|
|
68
|
+
// finish method intro or complete current active path
|
|
51
69
|
/**
|
|
52
70
|
* Updates user's active learning path.
|
|
53
71
|
* @param brand
|
|
54
72
|
*/
|
|
55
73
|
export async function updateActivePath(brand: string) {
|
|
56
|
-
const url: string = `${
|
|
74
|
+
const url: string = `${LEARNING_PATHS_PATH}/active-path/update`
|
|
57
75
|
const body = { brand: brand }
|
|
58
76
|
return await fetchHandler(url, 'POST', null, body)
|
|
59
77
|
}
|
|
@@ -64,7 +82,7 @@ export async function updateActivePath(brand: string) {
|
|
|
64
82
|
* @param learningPathId
|
|
65
83
|
*/
|
|
66
84
|
export async function startLearningPath(brand: string, learningPathId: number) {
|
|
67
|
-
const url: string = `${
|
|
85
|
+
const url: string = `${LEARNING_PATHS_PATH}/start`
|
|
68
86
|
const body = { brand: brand, learning_path_id: learningPathId }
|
|
69
87
|
return await fetchHandler(url, 'POST', null, body)
|
|
70
88
|
}
|
|
@@ -73,7 +91,7 @@ export async function startLearningPath(brand: string, learningPathId: number) {
|
|
|
73
91
|
* Resets the user's learning path.
|
|
74
92
|
*/
|
|
75
93
|
export async function resetAllLearningPaths() {
|
|
76
|
-
const url: string = `${
|
|
94
|
+
const url: string = `${LEARNING_PATHS_PATH}/reset`
|
|
77
95
|
return await fetchHandler(url, 'POST', null, {})
|
|
78
96
|
}
|
|
79
97
|
|
|
@@ -82,8 +100,8 @@ export async function resetAllLearningPaths() {
|
|
|
82
100
|
* @param {number} learningPathId - The learning path ID
|
|
83
101
|
* @returns {Promise<Object>} Learning path with enriched lesson data
|
|
84
102
|
*/
|
|
85
|
-
export async function
|
|
86
|
-
//TODO:
|
|
103
|
+
export async function getEnrichedLearningPath(learningPathId) {
|
|
104
|
+
//TODO BEH-1410: refactor/cleanup
|
|
87
105
|
let learningPath = await fetchByRailContentId(learningPathId, 'learning-path-v2')
|
|
88
106
|
learningPath.children = mapContentToParent(
|
|
89
107
|
learningPath.children,
|
|
@@ -109,10 +127,16 @@ export async function getLearningPath(learningPathId) {
|
|
|
109
127
|
export async function getLearningPathLessonsByIds(contentIds, learningPathId) {
|
|
110
128
|
// It is more efficient to load the entire learning path than individual lessons
|
|
111
129
|
// Also adds reliability check whether content is actually in the learning path
|
|
112
|
-
const learningPath = await
|
|
130
|
+
const learningPath = await getEnrichedLearningPath(learningPathId)
|
|
113
131
|
return learningPath.children.filter((lesson) => contentIds.includes(lesson.id))
|
|
114
132
|
}
|
|
115
133
|
|
|
134
|
+
/**
|
|
135
|
+
* Maps content to its parent learning path - fixes multi-parent problems for cta when lessons have a special collection.
|
|
136
|
+
* @param lessons
|
|
137
|
+
* @param parentContentType
|
|
138
|
+
* @param parentContentId
|
|
139
|
+
*/
|
|
116
140
|
export function mapContentToParent(lessons, parentContentType, parentContentId) {
|
|
117
141
|
return lessons.map((lesson: any) => {
|
|
118
142
|
return { ...lesson, type: parentContentType, parent_id: parentContentId }
|
|
@@ -142,7 +166,7 @@ export async function fetchLearningPathLessons(
|
|
|
142
166
|
userDate: Date
|
|
143
167
|
) {
|
|
144
168
|
const [learningPath, dailySession] = await Promise.all([
|
|
145
|
-
|
|
169
|
+
getEnrichedLearningPath(learningPathId),
|
|
146
170
|
getDailySession(brand, userDate),
|
|
147
171
|
])
|
|
148
172
|
|
|
@@ -203,3 +227,64 @@ export async function fetchLearningPathLessons(
|
|
|
203
227
|
previous_learning_path_todays: previousLearningPathTodays,
|
|
204
228
|
}
|
|
205
229
|
}
|
|
230
|
+
|
|
231
|
+
interface completeMethodIntroVideo {
|
|
232
|
+
intro_video_response: Object | null,
|
|
233
|
+
active_path_response: ActiveLearningPathResponse
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Handles completion of method intro video and other related actions.
|
|
237
|
+
* @param introVideoId - The intro video content ID.
|
|
238
|
+
* @param brand
|
|
239
|
+
* @returns {Promise<Array>} response - The response object.
|
|
240
|
+
* @returns {Promise<Object|null>} response.intro_video_response - The intro video completion response or null if already completed.
|
|
241
|
+
* @returns {Promise<Object>} response.active_path_response - The set active learning path response.
|
|
242
|
+
*/
|
|
243
|
+
export async function completeMethodIntroVideo(introVideoId: number, brand: string): Promise<completeMethodIntroVideo> {
|
|
244
|
+
let response = {} as completeMethodIntroVideo
|
|
245
|
+
|
|
246
|
+
response.intro_video_response = await completeIfNotCompleted(introVideoId)
|
|
247
|
+
|
|
248
|
+
const url: string = `${LEARNING_PATHS_PATH}/start`
|
|
249
|
+
const body = { brand: brand }
|
|
250
|
+
response.active_path_response = await fetchHandler(url, 'POST', null, body)
|
|
251
|
+
|
|
252
|
+
return response
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
interface completeLearningPathIntroVideo {
|
|
256
|
+
intro_video_response: Object | null,
|
|
257
|
+
learning_path_reset_response: void | Object[] | Object
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Handles completion of learning path intro video and other related actions.
|
|
261
|
+
* @param introVideoId
|
|
262
|
+
* @param learningPathId
|
|
263
|
+
* @param lessonsToImport
|
|
264
|
+
*/
|
|
265
|
+
export async function completeLearningPathIntroVideo(introVideoId: number, learningPathId: number, lessonsToImport: number[] | null) {
|
|
266
|
+
let response = {} as completeLearningPathIntroVideo
|
|
267
|
+
|
|
268
|
+
response.intro_video_response = await completeIfNotCompleted(introVideoId)
|
|
269
|
+
|
|
270
|
+
if (!lessonsToImport) {
|
|
271
|
+
// reset progress within the learning path
|
|
272
|
+
response.learning_path_reset_response = await contentStatusReset(learningPathId)
|
|
273
|
+
} else {
|
|
274
|
+
response.learning_path_reset_response = null
|
|
275
|
+
|
|
276
|
+
// todo: add collection context + optimize with bulk calls with watermelon
|
|
277
|
+
for (const contentId of lessonsToImport) {
|
|
278
|
+
response.learning_path_reset_response[contentId] = await contentStatusCompleted(contentId)
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return response
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
async function completeIfNotCompleted(contentId: number): Promise<Object | null> {
|
|
287
|
+
const introVideoStatus = await getProgressState(contentId)
|
|
288
|
+
|
|
289
|
+
return introVideoStatus !== 'completed' ? await contentStatusCompleted(contentId) : null
|
|
290
|
+
}
|
|
File without changes
|
|
File without changes
|
package/src/services/content.js
CHANGED
|
File without changes
|
|
@@ -136,19 +136,22 @@ export async function getNavigateToForPlaylists(data, { dataField = null } = {})
|
|
|
136
136
|
)
|
|
137
137
|
const progressOnItems = await getProgressStateByIds(allIds)
|
|
138
138
|
const addContext = async (playlist) => {
|
|
139
|
-
|
|
139
|
+
// Filter out locked items (where need_access === true) and scheduled content
|
|
140
|
+
const accessibleItems = playlist.items.filter((item) => !item.need_access && item.status !== 'scheduled')
|
|
141
|
+
|
|
142
|
+
const allItemsCompleted = accessibleItems.every((i) => {
|
|
140
143
|
const itemId = i.content_id
|
|
141
144
|
const progress = progressOnItems[itemId]
|
|
142
145
|
return progress && progress === 'completed'
|
|
143
146
|
})
|
|
144
|
-
let nextItem =
|
|
147
|
+
let nextItem = accessibleItems[0] ?? null
|
|
145
148
|
if (!allItemsCompleted) {
|
|
146
149
|
const lastItemProgress = progressOnItems[playlist.last_engaged_on]
|
|
147
|
-
const index =
|
|
150
|
+
const index = accessibleItems.findIndex((i) => i.content_id === playlist.last_engaged_on)
|
|
148
151
|
if (lastItemProgress === 'completed') {
|
|
149
|
-
nextItem =
|
|
152
|
+
nextItem = accessibleItems[index + 1] ?? nextItem
|
|
150
153
|
} else {
|
|
151
|
-
nextItem =
|
|
154
|
+
nextItem = accessibleItems[index] ?? nextItem
|
|
152
155
|
}
|
|
153
156
|
}
|
|
154
157
|
playlist.navigateTo = {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -11,8 +11,16 @@ const baseUrl = `/api/gamification`
|
|
|
11
11
|
export interface Award {
|
|
12
12
|
id: number
|
|
13
13
|
user_id: number
|
|
14
|
-
completed_at: string
|
|
15
|
-
completion_data:
|
|
14
|
+
completed_at: string // ISO-8601 timestamp
|
|
15
|
+
completion_data: {
|
|
16
|
+
message?: string
|
|
17
|
+
message_certificate?: string
|
|
18
|
+
content_title?: string
|
|
19
|
+
completed_at?: Date
|
|
20
|
+
days_user_practiced?: number
|
|
21
|
+
practice_minutes?: number
|
|
22
|
+
[key: string]: any
|
|
23
|
+
}
|
|
16
24
|
award_id: number
|
|
17
25
|
type: string
|
|
18
26
|
title: string
|
|
@@ -23,7 +31,7 @@ export interface Certificate {
|
|
|
23
31
|
id: number
|
|
24
32
|
user_name: string
|
|
25
33
|
user_id: number
|
|
26
|
-
completed_at: string
|
|
34
|
+
completed_at: string // ISO-8601 timestamp
|
|
27
35
|
message: string
|
|
28
36
|
award_id: number
|
|
29
37
|
type: string
|
|
@@ -42,6 +50,7 @@ export interface Certificate {
|
|
|
42
50
|
instructor_signature?: string
|
|
43
51
|
instructor_signature_64?: string
|
|
44
52
|
}
|
|
53
|
+
|
|
45
54
|
/**
|
|
46
55
|
* Get awards for a specific user.
|
|
47
56
|
*
|
|
@@ -49,18 +58,23 @@ export interface Certificate {
|
|
|
49
58
|
* (Alexandre: I'm doing it in a different branch/PR: https://github.com/railroadmedia/musora-content-services/pull/349)
|
|
50
59
|
* NOTE: This function still expects brand because FE passes the argument. It is ignored for now
|
|
51
60
|
*
|
|
52
|
-
* @param {number} userId - The user ID. If not provided, the authenticated user is used instead.
|
|
53
|
-
* @param {string} _brand - The brand to fetch the awards for.
|
|
61
|
+
* @param {number|null} [userId] - The user ID. If not provided, the authenticated user is used instead.
|
|
62
|
+
* @param {string|null} [_brand] - The brand to fetch the awards for.
|
|
54
63
|
* @param {number|null} [page=1] - Page attribute for pagination
|
|
55
64
|
* @param {number|null} [limit=5] - Limit how many items to return
|
|
56
65
|
* @returns {Promise<PaginatedResponse<Award>>} - The awards for the user.
|
|
66
|
+
* @throws {HttpError} - If the HTTP request fails.
|
|
57
67
|
*/
|
|
58
68
|
export async function fetchAwardsForUser(
|
|
59
|
-
userId
|
|
60
|
-
_brand
|
|
69
|
+
userId?: number,
|
|
70
|
+
_brand?: string,
|
|
61
71
|
page: number = 1,
|
|
62
72
|
limit: number = 5
|
|
63
73
|
): Promise<PaginatedResponse<Award>> {
|
|
74
|
+
if (!userId) {
|
|
75
|
+
userId = Number.parseInt(globalConfig.sessionConfig.userId)
|
|
76
|
+
}
|
|
77
|
+
|
|
64
78
|
const httpClient = new HttpClient(globalConfig.baseUrl, globalConfig.sessionConfig.token)
|
|
65
79
|
const response = await httpClient.get<PaginatedResponse<Award>>(
|
|
66
80
|
`${baseUrl}/v1/users/${userId}/awards?limit=${limit}&page=${page}`
|
|
@@ -78,10 +92,9 @@ export async function fetchAwardsForUser(
|
|
|
78
92
|
*
|
|
79
93
|
* @param {number} guidedCourseLessonId - The guided course lesson Id
|
|
80
94
|
* @returns {Promise<Award>} - The award data for a given award and given user.
|
|
95
|
+
* @throws {HttpError} - If the HTTP request fails.
|
|
81
96
|
*/
|
|
82
|
-
export async function getAwardDataForGuidedContent(
|
|
83
|
-
guidedCourseLessonId,
|
|
84
|
-
): Promise<Award> {
|
|
97
|
+
export async function getAwardDataForGuidedContent(guidedCourseLessonId: number): Promise<Award> {
|
|
85
98
|
const httpClient = new HttpClient(globalConfig.baseUrl, globalConfig.sessionConfig.token)
|
|
86
99
|
const response = await httpClient.get<Award>(
|
|
87
100
|
`${baseUrl}/v1/users/guided_course_award/${guidedCourseLessonId}`
|
|
@@ -99,6 +112,7 @@ export async function getAwardDataForGuidedContent(
|
|
|
99
112
|
*
|
|
100
113
|
* @param {number} userAwardId - The user award progress id
|
|
101
114
|
* @returns {Promise<Certificate>} - The certificate data for the completed user award.
|
|
115
|
+
* @throws {HttpError} - If the HTTP request fails.
|
|
102
116
|
*/
|
|
103
117
|
export async function fetchCertificate(userAwardId: number): Promise<Certificate> {
|
|
104
118
|
const httpClient = new HttpClient(globalConfig.baseUrl, globalConfig.sessionConfig.token)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/src/services/sanity.js
CHANGED
|
@@ -904,6 +904,7 @@ export async function fetchFoundation(slug) {
|
|
|
904
904
|
* @param {string} slug - The slug of the method.
|
|
905
905
|
* @returns {Promise<Object|null>} - The fetched methods data or null if not found.
|
|
906
906
|
*/
|
|
907
|
+
//todo BEH-1446 depreciated. remove all old method functions
|
|
907
908
|
export async function fetchMethod(brand, slug) {
|
|
908
909
|
const childrenFilter = await new FilterBuilder(``, { isChildrenFilter: true }).buildFilter()
|
|
909
910
|
|
package/src/services/types.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/HttpClient.test.js
CHANGED
|
File without changes
|
package/test/content.test.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/dataContext.test.js
CHANGED
|
File without changes
|
package/test/forum.test.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/initializeTests.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/localStorageMock.js
CHANGED
|
File without changes
|
package/test/log.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/tools/generate-index.cjs
CHANGED
|
File without changes
|