musora-content-services 2.122.0 → 2.122.3

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 (231) 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/conventional-commits.yaml +0 -0
  5. package/.github/workflows/docs.js.yml +0 -0
  6. package/.github/workflows/node.js.yml +0 -0
  7. package/.prettierignore +0 -0
  8. package/.prettierrc +0 -0
  9. package/CHANGELOG.md +19 -0
  10. package/CLAUDE.md +0 -0
  11. package/README.md +0 -0
  12. package/babel.config.cjs +0 -0
  13. package/jest.config.js +0 -0
  14. package/jsdoc.json +0 -0
  15. package/package.json +1 -1
  16. package/src/constants/award-assets.js +0 -0
  17. package/src/constants/membership-permissions.ts +0 -0
  18. package/src/contentTypeConfig.js +4 -3
  19. package/src/filterBuilder.js +0 -0
  20. package/src/index.d.ts +0 -0
  21. package/src/index.js +0 -0
  22. package/src/infrastructure/http/HttpClient.ts +0 -0
  23. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  24. package/src/infrastructure/http/index.ts +0 -0
  25. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  26. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  27. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  28. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  29. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  30. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  31. package/src/lib/ads/monoid.ts +0 -0
  32. package/src/lib/ads/semigroup.ts +0 -0
  33. package/src/lib/brands.ts +0 -0
  34. package/src/lib/lastUpdated.js +0 -0
  35. package/src/lib/sanity/filter.ts +0 -0
  36. package/src/lib/sanity/query.ts +0 -0
  37. package/src/services/api/types.js +0 -0
  38. package/src/services/api/types.ts +0 -0
  39. package/src/services/awards/award-callbacks.js +0 -0
  40. package/src/services/awards/award-query.js +0 -0
  41. package/src/services/awards/internal/.indexignore +0 -0
  42. package/src/services/awards/internal/award-definitions.js +0 -0
  43. package/src/services/awards/internal/award-events.js +0 -0
  44. package/src/services/awards/internal/award-manager.js +0 -0
  45. package/src/services/awards/internal/certificate-builder.js +0 -0
  46. package/src/services/awards/internal/completion-data-generator.js +0 -0
  47. package/src/services/awards/internal/content-progress-observer.js +0 -0
  48. package/src/services/awards/internal/image-utils.js +0 -0
  49. package/src/services/awards/internal/message-generator.js +0 -0
  50. package/src/services/awards/internal/types.js +0 -0
  51. package/src/services/awards/types.d.ts +0 -0
  52. package/src/services/awards/types.js +0 -0
  53. package/src/services/config.js +0 -0
  54. package/src/services/content/artist.ts +0 -0
  55. package/src/services/content/content.ts +0 -0
  56. package/src/services/content/genre.ts +0 -0
  57. package/src/services/content/instructor.ts +0 -0
  58. package/src/services/content-org/content-org.js +0 -0
  59. package/src/services/content-org/guided-courses.ts +0 -0
  60. package/src/services/content-org/learning-paths.ts +64 -48
  61. package/src/services/content-org/playlists-types.js +0 -0
  62. package/src/services/content-org/playlists.js +0 -0
  63. package/src/services/content.js +0 -0
  64. package/src/services/contentAggregator.js +0 -0
  65. package/src/services/contentLikes.js +0 -0
  66. package/src/services/contentProgress.js +20 -10
  67. package/src/services/dataContext.js +0 -0
  68. package/src/services/dateUtils.js +0 -0
  69. package/src/services/eventsAPI.js +0 -0
  70. package/src/services/forums/categories.ts +0 -0
  71. package/src/services/forums/forums.ts +0 -0
  72. package/src/services/forums/posts.ts +0 -0
  73. package/src/services/forums/threads.ts +0 -0
  74. package/src/services/forums/types.ts +0 -0
  75. package/src/services/gamification/awards.ts +0 -0
  76. package/src/services/gamification/gamification.js +0 -0
  77. package/src/services/imageSRCBuilder.js +0 -0
  78. package/src/services/imageSRCVerify.js +0 -0
  79. package/src/services/liveTesting.ts +0 -0
  80. package/src/services/permissions/PermissionsAdapter.ts +0 -0
  81. package/src/services/permissions/PermissionsAdapterFactory.ts +0 -0
  82. package/src/services/permissions/PermissionsV1Adapter.ts +0 -0
  83. package/src/services/permissions/PermissionsV2Adapter.ts +0 -0
  84. package/src/services/permissions/README.md +0 -0
  85. package/src/services/permissions/index.ts +0 -0
  86. package/src/services/progress-events.js +0 -0
  87. package/src/services/progress-row/base.js +7 -3
  88. package/src/services/progress-row/rows/.indexignore +0 -0
  89. package/src/services/progress-row/rows/content-card.js +0 -0
  90. package/src/services/progress-row/rows/method-card.js +1 -1
  91. package/src/services/progress-row/rows/playlist-card.js +0 -0
  92. package/src/services/railcontent.js +0 -0
  93. package/src/services/recommendations.js +0 -0
  94. package/src/services/reporting/README.md +0 -0
  95. package/src/services/reporting/reporting.ts +0 -0
  96. package/src/services/reporting/types.ts +0 -0
  97. package/src/services/sanity.js +1 -1
  98. package/src/services/sentry/.indexignore +0 -0
  99. package/src/services/sentry/index.ts +0 -0
  100. package/src/services/sync/.indexignore +0 -0
  101. package/src/services/sync/adapters/factory.ts +0 -0
  102. package/src/services/sync/adapters/lokijs.ts +0 -0
  103. package/src/services/sync/adapters/sqlite.ts +0 -0
  104. package/src/services/sync/context/index.ts +0 -0
  105. package/src/services/sync/context/providers/base.ts +0 -0
  106. package/src/services/sync/context/providers/connectivity.ts +0 -0
  107. package/src/services/sync/context/providers/durability.ts +0 -0
  108. package/src/services/sync/context/providers/index.ts +0 -0
  109. package/src/services/sync/context/providers/session.ts +0 -0
  110. package/src/services/sync/context/providers/tabs.ts +0 -0
  111. package/src/services/sync/context/providers/visibility.ts +0 -0
  112. package/src/services/sync/database/factory.ts +0 -0
  113. package/src/services/sync/effects/index.ts +0 -0
  114. package/src/services/sync/effects/logout-warning.ts +0 -0
  115. package/src/services/sync/errors/boundary.ts +0 -0
  116. package/src/services/sync/errors/index.ts +0 -0
  117. package/src/services/sync/errors/validators.ts +0 -0
  118. package/src/services/sync/fetch.ts +0 -0
  119. package/src/services/sync/index.ts +0 -0
  120. package/src/services/sync/manager.ts +0 -0
  121. package/src/services/sync/models/Base.ts +0 -0
  122. package/src/services/sync/models/ContentLike.ts +0 -0
  123. package/src/services/sync/models/ContentProgress.ts +0 -0
  124. package/src/services/sync/models/Practice.ts +0 -0
  125. package/src/services/sync/models/PracticeDayNote.ts +0 -0
  126. package/src/services/sync/models/UserAwardProgress.ts +0 -0
  127. package/src/services/sync/models/index.ts +0 -0
  128. package/src/services/sync/repositories/base.ts +2 -16
  129. package/src/services/sync/repositories/content-likes.ts +0 -0
  130. package/src/services/sync/repositories/content-progress.ts +7 -4
  131. package/src/services/sync/repositories/index.ts +0 -0
  132. package/src/services/sync/repositories/practice-day-notes.ts +0 -0
  133. package/src/services/sync/repositories/practices.ts +0 -0
  134. package/src/services/sync/repositories/user-award-progress.ts +0 -0
  135. package/src/services/sync/repository-proxy.ts +0 -0
  136. package/src/services/sync/resolver.ts +0 -0
  137. package/src/services/sync/retry.ts +0 -0
  138. package/src/services/sync/run-scope.ts +0 -0
  139. package/src/services/sync/schema/index.ts +0 -0
  140. package/src/services/sync/serializers/index.ts +0 -0
  141. package/src/services/sync/serializers/model.ts +0 -0
  142. package/src/services/sync/serializers/raw.ts +0 -0
  143. package/src/services/sync/store/index.ts +4 -2
  144. package/src/services/sync/store/push-coalescer.ts +0 -0
  145. package/src/services/sync/store-configs.ts +0 -0
  146. package/src/services/sync/strategies/base.ts +0 -0
  147. package/src/services/sync/strategies/index.ts +0 -0
  148. package/src/services/sync/strategies/initial.ts +0 -0
  149. package/src/services/sync/strategies/polling.ts +0 -0
  150. package/src/services/sync/telemetry/flood-prevention.ts +0 -0
  151. package/src/services/sync/telemetry/index.ts +0 -0
  152. package/src/services/sync/telemetry/sampling.ts +0 -0
  153. package/src/services/sync/utils/event-emitter.ts +0 -0
  154. package/src/services/sync/utils/index.ts +0 -0
  155. package/src/services/sync/utils/throttle.ts +0 -0
  156. package/src/services/sync/utils/timers.ts +0 -0
  157. package/src/services/types.js +0 -0
  158. package/src/services/urlBuilder.ts +0 -0
  159. package/src/services/user/chat.js +0 -0
  160. package/src/services/user/interests.js +0 -0
  161. package/src/services/user/management.js +0 -0
  162. package/src/services/user/memberships.ts +0 -0
  163. package/src/services/user/notifications.js +0 -0
  164. package/src/services/user/onboarding.ts +0 -0
  165. package/src/services/user/payments.ts +0 -0
  166. package/src/services/user/permissions.js +0 -0
  167. package/src/services/user/profile.js +0 -0
  168. package/src/services/user/sessions.js +0 -0
  169. package/src/services/user/types.d.ts +0 -0
  170. package/src/services/user/types.js +0 -0
  171. package/src/services/user/user-management-system.js +0 -0
  172. package/src/services/userActivity.js +0 -0
  173. package/test/HttpClient.test.js +0 -0
  174. package/test/awards/award-alacarte-observer.test.js +0 -0
  175. package/test/awards/award-auto-refresh.test.js +0 -0
  176. package/test/awards/award-calculations.test.js +0 -0
  177. package/test/awards/award-certificate-display.test.js +0 -0
  178. package/test/awards/award-collection-edge-cases.test.js +0 -0
  179. package/test/awards/award-collection-filtering.test.js +0 -0
  180. package/test/awards/award-completion-flow.test.js +0 -0
  181. package/test/awards/award-exclusion-handling.test.js +0 -0
  182. package/test/awards/award-multi-lesson.test.js +0 -0
  183. package/test/awards/award-observer-integration.test.js +0 -0
  184. package/test/awards/award-query-messages.test.js +0 -0
  185. package/test/awards/award-user-collection.test.js +0 -0
  186. package/test/awards/duplicate-prevention.test.js +0 -0
  187. package/test/awards/helpers/completion-mock.js +0 -0
  188. package/test/awards/helpers/index.js +0 -0
  189. package/test/awards/helpers/mock-setup.js +0 -0
  190. package/test/awards/helpers/progress-emitter.js +0 -0
  191. package/test/awards/message-generator.test.js +0 -0
  192. package/test/content.test.js +0 -0
  193. package/test/contentLikes.test.js +0 -0
  194. package/test/contentProgress.test.js +0 -0
  195. package/test/dataContext.test.js +0 -0
  196. package/test/forum.test.js +0 -0
  197. package/test/imageSRCBuilder.test.js +0 -0
  198. package/test/imageSRCVerify.test.js +0 -0
  199. package/test/initializeTests.js +0 -0
  200. package/test/learningPaths.test.js +0 -0
  201. package/test/lib/__snapshots__/filter.test.ts.snap +0 -0
  202. package/test/lib/filter.test.ts +0 -0
  203. package/test/lib/lastUpdated.test.js +0 -0
  204. package/test/lib/query.test.ts +0 -0
  205. package/test/live/contentProgressLive.test.js +0 -0
  206. package/test/live/railcontentLive.test.js +0 -0
  207. package/test/localStorageMock.js +0 -0
  208. package/test/log.js +0 -0
  209. package/test/mockData/award-definitions.js +0 -0
  210. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  211. package/test/mockData/mockData_progress_content.json +0 -0
  212. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  213. package/test/mockData/mockData_user_practices.json +0 -0
  214. package/test/notifications.test.js +0 -0
  215. package/test/progressRows.test.js +0 -0
  216. package/test/sanityQueryService.test.js +0 -0
  217. package/test/streakMessage.test.js +0 -0
  218. package/test/sync/adapter.ts +0 -0
  219. package/test/sync/initialize-sync-manager.js +0 -0
  220. package/test/sync/models/award-database-integration.test.js +0 -0
  221. package/test/user/permissions.test.js +0 -0
  222. package/test/userActivity.test.js +0 -0
  223. package/tools/generate-index.cjs +0 -0
  224. package/.claude/settings.local.json +0 -16
  225. package/.yarnrc.yml +0 -1
  226. package/check_content.js +0 -30
  227. package/check_content.mjs +0 -32
  228. package/test/logout.test.js +0 -199
  229. package/test/reporting.test.js +0 -132
  230. package/test_owned_navigate.js +0 -74
  231. package/tsconfig.json +0 -17
