musora-content-services 2.93.2 → 2.94.1

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 (149) hide show
  1. package/.claude/settings.local.json +8 -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/node.js.yml +0 -0
  7. package/.prettierignore +0 -0
  8. package/.prettierrc +0 -0
  9. package/.yarnrc.yml +1 -0
  10. package/CHANGELOG.md +17 -0
  11. package/README.md +0 -0
  12. package/jest.config.js +0 -0
  13. package/jsdoc.json +0 -0
  14. package/package.json +1 -1
  15. package/src/contentMetaData.js +0 -0
  16. package/src/filterBuilder.js +0 -0
  17. package/src/infrastructure/http/HttpClient.ts +0 -0
  18. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  19. package/src/infrastructure/http/index.ts +0 -0
  20. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  21. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  22. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  23. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  24. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  25. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  26. package/src/lib/httpHelper.js +0 -0
  27. package/src/lib/lastUpdated.js +0 -0
  28. package/src/lib/sanity/query.ts +0 -0
  29. package/src/services/api/types.js +0 -0
  30. package/src/services/api/types.ts +0 -0
  31. package/src/services/config.js +1 -1
  32. package/src/services/content/content.ts +0 -0
  33. package/src/services/content-org/content-org.js +0 -0
  34. package/src/services/content-org/guided-courses.ts +0 -0
  35. package/src/services/content-org/playlists-types.js +0 -0
  36. package/src/services/content-org/playlists.js +0 -0
  37. package/src/services/content.js +0 -0
  38. package/src/services/contentAggregator.js +0 -0
  39. package/src/services/contentLikes.js +0 -0
  40. package/src/services/dataContext.js +0 -0
  41. package/src/services/dateUtils.js +0 -0
  42. package/src/services/eventsAPI.js +0 -0
  43. package/src/services/forums/categories.ts +0 -0
  44. package/src/services/forums/forums.ts +0 -0
  45. package/src/services/forums/posts.ts +0 -0
  46. package/src/services/forums/threads.ts +0 -0
  47. package/src/services/forums/types.ts +0 -0
  48. package/src/services/gamification/awards.ts +0 -0
  49. package/src/services/gamification/gamification.js +0 -0
  50. package/src/services/imageSRCBuilder.js +0 -0
  51. package/src/services/imageSRCVerify.js +0 -0
  52. package/src/services/liveTesting.ts +0 -0
  53. package/src/services/permissions/PermissionsAdapter.ts +0 -0
  54. package/src/services/permissions/PermissionsAdapterFactory.ts +0 -0
  55. package/src/services/permissions/PermissionsV1Adapter.ts +0 -0
  56. package/src/services/permissions/README.md +0 -0
  57. package/src/services/permissions/index.ts +0 -0
  58. package/src/services/progress-row/method-card.js +1 -1
  59. package/src/services/railcontent.js +0 -0
  60. package/src/services/recommendations.js +0 -0
  61. package/src/services/reporting/README.md +0 -0
  62. package/src/services/reporting/types.ts +0 -0
  63. package/src/services/sanity.js +3 -0
  64. package/src/services/sentry/.indexignore +0 -0
  65. package/src/services/sentry/index.ts +0 -0
  66. package/src/services/sync/.indexignore +0 -0
  67. package/src/services/sync/adapters/factory.ts +0 -0
  68. package/src/services/sync/adapters/lokijs.ts +0 -0
  69. package/src/services/sync/adapters/sqlite.ts +0 -0
  70. package/src/services/sync/concurrency-safety.ts +0 -0
  71. package/src/services/sync/context/index.ts +0 -0
  72. package/src/services/sync/context/providers/base.ts +0 -0
  73. package/src/services/sync/context/providers/connectivity.ts +0 -0
  74. package/src/services/sync/context/providers/durability.ts +0 -0
  75. package/src/services/sync/context/providers/index.ts +0 -0
  76. package/src/services/sync/context/providers/session.ts +0 -0
  77. package/src/services/sync/context/providers/tabs.ts +0 -0
  78. package/src/services/sync/context/providers/visibility.ts +0 -0
  79. package/src/services/sync/database/factory.ts +0 -0
  80. package/src/services/sync/errors/index.ts +0 -0
  81. package/src/services/sync/index.ts +0 -0
  82. package/src/services/sync/models/Base.ts +0 -0
  83. package/src/services/sync/models/ContentLike.ts +0 -0
  84. package/src/services/sync/models/Practice.ts +0 -0
  85. package/src/services/sync/models/PracticeDayNote.ts +0 -0
  86. package/src/services/sync/models/index.ts +0 -0
  87. package/src/services/sync/repositories/base.ts +0 -0
  88. package/src/services/sync/repositories/content-likes.ts +0 -0
  89. package/src/services/sync/repositories/index.ts +0 -0
  90. package/src/services/sync/repositories/practice-day-notes.ts +0 -0
  91. package/src/services/sync/repositories/practices.ts +0 -0
  92. package/src/services/sync/resolver.ts +0 -0
  93. package/src/services/sync/run-scope.ts +0 -0
  94. package/src/services/sync/schema/index.ts +0 -0
  95. package/src/services/sync/serializers/index.ts +0 -0
  96. package/src/services/sync/serializers/model.ts +0 -0
  97. package/src/services/sync/serializers/raw.ts +0 -0
  98. package/src/services/sync/store/push-coalescer.ts +0 -0
  99. package/src/services/sync/store-configs.ts +0 -0
  100. package/src/services/sync/strategies/base.ts +0 -0
  101. package/src/services/sync/strategies/index.ts +0 -0
  102. package/src/services/sync/strategies/initial.ts +0 -0
  103. package/src/services/sync/strategies/polling.ts +0 -0
  104. package/src/services/sync/utils/event-emitter.ts +0 -0
  105. package/src/services/sync/utils/index.ts +0 -0
  106. package/src/services/sync/utils/throttle.ts +0 -0
  107. package/src/services/sync/utils/timers.ts +0 -0
  108. package/src/services/types.js +0 -0
  109. package/src/services/user/account.ts +0 -0
  110. package/src/services/user/chat.js +0 -0
  111. package/src/services/user/interests.js +0 -0
  112. package/src/services/user/management.js +0 -0
  113. package/src/services/user/memberships.ts +0 -0
  114. package/src/services/user/notifications.js +0 -0
  115. package/src/services/user/payments.ts +0 -0
  116. package/src/services/user/permissions.js +0 -0
  117. package/src/services/user/profile.js +0 -0
  118. package/src/services/user/sessions.js +0 -0
  119. package/src/services/user/types.d.ts +0 -0
  120. package/src/services/user/types.js +0 -0
  121. package/src/services/user/user-management-system.js +0 -0
  122. package/src/services/userActivity.js +1 -1
  123. package/test/HttpClient.test.js +0 -0
  124. package/test/content.test.js +0 -0
  125. package/test/contentLikes.test.js +0 -0
  126. package/test/contentProgress.test.js +0 -0
  127. package/test/dataContext.test.js +0 -0
  128. package/test/forum.test.js +0 -0
  129. package/test/imageSRCBuilder.test.js +0 -0
  130. package/test/imageSRCVerify.test.js +0 -0
  131. package/test/initializeTests.js +0 -0
  132. package/test/learningPaths.test.js +0 -0
  133. package/test/lib/lastUpdated.test.js +0 -0
  134. package/test/live/contentProgressLive.test.js +0 -0
  135. package/test/live/railcontentLive.test.js +0 -0
  136. package/test/localStorageMock.js +0 -0
  137. package/test/log.js +0 -0
  138. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  139. package/test/mockData/mockData_progress_content.json +0 -0
  140. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  141. package/test/mockData/mockData_user_practices.json +0 -0
  142. package/test/notifications.test.js +0 -0
  143. package/test/progressRows.test.js +0 -0
  144. package/test/reporting.test.js +132 -0
  145. package/test/sanityQueryService.test.js +0 -0
  146. package/test/streakMessage.test.js +0 -0
  147. package/test/user/permissions.test.js +0 -0
  148. package/test/userActivity.test.js +0 -0
  149. package/tools/generate-index.cjs +0 -0
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(rg:*)",
5
- "Bash(npm run lint:*)"
4
+ "Read(//app/musora-platform-backend/**)",
5
+ "Read(//app/musora-platform-frontend/**)",
6
+ "Bash(find:*)",
7
+ "Bash(sed:*)",
8
+ "Read(//app/**)",
9
+ "Bash(cat:*)"
6
10
  ],
