musora-content-services 2.8.0 → 2.8.2

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 (155) hide show
  1. package/.coderabbit.yaml +0 -0
  2. package/.editorconfig +0 -0
  3. package/.github/pull_request_template.md +0 -0
  4. package/.github/workflows/node.js.yml +0 -0
  5. package/.prettierignore +0 -0
  6. package/.prettierrc +0 -0
  7. package/CHANGELOG.md +4 -0
  8. package/README.md +0 -0
  9. package/babel.config.cjs +0 -0
  10. package/docs/Content-Organization.html +0 -0
  11. package/docs/ContentOrganization.html +0 -0
  12. package/docs/Gamification.html +0 -0
  13. package/docs/UserManagement.html +0 -0
  14. package/docs/UserManagementSystem.html +0 -0
  15. package/docs/api_types.js.html +0 -0
  16. package/docs/config.js.html +0 -0
  17. package/docs/content-org_content-org.js.html +0 -0
  18. package/docs/content-org_playlists-types.js.html +0 -0
  19. package/docs/content-org_playlists.js.html +0 -0
  20. package/docs/content.js.html +0 -0
  21. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  22. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  23. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  24. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  25. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  26. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  27. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  28. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -0
  31. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  32. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  33. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  34. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  35. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -0
  36. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  37. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  38. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  39. package/docs/gamification_awards.js.html +0 -0
  40. package/docs/gamification_gamification.js.html +0 -0
  41. package/docs/gamification_types.js.html +0 -0
  42. package/docs/global.html +0 -0
  43. package/docs/global.html#User +0 -0
  44. package/docs/index.html +0 -0
  45. package/docs/module-Awards.html +0 -0
  46. package/docs/module-Config.html +0 -0
  47. package/docs/module-Content-Services-V2.html +0 -0
  48. package/docs/module-Interests.html +0 -0
  49. package/docs/module-Permissions.html +0 -0
  50. package/docs/module-Playlists.html +0 -0
  51. package/docs/module-Railcontent-Services.html +0 -0
  52. package/docs/module-Sanity-Services.html +0 -0
  53. package/docs/module-Session-Management.html +0 -0
  54. package/docs/module-Sessions.html +0 -0
  55. package/docs/module-User-Activity.html +0 -0
  56. package/docs/module-User-Management.html +0 -0
  57. package/docs/module-User-Permissions.html +0 -0
  58. package/docs/module-UserManagement.html +0 -0
  59. package/docs/module-UserProfile.html +0 -0
  60. package/docs/railcontent.js.html +0 -0
  61. package/docs/sanity.js.html +0 -0
  62. package/docs/scripts/collapse.js +0 -0
  63. package/docs/scripts/commonNav.js +0 -0
  64. package/docs/scripts/linenumber.js +0 -0
  65. package/docs/scripts/nav.js +0 -0
  66. package/docs/scripts/polyfill.js +0 -0
  67. package/docs/scripts/prettify/Apache-License-2.0.txt +0 -0
  68. package/docs/scripts/prettify/lang-css.js +0 -0
  69. package/docs/scripts/prettify/prettify.js +0 -0
  70. package/docs/scripts/search.js +0 -0
  71. package/docs/styles/jsdoc.css +0 -0
  72. package/docs/styles/prettify.css +0 -0
  73. package/docs/types.js.html +0 -0
  74. package/docs/userActivity.js.html +0 -0
  75. package/docs/user_interests.js.html +0 -0
  76. package/docs/user_management.js.html +0 -0
  77. package/docs/user_permissions.js.html +0 -0
  78. package/docs/user_profile.js.html +0 -0
  79. package/docs/user_sessions.js.html +0 -0
  80. package/docs/user_types.js.html +0 -0
  81. package/docs/user_user-management-system.js.html +0 -0
  82. package/docs/user_user-management.js.html +0 -0
  83. package/jest.config.js +0 -0
  84. package/jsdoc.json +0 -0
  85. package/link_mcs.sh +0 -0
  86. package/package.json +1 -1
  87. package/src/contentMetaData.js +0 -0
  88. package/src/filterBuilder.js +0 -0
  89. package/src/index.d.ts +0 -0
  90. package/src/index.js +0 -0
  91. package/src/infrastructure/http/HttpClient.ts +0 -0
  92. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  93. package/src/infrastructure/http/index.ts +0 -0
  94. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  95. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  96. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  97. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  98. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  99. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  100. package/src/lib/httpHelper.js +0 -0
  101. package/src/lib/lastUpdated.js +0 -0
  102. package/src/services/api/types.js +0 -0
  103. package/src/services/config.js +0 -0
  104. package/src/services/content-org/content-org.js +0 -0
  105. package/src/services/content-org/playlists-types.js +0 -0
  106. package/src/services/content-org/playlists.js +12 -0
  107. package/src/services/content.js +0 -0
  108. package/src/services/contentAggregator.js +0 -0
  109. package/src/services/contentLikes.js +0 -0
  110. package/src/services/contentProgress.js +0 -0
  111. package/src/services/dataContext.js +0 -0
  112. package/src/services/dateUtils.js +7 -1
  113. package/src/services/forum.js +0 -0
  114. package/src/services/gamification/awards.js +0 -0
  115. package/src/services/gamification/gamification.js +0 -0
  116. package/src/services/gamification/types.js +0 -0
  117. package/src/services/imageSRCBuilder.js +0 -0
  118. package/src/services/imageSRCVerify.js +0 -0
  119. package/src/services/railcontent.js +0 -0
  120. package/src/services/recommendations.js +0 -0
  121. package/src/services/types.js +0 -0
  122. package/src/services/user/interests.js +0 -0
  123. package/src/services/user/management.js +0 -0
  124. package/src/services/user/permissions.js +0 -0
  125. package/src/services/user/profile.js +0 -0
  126. package/src/services/user/sessions.js +0 -0
  127. package/src/services/user/types.js +0 -0
  128. package/src/services/user/user-management-system.js +0 -0
  129. package/src/services/userActivity.js +19 -14
  130. package/test/HttpClient.test.js +0 -0
  131. package/test/content.test.js +0 -0
  132. package/test/contentLikes.test.js +0 -0
  133. package/test/contentProgress.test.js +0 -0
  134. package/test/dataContext.test.js +0 -0
  135. package/test/forum.test.js +0 -0
  136. package/test/imageSRCBuilder.test.js +0 -0
  137. package/test/imageSRCVerify.test.js +0 -0
  138. package/test/initializeTests.js +0 -0
  139. package/test/lib/lastUpdated.test.js +0 -0
  140. package/test/live/contentProgressLive.test.js +0 -0
  141. package/test/live/railcontentLive.test.js +0 -0
  142. package/test/localStorageMock.js +0 -0
  143. package/test/log.js +0 -0
  144. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  145. package/test/mockData/mockData_progress_content.json +0 -0
  146. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  147. package/test/mockData/mockData_user_practices.json +0 -0
  148. package/test/progressRows.test.js +0 -0
  149. package/test/sanityQueryService.test.js +0 -0
  150. package/test/streakMessage.test.js +0 -0
  151. package/test/user/permissions.test.js +0 -0
  152. package/test/userActivity.test.js +0 -0
  153. package/tools/generate-index.cjs +0 -0
  154. package/.yarnrc.yml +0 -1
  155. package/docs/module-Content-Services.html +0 -763