@@ -1192,7 +1192,7 @@ export async function fetchLiveEvent(brand, forcedContentId = null) {
1192
1192
  forcedContentId !== null
1193
1193
  ? `railcontent_id == ${forcedContentId}`
1194
1194
  : `status == 'scheduled'
1195
- && brand == '${brand}'
1195
+ && (brand == '${brand}' || live_global_event == true)
1196
1196
  && defined(live_event_start_time)
1197
1197
  && live_event_start_time <= '${getSanityDate(startDateTemp, false)}'
1198
1198
  && live_event_end_time >= '${getSanityDate(endDateTemp, false)}'`
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
@@ -100,13 +100,6 @@ export default class SyncRepository<TModel extends BaseModel> {
100
100
  )
101
101
  }
102
102
 
103
- protected async upsertOneTentative(id: RecordId, builder: (record: TModel) => void) {
104
- return this.store.telemetry.trace(
105
- { name: `upsertOneTentative:${this.store.model.table}`, op: 'upsert', attributes: { ...this.context.session.toJSON() } },
106
- (span) => this._respondToWrite(() => this.store.upsertOneTentative(id, builder, span), span)
107
- )
108
- }
109
-
110
103
  protected async upsertSome(builders: Record<RecordId, (record: TModel) => void>, { skipPush = false } = {}) {
111
104
  return this.store.telemetry.trace(
112
105
  { name: `upsertSome:${this.store.model.table}`, op: 'upsert', attributes: { ...this.context.session.toJSON() } },
@@ -114,13 +107,6 @@ export default class SyncRepository<TModel extends BaseModel> {
114
107
  )
115
108
  }
116
109
 
117
- protected async upsertSomeTentative(builders: Record<RecordId, (record: TModel) => void>, { skipPush = false } = {}) {
118
- return this.store.telemetry.trace(
119
- { name: `upsertSomeTentative:${this.store.model.table}`, op: 'upsert', attributes: { ...this.context.session.toJSON() } },
120
- (span) => this._respondToWrite(() => this.store.upsertSomeTentative(builders, span, {skipPush}), span)
121
- )
122
- }
123
-
124
110
  protected async deleteOne(id: RecordId, { skipPush = false } = {}) {
125
111
  return this.store.telemetry.trace(
126
112
  { name: `delete:${this.store.model.table}`, op: 'delete', attributes: { ...this.context.session.toJSON() } },
@@ -128,10 +114,10 @@ export default class SyncRepository<TModel extends BaseModel> {
128
114
  )
129
115
  }
130
116
 
131
- protected async deleteSome(ids: RecordId[]) {
117
+ protected async deleteSome(ids: RecordId[], { skipPush = false } = {}) {
132
118
  return this.store.telemetry.trace(
133
119
  { name: `deleteSome:${this.store.model.table}`, op: 'delete', attributes: { ...this.context.session.toJSON() } },
134
- (span) => this._respondToWriteIds(() => this.store.deleteSome(ids, span), span)
120
+ (span) => this._respondToWriteIds(() => this.store.deleteSome(ids, span, {skipPush}), span)
135
121
  )
136
122
  }
137
123
 
File without changes
@@ -187,7 +187,7 @@ export default class ProgressRepository extends SyncRepository<ContentProgress>
187
187
  recordProgressMany(
188
188
  contentProgresses: Record<string, number>, // Accept plain object
189
189
  collection: CollectionParameter | null,
190
- { tentative = true, skipPush = false, fromLearningPath = false }: { tentative?: boolean; skipPush?: boolean; fromLearningPath?: boolean } = {}
190
+ { skipPush = false, fromLearningPath = false }: { skipPush?: boolean; fromLearningPath?: boolean } = {}
191
191
  ) {
192
192
  if (collection?.type === COLLECTION_TYPE.LEARNING_PATH) {
193
193
  fromLearningPath = true
@@ -209,9 +209,7 @@ export default class ProgressRepository extends SyncRepository<ContentProgress>
209
209
  },
210
210
  ])
211
211
  )
212
- return tentative
213
- ? this.upsertSomeTentative(data, { skipPush })
214
- : this.upsertSome(data, { skipPush })
212
+ return this.upsertSome(data, { skipPush })
215
213
 
216
214
  //todo add event emitting for bulk updates?
217
215
  }