7
- "deny": []
11
+ "deny": [],
12
+ "ask": []
8
13
  }
9
14
  }
package/.coderabbit.yaml CHANGED
File without changes
package/.editorconfig CHANGED
File without changes
File without changes
File without changes
File without changes
package/.prettierignore CHANGED
File without changes
package/.prettierrc CHANGED
File without changes
package/.yarnrc.yml ADDED
@@ -0,0 +1 @@
1
+ nodeLinker: node-modules
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
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.94.1](https://github.com/railroadmedia/musora-content-services/compare/v2.94.0...v2.94.1) (2025-12-03)
6
+
7
+ ## [2.94.0](https://github.com/railroadmedia/musora-content-services/compare/v2.92.6...v2.94.0) (2025-12-03)
8
+
9
+
10
+ ### Features
11
+
12
+ * **BEH-1192:** revise fetchLearningPathProgressCheckLessons ([#604](https://github.com/railroadmedia/musora-content-services/issues/604)) ([db8cb70](https://github.com/railroadmedia/musora-content-services/commit/db8cb70ed70f4341fdd4651cdd3fea2b8047dc21))
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **agi:** make brand parameter less strict for now ([#603](https://github.com/railroadmedia/musora-content-services/issues/603)) ([b440b92](https://github.com/railroadmedia/musora-content-services/commit/b440b92ae1b4aab80d7e5ac5238c1e386cf09db8))
18
+ * method progress card subtitle ([#608](https://github.com/railroadmedia/musora-content-services/issues/608)) ([3bbfb56](https://github.com/railroadmedia/musora-content-services/commit/3bbfb56fce08e0753e7708bdf2d1356000b1c398))
19
+ * progress fixes and features with watermelon ([#607](https://github.com/railroadmedia/musora-content-services/issues/607)) ([005403c](https://github.com/railroadmedia/musora-content-services/commit/005403c9bbaeebe8c5ecb5315754de4448bcbf43))
20
+ * Pull in permission_v2 ([#602](https://github.com/railroadmedia/musora-content-services/issues/602)) ([289e32d](https://github.com/railroadmedia/musora-content-services/commit/289e32d08bd3a6448191b9f6034801e4cf8d40e5))
21
+
5
22
  ### [2.93.2](https://github.com/railroadmedia/musora-content-services/compare/v2.93.1...v2.93.2) (2025-12-02)
6
23
 
7
24
 
package/README.md CHANGED
File without changes
package/jest.config.js CHANGED
File without changes
package/jsdoc.json CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musora-content-services",
3
- "version": "2.93.2",
3
+ "version": "2.94.1",
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -12,7 +12,7 @@ export let globalConfig = {
12
12
  localStorage: null,
13
13
  isMA: false,
14
14
  localTimezoneString: null, // In format: America/Vancouver
15
- permissionsVersion: 'v1', // 'v1' or 'v2'
15
+ permissionsVersion: 'v2', // 'v1' or 'v2'
16
16
  }
17
17
 
18
18
  /**
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
@@ -6,7 +6,7 @@ import { getActivePath, fetchLearningPathLessons } from '../content-org/learning
6
6
  import { getToday } from '../dateUtils.js'
7
7
  import { fetchMethodV2IntroVideo } from '../sanity'
8
8
  import { getProgressState } from '../contentProgress'
9
- import {COLLECTION_TYPE} from "../sync/models/ContentProgress.js";
9
+ import {COLLECTION_TYPE} from "../sync/models/ContentProgress";
10
10
 
11
11
  export async function getMethodCard(brand) {
12
12
  const introVideo = await fetchMethodV2IntroVideo(brand)
File without changes
File without changes
File without changes
File without changes
@@ -299,6 +299,7 @@ export async function fetchNewReleases(
299
299
  "image": thumbnail.asset->url,
300
300
  "thumbnail": thumbnail.asset->url,
301
301
  ${artistOrInstructorName()},
302
+ "instructor": ${instructorField},
302
303
  "artists": instructor[]->name,
303
304
  difficulty,
304
305
  difficulty_string,
@@ -337,6 +338,7 @@ export async function fetchUpcomingEvents(brand, { page = 1, limit = 10 } = {})
337
338
  "thumbnail": thumbnail.asset->url,
338
339
  ${artistOrInstructorName()},
339
340
  "artists": instructor[]->name,
341
+ "instructor": ${instructorField},
340
342
  difficulty,
341
343
  difficulty_string,
342
344
  length_in_seconds,
@@ -388,6 +390,7 @@ export async function fetchScheduledReleases(brand, { page = 1, limit = 10 }) {
388
390
  "image": thumbnail.asset->url,
389
391
  "thumbnail": thumbnail.asset->url,
390
392
  ${artistOrInstructorName()},
393
+ "instructor": ${instructorField},
391
394
  "artists": instructor[]->name,
392
395
  difficulty,
393
396
  difficulty_string,
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
@@ -40,7 +40,7 @@ import dayjs from 'dayjs'
40
40
  import { addContextToContent } from './contentAggregator.js'
41
41
  import { getMethodCard } from './progress-row/method-card.js'
42
42
  import { db, Q } from './sync'
43
- import {COLLECTION_TYPE} from "./sync/models/ContentProgress.js";
43
+ import {COLLECTION_TYPE} from "./sync/models/ContentProgress";
44
44
 
45
45
  const DATA_KEY_PRACTICES = 'practices'
46
46
 
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
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Tests for Reporting Service
3
+ *
4
+ * Note: These tests use mocked HTTP calls. For integration tests,
5
+ * ensure the backend API is running at the configured baseUrl.
6
+ */
7
+
8
+ import { initializeTestService } from './initializeTests.js'
9
+ import {
10
+ reportContent,
11
+ reportForumPost,
12
+ submitReport
13
+ } from '../src/services/reporting/reporting.ts'
14
+
15
+ // Mock HttpClient to avoid actual API calls in tests
16
+ jest.mock('../src/infrastructure/http/HttpClient', () => {
17
+ return {
18
+ HttpClient: jest.fn().mockImplementation(() => ({
19
+ post: jest.fn().mockResolvedValue({
20
+ report_id: 12345,
21
+ message: 'Report submitted successfully',
22
+ is_duplicate: false
23
+ })
24
+ }))
25
+ }
26
+ })
27
+
28
+ describe('Reporting Service', () => {
29
+ beforeEach(() => {
30
+ initializeTestService()
31
+ })
32
+
33
+ describe('reportContent', () => {
34
+ test('should submit a content report with video_not_working category', async () => {
35
+ const result = await reportContent({
36
+ contentId: 123,
37
+ category: 'video_not_working',
38
+ description: 'Video freezes at 2:30'
39
+ })
40
+
41
+ expect(result).toBeDefined()
42
+ expect(result.report_id).toBe(12345)
43
+ expect(result.message).toBe('Report submitted successfully')
44
+ expect(result.is_duplicate).toBe(false)
45
+ })
46
+
47
+ test('should submit a content report without description', async () => {
48
+ const result = await reportContent({
49
+ contentId: 456,
50
+ category: 'incorrect_content'
51
+ })
52
+
53
+ expect(result).toBeDefined()
54
+ expect(result.report_id).toBeDefined()
55
+ })
56
+
57
+ test('should submit a content report with other category and description', async () => {
58
+ const result = await reportContent({
59
+ contentId: 789,
60
+ category: 'other',
61
+ description: 'Audio quality is very poor'
62
+ })
63
+
64
+ expect(result).toBeDefined()
65
+ expect(result.report_id).toBeDefined()
66
+ expect(result.message).toBeDefined()
67
+ })
68
+ })
69
+
70
+ describe('reportForumPost', () => {
71
+ test('should submit a forum post report with required brand', async () => {
72
+ const result = await reportForumPost({
73
+ postId: 555,
74
+ brand: 'drumeo',
75
+ category: 'spam'
76
+ })
77
+
78
+ expect(result).toBeDefined()
79
+ expect(result.report_id).toBeDefined()
80
+ })
81
+
82
+ test('should submit a forum post report with description', async () => {
83
+ const result = await reportForumPost({
84
+ postId: 666,
85
+ brand: 'pianote',
86
+ category: 'harassment',
87
+ description: 'User is harassing other members'
88
+ })
89
+
90
+ expect(result).toBeDefined()
91
+ expect(result.report_id).toBeDefined()
92
+ expect(result.message).toBeDefined()
93
+ })
94
+ })
95
+
96
+ describe('submitReport', () => {
97
+ test('should submit a generic report for content', async () => {
98
+ const result = await submitReport({
99
+ reportableType: 'content',
100
+ reportableId: 999,
101
+ category: 'technical_issue',
102
+ description: 'Page not loading'
103
+ })
104
+
105
+ expect(result).toBeDefined()
106
+ expect(result.report_id).toBeDefined()
107
+ })
108
+
109
+ test('should submit a generic report for playlist', async () => {
110
+ const result = await submitReport({
111
+ reportableType: 'playlist',
112
+ reportableId: 777,
113
+ category: 'incorrect_content'
114
+ })
115
+
116
+ expect(result).toBeDefined()
117
+ expect(result.report_id).toBeDefined()
118
+ })
119
+
120
+ test('should submit a generic report for comment', async () => {
121
+ const result = await submitReport({
122
+ reportableType: 'comment',
123
+ reportableId: 888,
124
+ category: 'inappropriate',
125
+ description: 'Comment contains offensive language'
126
+ })
127
+
128
+ expect(result).toBeDefined()
129
+ expect(result.report_id).toBeDefined()
130
+ })
131
+ })
132
+ })
File without changes
File without changes
File without changes
File without changes
File without changes