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.
Files changed (200) hide show
  1. package/.claude/settings.local.json +9 -3
  2. package/.coderabbit.yaml +0 -0
  3. package/.editorconfig +0 -0
  4. package/.github/pull_request_template.md +0 -0
  5. package/.github/workflows/conventional-commits.yaml +0 -0
  6. package/.github/workflows/docs.js.yml +0 -0
  7. package/.github/workflows/node.js.yml +0 -0
  8. package/.prettierignore +0 -0
  9. package/.prettierrc +0 -0
  10. package/.yarnrc.yml +1 -0
  11. package/CHANGELOG.md +19 -0
  12. package/README.md +0 -0
  13. package/babel.config.cjs +0 -0
  14. package/docs/ContentOrganization.html +0 -0
  15. package/docs/Forums.html +0 -0
  16. package/docs/Gamification.html +2 -2
  17. package/docs/TestUser.html +0 -0
  18. package/docs/UserManagementSystem.html +0 -0
  19. package/docs/api_types.js.html +0 -0
  20. package/docs/config.js.html +0 -0
  21. package/docs/content-org_content-org.js.html +0 -0
  22. package/docs/content-org_guided-courses.ts.html +0 -0
  23. package/docs/content-org_learning-paths.ts.html +0 -0
  24. package/docs/content-org_playlists-types.js.html +0 -0
  25. package/docs/content-org_playlists.js.html +0 -0
  26. package/docs/content.js.html +0 -0
  27. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  28. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  29. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  30. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  31. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  32. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  33. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  34. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  35. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  36. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -0
  37. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  38. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  39. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  40. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  41. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -0
  42. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  43. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  44. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  45. package/docs/forums_categories.ts.html +0 -0
  46. package/docs/forums_discussions.js.html +0 -0
  47. package/docs/forums_forum.js.html +0 -0
  48. package/docs/forums_forums.ts.html +0 -0
  49. package/docs/forums_posts.ts.html +0 -0
  50. package/docs/forums_threads.ts.html +0 -0
  51. package/docs/gamification_awards.js.html +0 -0
  52. package/docs/gamification_awards.ts.html +26 -12
  53. package/docs/gamification_gamification.js.html +2 -2
  54. package/docs/gamification_types.js.html +0 -0
  55. package/docs/global.html +0 -0
  56. package/docs/index.html +0 -0
  57. package/docs/liveTesting.ts.html +0 -0
  58. package/docs/module-Accounts.html +0 -0
  59. package/docs/module-Awards.html +106 -6
  60. package/docs/module-Categories.html +0 -0
  61. package/docs/module-Config.html +0 -0
  62. package/docs/module-Content-Services-V2.html +0 -0
  63. package/docs/module-ForumCategories.html +0 -0
  64. package/docs/module-ForumDiscussions.html +0 -0
  65. package/docs/module-Forums.html +0 -0
  66. package/docs/module-GuidedCourses.html +0 -0
  67. package/docs/module-Interests.html +0 -0
  68. package/docs/module-LearningPaths.html +0 -0
  69. package/docs/module-Onboarding.html +0 -0
  70. package/docs/module-Payments.html +0 -0
  71. package/docs/module-Permissions.html +0 -0
  72. package/docs/module-Playlists.html +0 -0
  73. package/docs/module-ProgressRow.html +0 -0
  74. package/docs/module-Railcontent-Services.html +0 -0
  75. package/docs/module-Sanity-Services.html +0 -0
  76. package/docs/module-Sessions.html +0 -0
  77. package/docs/module-Threads.html +0 -0
  78. package/docs/module-UserActivity.html +0 -0
  79. package/docs/module-UserChat.html +0 -0
  80. package/docs/module-UserManagement.html +0 -0
  81. package/docs/module-UserMemberships.html +0 -0
  82. package/docs/module-UserNotifications.html +0 -0
  83. package/docs/module-UserProfile.html +0 -0
  84. package/docs/progress-row_method-card.js.html +0 -0
  85. package/docs/railcontent.js.html +0 -0
  86. package/docs/sanity.js.html +0 -0
  87. package/docs/scripts/collapse.js +0 -0
  88. package/docs/scripts/commonNav.js +0 -0
  89. package/docs/scripts/linenumber.js +0 -0
  90. package/docs/scripts/nav.js +0 -0
  91. package/docs/scripts/polyfill.js +0 -0
  92. package/docs/scripts/prettify/Apache-License-2.0.txt +0 -0
  93. package/docs/scripts/prettify/lang-css.js +0 -0
  94. package/docs/scripts/prettify/prettify.js +0 -0
  95. package/docs/scripts/search.js +0 -0
  96. package/docs/styles/jsdoc.css +0 -0
  97. package/docs/styles/prettify.css +0 -0
  98. package/docs/userActivity.js.html +0 -0
  99. package/docs/user_account.ts.html +0 -0
  100. package/docs/user_chat.js.html +0 -0
  101. package/docs/user_interests.js.html +0 -0
  102. package/docs/user_management.js.html +0 -0
  103. package/docs/user_memberships.js.html +0 -0
  104. package/docs/user_memberships.ts.html +0 -0
  105. package/docs/user_notifications.js.html +0 -0
  106. package/docs/user_onboarding.ts.html +0 -0
  107. package/docs/user_payments.ts.html +0 -0
  108. package/docs/user_permissions.js.html +0 -0
  109. package/docs/user_profile.js.html +0 -0
  110. package/docs/user_sessions.js.html +0 -0
  111. package/docs/user_types.js.html +0 -0
  112. package/docs/user_user-management-system.js.html +0 -0
  113. package/jest.config.js +0 -0
  114. package/jsdoc.json +0 -0
  115. package/package.json +1 -1
  116. package/src/contentMetaData.js +0 -0
  117. package/src/filterBuilder.js +0 -0
  118. package/src/index.d.ts +8 -2
  119. package/src/index.js +8 -2
  120. package/src/infrastructure/http/HttpClient.ts +0 -0
  121. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  122. package/src/infrastructure/http/index.ts +0 -0
  123. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  124. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  125. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  126. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  127. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  128. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  129. package/src/lib/httpHelper.js +0 -0
  130. package/src/lib/lastUpdated.js +0 -0
  131. package/src/services/api/types.js +0 -0
  132. package/src/services/api/types.ts +0 -0
  133. package/src/services/config.js +0 -0
  134. package/src/services/content-org/content-org.js +0 -0
  135. package/src/services/content-org/guided-courses.ts +0 -0
  136. package/src/services/content-org/learning-paths.ts +96 -11
  137. package/src/services/content-org/playlists-types.js +0 -0
  138. package/src/services/content-org/playlists.js +0 -0
  139. package/src/services/content.js +0 -0
  140. package/src/services/contentAggregator.js +8 -5
  141. package/src/services/contentLikes.js +0 -0
  142. package/src/services/contentProgress.js +0 -0
  143. package/src/services/dataContext.js +0 -0
  144. package/src/services/dateUtils.js +0 -0
  145. package/src/services/eventsAPI.js +0 -0
  146. package/src/services/forums/categories.ts +1 -1
  147. package/src/services/forums/forums.ts +0 -0
  148. package/src/services/forums/posts.ts +0 -0
  149. package/src/services/forums/threads.ts +0 -0
  150. package/src/services/forums/types.ts +0 -0
  151. package/src/services/gamification/awards.ts +24 -10
  152. package/src/services/gamification/gamification.js +0 -0
  153. package/src/services/imageSRCBuilder.js +0 -0
  154. package/src/services/imageSRCVerify.js +0 -0
  155. package/src/services/liveTesting.ts +0 -0
  156. package/src/services/progress-row/method-card.js +0 -0
  157. package/src/services/railcontent.js +0 -0
  158. package/src/services/recommendations.js +0 -0
  159. package/src/services/sanity.js +1 -0
  160. package/src/services/types.js +0 -0
  161. package/src/services/user/account.ts +0 -0
  162. package/src/services/user/chat.js +0 -0
  163. package/src/services/user/interests.js +0 -0
  164. package/src/services/user/management.js +0 -0
  165. package/src/services/user/memberships.ts +0 -0
  166. package/src/services/user/notifications.js +0 -0
  167. package/src/services/user/onboarding.ts +0 -0
  168. package/src/services/user/payments.ts +0 -0
  169. package/src/services/user/permissions.js +0 -0
  170. package/src/services/user/profile.js +0 -0
  171. package/src/services/user/sessions.js +0 -0
  172. package/src/services/user/types.js +0 -0
  173. package/src/services/user/user-management-system.js +0 -0
  174. package/src/services/userActivity.js +0 -0
  175. package/test/HttpClient.test.js +0 -0
  176. package/test/content.test.js +0 -0
  177. package/test/contentLikes.test.js +0 -0
  178. package/test/contentProgress.test.js +0 -0
  179. package/test/dataContext.test.js +0 -0
  180. package/test/forum.test.js +0 -0
  181. package/test/imageSRCBuilder.test.js +0 -0
  182. package/test/imageSRCVerify.test.js +0 -0
  183. package/test/initializeTests.js +0 -0
  184. package/test/learningPaths.test.js +0 -0
  185. package/test/lib/lastUpdated.test.js +0 -0
  186. package/test/live/contentProgressLive.test.js +0 -0
  187. package/test/live/railcontentLive.test.js +0 -0
  188. package/test/localStorageMock.js +0 -0
  189. package/test/log.js +0 -0
  190. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  191. package/test/mockData/mockData_progress_content.json +0 -0
  192. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  193. package/test/mockData/mockData_user_practices.json +0 -0
  194. package/test/notifications.test.js +0 -0
  195. package/test/progressRows.test.js +0 -0
  196. package/test/sanityQueryService.test.js +0 -0
  197. package/test/streakMessage.test.js +0 -0
  198. package/test/user/permissions.test.js +0 -0
  199. package/test/userActivity.test.js +0 -0
  200. package/tools/generate-index.cjs +0 -0