@@ -220,6 +218,11 @@ export default class ProgressRepository extends SyncRepository<ContentProgress>
220
218
  return this.deleteOne(ProgressRepository.generateId(contentId, collection), { skipPush })
221
219
  }
222
220
 
221
+ eraseProgressMany(contentIds: number[], collection: CollectionParameter | null, {skipPush = false} = {}) {
222
+ const ids = contentIds.map((id) => ProgressRepository.generateId(id, collection))
223
+ return this.deleteSome(ids, { skipPush })
224
+ }
225
+
223
226
  private static generateId(
224
227
  contentId: number,
225
228
  collection: CollectionParameter | null
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
@@ -354,7 +354,7 @@ export default class SyncStore<TModel extends BaseModel = BaseModel> {
354
354
  })
355
355
  }
356
356
 
357
- async deleteSome(ids: RecordId[], span?: Span) {
357
+ async deleteSome(ids: RecordId[], span?: Span, { skipPush = false } = {}) {
358
358
  return this.runScope.abortable(async () => {
359
359
  await this.telemeterizedWrite(span, async writer => {
360
360
  const existing = await this.queryRecords(Q.where('id', Q.oneOf(ids)))
@@ -364,7 +364,9 @@ export default class SyncStore<TModel extends BaseModel = BaseModel> {
364
364
 
365
365
  this.emit('deleted', ids)
366
366
 
367
- this.pushUnsyncedWithRetry(span)
367
+ if (!skipPush) {
368
+ this.pushUnsyncedWithRetry(span)
369
+ }
368
370
  await this.ensurePersistence()
369
371
 
370
372
  return ids
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
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
File without changes
File without changes
File without changes
@@ -1,16 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Read(//app/musora-platform-backend/**)",
5
- "Read(//app/musora-platform-frontend/**)",
6
- "Bash(find:*)",
7
- "Bash(sed:*)",
8
- "Read(//app/**)",
9
- "Bash(cat:*)",
10
- "Bash(docker exec:*)",
11
- "Bash(npm config:*)"
12
- ],
13
- "deny": [],
14
- "ask": []
15
- }
16
- }
package/.yarnrc.yml DELETED
@@ -1 +0,0 @@
1
- nodeLinker: node-modules
package/check_content.js DELETED
@@ -1,30 +0,0 @@
1
- const { initializeService } = require('./src/services/config.js');
2
- const { fetchByRailContentIds } = require('./src/services/sanity.js');
3
- require('dotenv/config');
4
-
5
- async function checkContent() {
6
- initializeService({
7
- sanityConfig: {
8
- token: process.env.SANITY_TOKEN,
9
- projectId: process.env.SANITY_PROJECT_ID,
10
- dataset: process.env.SANITY_DATASET,
11
- version: process.env.SANITY_VERSION || '2021-06-07',
12
- },
13
- railcontentConfig: {
14
- token: process.env.RAILCONTENT_TOKEN,
15
- userId: process.env.RAILCONTENT_USER_ID,
16
- baseUrl: process.env.RAILCONTENT_BASE_URL,
17
- authToken: process.env.RAILCONTENT_AUTH_TOKEN,
18
- },
19
- baseUrl: process.env.RAILCONTENT_BASE_URL,
20
- localStorage: null,
21
- isMA: false,
22
- });
23
-
24
- console.log('Checking railcontent_id: 421814');
25
- const contents = await fetchByRailContentIds([421814]);
26
- console.log('Results:', JSON.stringify(contents, null, 2));
27
- console.log('Found:', contents.length, 'items');
28
- }
29
-
30
- checkContent().catch(console.error);
package/check_content.mjs DELETED
@@ -1,32 +0,0 @@
1
- import { initializeService } from './src/services/config.js';
2
- import { fetchByRailContentIds } from './src/services/sanity.js';
3
- import dotenv from 'dotenv';
4
-
5
- dotenv.config();
6
-
7
- async function checkContent() {
8
- initializeService({
9
- sanityConfig: {
10
- token: process.env.SANITY_TOKEN,
11
- projectId: process.env.SANITY_PROJECT_ID,
12
- dataset: process.env.SANITY_DATASET,
13
- version: process.env.SANITY_VERSION || '2021-06-07',
14
- },
15
- railcontentConfig: {
16
- token: process.env.RAILCONTENT_TOKEN,
17
- userId: process.env.RAILCONTENT_USER_ID,
18
- baseUrl: process.env.RAILCONTENT_BASE_URL,
19
- authToken: process.env.RAILCONTENT_AUTH_TOKEN,
20
- },
21
- baseUrl: process.env.RAILCONTENT_BASE_URL,
22
- localStorage: null,
23
- isMA: false,
24
- });
25
-
26
- console.log('Checking railcontent_id: 421814');
27
- const contents = await fetchByRailContentIds([421814]);
28
- console.log('Results:', JSON.stringify(contents, null, 2));
29
- console.log('Found:', contents.length, 'items');
30
- }
31
-
32
- checkContent().catch(console.error);