package/.coderabbit.yaml CHANGED
File without changes
package/.editorconfig CHANGED
File without changes
File without changes
File without changes
package/.prettierignore CHANGED
File without changes
package/.prettierrc CHANGED
File without changes
package/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [2.8.2](https://github.com/railroadmedia/musora-content-services/compare/v2.8.1...v2.8.2) (2025-05-31)
6
+
7
+ ### [2.8.1](https://github.com/railroadmedia/musora-content-services/compare/v2.8.0...v2.8.1) (2025-05-29)
8
+
5
9
  ## [2.8.0](https://github.com/railroadmedia/musora-content-services/compare/v2.7.3...v2.8.0) (2025-05-28)
6
10
 
7
11
 
package/README.md CHANGED
File without changes
package/babel.config.cjs 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
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/docs/global.html CHANGED
File without changes
File without changes
package/docs/index.html 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
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/jest.config.js CHANGED
File without changes
package/jsdoc.json CHANGED
File without changes
package/link_mcs.sh CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musora-content-services",
3
- "version": "2.8.0",
3
+ "version": "2.8.2",
4
4
  "description": "A package for Musoras content services ",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
File without changes
File without changes
package/src/index.d.ts CHANGED
File without changes
package/src/index.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
@@ -70,11 +70,23 @@ export async function createPlaylist(playlistData) {
70
70
  return await fetchHandler(url, 'POST', null, playlistData)
71
71
  }
72
72
 
73
+ /**
74
+ * Soft deletes a playlist. Will cascade and also soft delete entries in other playlist tables (pinned, reported, liked,
75
+ * playlist content) and last engaged that have this playlist id
76
+ * @param {id} playlist - the id of the playlist you want to soft delete.
77
+ * @returns {Promise<any|string|null>}
78
+ */
73
79
  export async function deletePlaylist(playlist) {
74
80
  const url = `${BASE_PATH}/v1/user/playlists/delete/${playlist}`
75
81
  return await fetchHandler(url, 'POST', null, playlist)
76
82
  }
77
83
 
84
+ /**
85
+ * Soft restores a playlist. Will cascade and also soft restore entries in other playlist tables (pinned, reported, liked,
86
+ * playlist content) and last engaged that have this playlist id
87
+ * @param {id} playlist - the id of the playlist you want to soft restore.
88
+ * @returns {Promise<any|string|null>}
89
+ */
78
90
  export async function undeletePlaylist(playlist) {
79
91
  const url = `${BASE_PATH}/v1/user/playlists/undelete/${playlist}`
80
92
  return await fetchHandler(url, 'POST', null, playlist)
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -53,7 +53,7 @@ export function isNextDay(prev, current) {
53
53
  );
54
54
  }
55
55
 
56
- export function getTimeRemainingUntilLocal(targetUtcIsoString) {
56
+ export function getTimeRemainingUntilLocal(targetUtcIsoString, {withTotalSeconds} = {}) {
57
57
  const targetUTC = new Date(targetUtcIsoString);
58
58
  if (isNaN(targetUTC.getTime())) {
59
59
  return "00:00:00";
@@ -70,6 +70,12 @@ export function getTimeRemainingUntilLocal(targetUtcIsoString) {
70
70
  const hours = String(Math.floor(totalSeconds / 3600)).padStart(2, '0');
71
71
  const minutes = String(Math.floor((totalSeconds % 3600) / 60)).padStart(2, '0');
72
72
  const seconds = String(totalSeconds % 60).padStart(2, '0');
73
+ if(withTotalSeconds) {
74
+ return {
75
+ totalSeconds,
76
+ formatted: `${hours}:${minutes}:${seconds}`
77
+ }
78
+ }
73
79
 
74
80
  return `${hours}:${minutes}:${seconds}`;
75
81
  }
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
@@ -1032,8 +1032,8 @@ async function processContentItem(item) {
1032
1032
 
1033
1033
  if (item.childIndex) {
1034
1034
  let nextId = item.childIndex
1035
- const nextByProgress = findIncompleteLesson(progressOnItems, item.childIndex, item.raw.type);
1036
- nextId = nextByProgress ? nextByProgress : nextId;
1035
+ const nextByProgress = findIncompleteLesson(progressOnItems, item.childIndex, item.raw.type)
1036
+ nextId = nextByProgress ? nextByProgress : nextId
1037
1037
 
1038
1038
  const nestedLessons = data.lessons
1039
1039
  .filter(item => Array.isArray(item.lessons))
@@ -1049,15 +1049,17 @@ async function processContentItem(item) {
1049
1049
  }))
1050
1050
  );
1051
1051
 
1052
- const lessons = (nestedLessons.length === 0) ? data.lessons : nestedLessons;
1053
- const nextLesson = lessons.find(lesson => lesson.id === nextId);
1054
- data.first_incomplete_child = nextLesson?.parent ?? nextLesson;
1055
- data.second_incomplete_child = (nextLesson?.parent) ? nextLesson : null;
1052
+ const lessons = (nestedLessons.length === 0) ? data.lessons : nestedLessons
1053
+ const nextLesson = lessons.find(lesson => lesson.id === nextId)
1054
+ data.first_incomplete_child = nextLesson?.parent ?? nextLesson
1055
+ data.second_incomplete_child = (nextLesson?.parent) ? nextLesson : null
1056
1056
  if(data.type === 'challenge' && nextByProgress !== undefined ){
1057
1057
  const challenge = await fetchChallengeLessonData(nextByProgress)
1058
1058
  if(challenge.lesson.is_locked) {
1059
- data.is_locked = true;
1060
- ctaText = 'Next lesson in ' + getTimeRemainingUntilLocal(challenge.lesson.unlock_date);
1059
+ const timeRemaining = getTimeRemainingUntilLocal(challenge.lesson.unlock_date, {withTotalSeconds:true})
1060
+ data.is_locked = true
1061
+ data.time_remaining_seconds = timeRemaining.totalSeconds
1062
+ ctaText = 'Next lesson in ' + timeRemaining.formatted
1061
1063
  }
1062
1064
  }
1063
1065
  }
@@ -1097,6 +1099,7 @@ async function processContentItem(item) {
1097
1099
  },
1098
1100
  cta: {
1099
1101
  text: ctaText,
1102
+ timeRemainingToUnlockSeconds: data.time_remaining_seconds ?? null,
1100
1103
  action: {
1101
1104
  type: data.type,
1102
1105
  brand: data.brand,
@@ -1272,7 +1275,7 @@ export async function pinProgressRow(brand, id, progressType) {
1272
1275
  const url = `/api/user-management-system/v1/progress/pin?brand=${brand}&id=${id}&progressType=${progressType}`;
1273
1276
  const response = await fetchHandler(url, 'PUT', null)
1274
1277
  if (response && !response.error) {
1275
- updatePinnedProgressRow(brand, {
1278
+ await updatePinnedProgressRow(brand, {
1276
1279
  id,
1277
1280
  progressType,
1278
1281
  pinnedAt: new Date().toISOString(),
@@ -1295,20 +1298,22 @@ export async function unpinProgressRow(brand) {
1295
1298
  const url = `/api/user-management-system/v1/progress/unpin?brand=${brand}`
1296
1299
  const response = await fetchHandler(url, 'PUT', null)
1297
1300
  if (response && !response.error) {
1298
- updatePinnedProgressRow(brand, null)
1301
+ await updatePinnedProgressRow(brand, null)
1299
1302
  }
1300
1303
  return response
1301
1304
  }
1302
1305
 
1303
- function updatePinnedProgressRow(brand, pinnedData) {
1304
- const user = JSON.parse(globalConfig.localStorage.getItem('user')) || {}
1306
+ async function updatePinnedProgressRow(brand, pinnedData) {
1307
+ const userRaw = await globalConfig.localStorage.getItem('user');
1308
+ const user = userRaw ? JSON.parse(userRaw) : {};
1305
1309
  user.brand_pinned_progress = user.brand_pinned_progress || {}
1306
1310
  user.brand_pinned_progress[brand] = pinnedData
1307
- globalConfig.localStorage.setItem('user', JSON.stringify(user))
1311
+ await globalConfig.localStorage.setItem('user', JSON.stringify(user))
1308
1312
  }
1309
1313
 
1310
1314
  async function extractPinnedItem({brand, progressMap, playlistItems}) {
1311
- const user = JSON.parse(globalConfig.localStorage.getItem('user')) || {}
1315
+ const userRaw = await globalConfig.localStorage.getItem('user');
1316
+ const user = userRaw ? JSON.parse(userRaw) : {};
1312
1317
  user.brand_pinned_progress = user.brand_pinned_progress || {}
1313
1318
 
1314
1319
  const pinned = user.brand_pinned_progress[brand]
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
package/.yarnrc.yml DELETED
@@ -1 +0,0 @@
1
- nodeLinker: node-modules