File without changes
File without changes
File without changes
File without changes
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 { getProgressStateByIds } from '../contentProgress.js'
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 = `${BASE_PATH}/v1/user/learning-paths/daily-session/get-or-create`
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 = `${BASE_PATH}/v1/user/learning-paths/daily-session/update`
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 = `${BASE_PATH}/v1/user/learning-paths/active-path/get-or-create`
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 = `${BASE_PATH}/v1/user/learning-paths/active-path/update`
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 = `${BASE_PATH}/v1/user/learning-paths/start`
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 = `${BASE_PATH}/v1/user/learning-paths/reset`
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 getLearningPath(learningPathId) {
86
- //TODO: must be a cleaner way to do this
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 getLearningPath(learningPathId)
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
- getLearningPath(learningPathId),
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
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
- const allItemsCompleted = playlist.items.every((i) => {
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 = playlist.items[0] ?? null
147
+ let nextItem = accessibleItems[0] ?? null
145
148
  if (!allItemsCompleted) {
146
149
  const lastItemProgress = progressOnItems[playlist.last_engaged_on]
147
- const index = playlist.items.findIndex((i) => i.content_id === playlist.last_engaged_on)
150
+ const index = accessibleItems.findIndex((i) => i.content_id === playlist.last_engaged_on)
148
151
  if (lastItemProgress === 'completed') {
149
- nextItem = playlist.items[index + 1] ?? nextItem
152
+ nextItem = accessibleItems[index + 1] ?? nextItem
150
153
  } else {
151
- nextItem = playlist.items[index] ?? 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
@@ -43,7 +43,7 @@ export async function createForumCategory(
43
43
 
44
44
  export interface UpdateForumCategoryParams {
45
45
  id: number
46
- brand: number
46
+ brand: string
47
47
  name: string
48
48
  weight: number
49
49
  description?: string
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 // ISO-8601 timestamp
15
- completion_data: Object
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 // ISO-8601 timestamp
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: number,
60
- _brand: string,
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
@@ -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
 
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
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/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