musora-content-services 2.165.5 → 2.167.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 (342) hide show
  1. package/.agent/decisions/2026-04-28-tma-275-mcs-sanity-add-a-v2-url-segmen.md +0 -0
  2. package/.agent/decisions/2026-05-19-content-progress-ts-part-2.md +0 -0
  3. package/.agent/decisions/2026-05-20-live-event-fetch-permissions-id.md +0 -0
  4. package/.claude/settings.local.json +19 -47
  5. package/.coderabbit.yaml +0 -0
  6. package/.editorconfig +0 -0
  7. package/.github/pull_request_template.md +0 -0
  8. package/.github/workflows/automated-testing.yml +0 -0
  9. package/.github/workflows/conventional-commits.yaml +0 -0
  10. package/.github/workflows/docs.js.yml +0 -0
  11. package/.prettierignore +0 -0
  12. package/.prettierrc +0 -0
  13. package/CHANGELOG.md +25 -0
  14. package/CLAUDE.md +0 -0
  15. package/README.md +0 -0
  16. package/babel.config.cjs +0 -0
  17. package/codecov.yml +0 -0
  18. package/jest.config.js +0 -0
  19. package/jest.integration.config.js +0 -0
  20. package/jest.live.config.js +0 -0
  21. package/jsdoc.json +0 -0
  22. package/package.json +1 -1
  23. package/src/constants/award-assets.js +12 -9
  24. package/src/constants/membership-permissions.ts +0 -0
  25. package/src/contentMetaData.js +0 -0
  26. package/src/contentTypeConfig.js +8 -1
  27. package/src/filterBuilder.js +0 -0
  28. package/src/index.d.ts +0 -0
  29. package/src/index.js +0 -0
  30. package/src/infrastructure/http/HttpClient.ts +0 -0
  31. package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
  32. package/src/infrastructure/http/index.ts +0 -0
  33. package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
  34. package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
  35. package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
  36. package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
  37. package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
  38. package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
  39. package/src/infrastructure/sanity/README.md +0 -0
  40. package/src/infrastructure/sanity/SanityClient.ts +0 -0
  41. package/src/infrastructure/sanity/clients/ContentClient.ts +0 -0
  42. package/src/infrastructure/sanity/examples/usage.ts +0 -0
  43. package/src/infrastructure/sanity/executors/FetchQueryExecutor.ts +0 -0
  44. package/src/infrastructure/sanity/index.ts +0 -0
  45. package/src/infrastructure/sanity/interfaces/ConfigProvider.ts +0 -0
  46. package/src/infrastructure/sanity/interfaces/FetchByIdOptions.ts +0 -0
  47. package/src/infrastructure/sanity/interfaces/QueryExecutor.ts +0 -0
  48. package/src/infrastructure/sanity/interfaces/SanityConfig.ts +0 -0
  49. package/src/infrastructure/sanity/interfaces/SanityError.ts +0 -0
  50. package/src/infrastructure/sanity/interfaces/SanityQuery.ts +0 -0
  51. package/src/infrastructure/sanity/interfaces/SanityResponse.ts +0 -0
  52. package/src/infrastructure/sanity/providers/DefaultConfigProvider.ts +0 -0
  53. package/src/lib/ads/monoid.ts +0 -0
  54. package/src/lib/ads/semigroup.ts +0 -0
  55. package/src/lib/brands.ts +0 -0
  56. package/src/lib/lastUpdated.js +0 -0
  57. package/src/lib/sanity/decorators/base.ts +0 -0
  58. package/src/lib/sanity/decorators/examples.ts +0 -0
  59. package/src/lib/sanity/decorators/navigate-to.ts +0 -0
  60. package/src/lib/sanity/decorators/need-access.ts +0 -0
  61. package/src/lib/sanity/decorators/need-lifetime-upgrade.ts +0 -0
  62. package/src/lib/sanity/decorators/page-type.ts +0 -0
  63. package/src/lib/sanity/field-access.ts +0 -0
  64. package/src/lib/sanity/filter.ts +0 -0
  65. package/src/lib/sanity/query.ts +0 -0
  66. package/src/services/api/types.js +0 -0
  67. package/src/services/api/types.ts +0 -0
  68. package/src/services/awards/award-callbacks.js +0 -0
  69. package/src/services/awards/award-query.js +0 -0
  70. package/src/services/awards/internal/.indexignore +0 -0
  71. package/src/services/awards/internal/award-definitions.js +0 -0
  72. package/src/services/awards/internal/award-events.js +0 -0
  73. package/src/services/awards/internal/award-manager.js +0 -0
  74. package/src/services/awards/internal/certificate-builder.js +0 -0
  75. package/src/services/awards/internal/completion-data-generator.js +0 -0
  76. package/src/services/awards/internal/content-progress-observer.js +0 -0
  77. package/src/services/awards/internal/image-utils.js +0 -0
  78. package/src/services/awards/internal/message-generator.js +0 -0
  79. package/src/services/awards/internal/types.js +0 -0
  80. package/src/services/awards/types.d.ts +0 -0
  81. package/src/services/awards/types.js +0 -0
  82. package/src/services/config.js +0 -0
  83. package/src/services/content/artist.ts +0 -0
  84. package/src/services/content/content.ts +0 -0
  85. package/src/services/content/genre.ts +0 -0
  86. package/src/services/content/instructor.ts +0 -0
  87. package/src/services/content-org/content-org.js +0 -0
  88. package/src/services/content-org/guided-courses.ts +0 -0
  89. package/src/services/content-org/learning-paths.ts +0 -0
  90. package/src/services/content-org/playlists-types.js +0 -0
  91. package/src/services/content-org/playlists.js +0 -0
  92. package/src/services/content.js +0 -0
  93. package/src/services/contentAggregator.js +0 -0
  94. package/src/services/contentLikes.js +0 -0
  95. package/src/services/contentProgress.js +0 -0
  96. package/src/services/dataContext.js +0 -0
  97. package/src/services/dateUtils.js +0 -0
  98. package/src/services/endScreen/README.md +0 -0
  99. package/src/services/endScreen/endScreen.ts +0 -0
  100. package/src/services/endScreen/types.ts +0 -0
  101. package/src/services/eventsAPI.js +0 -0
  102. package/src/services/forums/categories.ts +0 -0
  103. package/src/services/forums/forums.ts +0 -0
  104. package/src/services/forums/posts.ts +0 -0
  105. package/src/services/forums/threads.ts +0 -0
  106. package/src/services/gamification/awards.ts +0 -0
  107. package/src/services/gamification/gamification.js +0 -0
  108. package/src/services/imageSRCBuilder.js +0 -0
  109. package/src/services/imageSRCVerify.js +0 -0
  110. package/src/services/liveTesting.ts +0 -0
  111. package/src/services/multi-user-accounts/multi-user-accounts.ts +3 -1
  112. package/src/services/offline/activities.ts +0 -0
  113. package/src/services/offline/practices.ts +0 -0
  114. package/src/services/offline/progress.ts +0 -0
  115. package/src/services/permissions/PermissionsAdapter.ts +0 -0
  116. package/src/services/permissions/PermissionsAdapterFactory.ts +0 -0
  117. package/src/services/permissions/PermissionsV1Adapter.ts +0 -0
  118. package/src/services/permissions/PermissionsV2Adapter.ts +0 -0
  119. package/src/services/permissions/README.md +0 -0
  120. package/src/services/permissions/index.ts +0 -0
  121. package/src/services/permissions/permissions.ts +0 -0
  122. package/src/services/permissions/types.d.ts +0 -0
  123. package/src/services/progress/.indexignore +0 -0
  124. package/src/services/progress/collections.ts +0 -0
  125. package/src/services/progress/index.ts +0 -0
  126. package/src/services/progress/internal/bubble.ts +1 -1
  127. package/src/services/progress/internal/queries.ts +25 -7
  128. package/src/services/progress/state.ts +32 -47
  129. package/src/services/progress/types.ts +0 -0
  130. package/src/services/progress/utils.ts +0 -0
  131. package/src/services/progress-events.js +0 -0
  132. package/src/services/progress-row/base.js +0 -0
  133. package/src/services/progress-row/rows/.indexignore +0 -0
  134. package/src/services/progress-row/rows/content-card.js +0 -0
  135. package/src/services/progress-row/rows/method-card.js +0 -0
  136. package/src/services/progress-row/rows/playlist-card.js +0 -0
  137. package/src/services/railcontent.js +0 -0
  138. package/src/services/recommendations.js +0 -0
  139. package/src/services/reporting/README.md +0 -0
  140. package/src/services/reporting/reporting.ts +0 -0
  141. package/src/services/reporting/types.ts +0 -0
  142. package/src/services/search.ts +0 -0
  143. package/src/services/sentry/.indexignore +0 -0
  144. package/src/services/sentry/index.ts +0 -0
  145. package/src/services/state.ts +0 -0
  146. package/src/services/sync/.indexignore +0 -0
  147. package/src/services/sync/adapters/factory.ts +0 -0
  148. package/src/services/sync/adapters/lokijs.ts +0 -0
  149. package/src/services/sync/adapters/sqlite.ts +0 -0
  150. package/src/services/sync/context/index.ts +0 -0
  151. package/src/services/sync/context/providers/base.ts +0 -0
  152. package/src/services/sync/context/providers/connectivity.ts +0 -0
  153. package/src/services/sync/context/providers/durability.ts +0 -0
  154. package/src/services/sync/context/providers/index.ts +0 -0
  155. package/src/services/sync/context/providers/session.ts +0 -0
  156. package/src/services/sync/context/providers/tabs.ts +0 -0
  157. package/src/services/sync/context/providers/visibility.ts +0 -0
  158. package/src/services/sync/database/factory.ts +0 -0
  159. package/src/services/sync/debug.ts +0 -0
  160. package/src/services/sync/effects/index.ts +0 -0
  161. package/src/services/sync/effects/logout-warning.ts +0 -0
  162. package/src/services/sync/effects/push-failure-notification.ts +0 -0
  163. package/src/services/sync/errors/boundary.ts +0 -0
  164. package/src/services/sync/errors/index.ts +0 -0
  165. package/src/services/sync/errors/validators.ts +0 -0
  166. package/src/services/sync/fetch.ts +0 -0
  167. package/src/services/sync/index.ts +0 -0
  168. package/src/services/sync/manager.ts +0 -0
  169. package/src/services/sync/models/Base.ts +0 -0
  170. package/src/services/sync/models/ContentLike.ts +0 -0
  171. package/src/services/sync/models/ContentProgress.ts +0 -0
  172. package/src/services/sync/models/Practice.ts +0 -0
  173. package/src/services/sync/models/PracticeDayNote.ts +0 -0
  174. package/src/services/sync/models/UserAwardProgress.ts +0 -0
  175. package/src/services/sync/models/index.ts +0 -0
  176. package/src/services/sync/repositories/base.ts +0 -0
  177. package/src/services/sync/repositories/content-likes.ts +0 -0
  178. package/src/services/sync/repositories/content-progress.ts +0 -0
  179. package/src/services/sync/repositories/index.ts +0 -0
  180. package/src/services/sync/repositories/practice-day-notes.ts +0 -0
  181. package/src/services/sync/repositories/practices.ts +0 -0
  182. package/src/services/sync/repositories/user-award-progress.ts +0 -0
  183. package/src/services/sync/repository-proxy.ts +0 -0
  184. package/src/services/sync/resolver.ts +0 -0
  185. package/src/services/sync/retry.ts +0 -0
  186. package/src/services/sync/run-scope.ts +0 -0
  187. package/src/services/sync/schema/index.ts +0 -0
  188. package/src/services/sync/serializers/index.ts +0 -0
  189. package/src/services/sync/serializers/model.ts +0 -0
  190. package/src/services/sync/serializers/raw.ts +0 -0
  191. package/src/services/sync/stale-record-cleanup.ts +0 -0
  192. package/src/services/sync/store/index.ts +0 -0
  193. package/src/services/sync/store/push-coalescer.ts +0 -0
  194. package/src/services/sync/store-configs.ts +0 -0
  195. package/src/services/sync/strategies/base.ts +0 -0
  196. package/src/services/sync/strategies/index.ts +0 -0
  197. package/src/services/sync/strategies/initial.ts +0 -0
  198. package/src/services/sync/strategies/polling.ts +0 -0
  199. package/src/services/sync/telemetry/flood-prevention.ts +0 -0
  200. package/src/services/sync/telemetry/index.ts +0 -0
  201. package/src/services/sync/telemetry/sampling.ts +0 -0
  202. package/src/services/sync/utils/event-emitter.ts +0 -0
  203. package/src/services/sync/utils/index.ts +0 -0
  204. package/src/services/sync/utils/throttle.ts +0 -0
  205. package/src/services/sync/utils/timers.ts +0 -0
  206. package/src/services/types.js +0 -0
  207. package/src/services/urlBuilder.ts +0 -0
  208. package/src/services/user/account.ts +0 -0
  209. package/src/services/user/chat.js +0 -0
  210. package/src/services/user/interests.js +0 -0
  211. package/src/services/user/management.js +0 -0
  212. package/src/services/user/memberships.ts +5 -2
  213. package/src/services/user/notifications.js +0 -0
  214. package/src/services/user/onboarding.ts +0 -0
  215. package/src/services/user/payments.ts +0 -0
  216. package/src/services/user/playerSettings.ts +0 -0
  217. package/src/services/user/profile.ts +0 -0
  218. package/src/services/user/sessions.js +0 -0
  219. package/src/services/user/streakCalculator.ts +0 -0
  220. package/src/services/user/types.js +0 -0
  221. package/src/services/user/user-management-system.js +0 -0
  222. package/src/services/userActivity.js +0 -0
  223. package/src/services/whoLiked.ts +0 -0
  224. package/test/initializeTests.js +0 -0
  225. package/test/integration/awards/award-exclusion-handling.test.ts +0 -0
  226. package/test/integration/awards/internal/image-utils.test.ts +0 -0
  227. package/test/integration/content-progress/__mocks__/mocks.ts +0 -0
  228. package/test/integration/content-progress/contentProgress.test.ts +0 -0
  229. package/test/integration/content-progress/e2eOfflineProgress.test.ts +0 -0
  230. package/test/integration/content-progress/e2eProgress.test.ts +0 -0
  231. package/test/integration/content-progress/getters.test.ts +0 -0
  232. package/test/integration/content-progress/helpers.test.ts +0 -0
  233. package/test/integration/content-progress/offlineContentProgress.test.ts +0 -0
  234. package/test/integration/forums.test.ts +0 -0
  235. package/test/integration/infrastructure/FetchRequestExecutor.test.ts +0 -0
  236. package/test/integration/initializeTestDB.ts +0 -0
  237. package/test/integration/learning-paths.test.ts +0 -0
  238. package/test/integration/notifications.test.ts +0 -0
  239. package/test/integration/progress-row/content-card.test.ts +0 -0
  240. package/test/integration/sync/adapters/idb-errors.test.ts +0 -0
  241. package/test/integration/sync/adapters/sqlite-errors.test.ts +0 -0
  242. package/test/integration/sync/fetch.test.ts +0 -0
  243. package/test/integration/sync/repositories/content-likes.test.ts +0 -0
  244. package/test/integration/sync/repositories/practices.test.ts +0 -0
  245. package/test/integration/sync/repositories/progress.test.ts +0 -0
  246. package/test/integration/sync/repositories/user-award-progress.static.test.ts +0 -0
  247. package/test/integration/sync/repositories/user-award-progress.test.ts +0 -0
  248. package/test/integration/sync/store/cross-user-protection.test.ts +0 -0
  249. package/test/integration/sync/store/store-idb.test.ts +0 -0
  250. package/test/integration/sync/store/store.test.ts +0 -0
  251. package/test/integration/user/permissions.test.js +0 -0
  252. package/test/integration/userActivity.test.ts +0 -0
  253. package/test/live/README.md +0 -0
  254. package/test/live/content.test.js +0 -0
  255. package/test/localStorageMock.js +0 -0
  256. package/test/log.js +0 -0
  257. package/test/mockData/award-definitions.js +0 -0
  258. package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
  259. package/test/mockData/mockData_progress_content.json +0 -0
  260. package/test/mockData/mockData_sanity_progress_content.json +0 -0
  261. package/test/mockData/mockData_user_practices.json +0 -0
  262. package/test/setupConsole.js +0 -0
  263. package/test/setupNetworkGuard.js +0 -0
  264. package/test/setupTimers.js +0 -0
  265. package/test/unit/HttpClient.test.ts +0 -0
  266. package/test/unit/awards/award-alacarte-observer.test.ts +0 -0
  267. package/test/unit/awards/award-auto-refresh.test.ts +0 -0
  268. package/test/unit/awards/award-calculations.test.ts +0 -0
  269. package/test/unit/awards/award-callbacks.test.ts +0 -0
  270. package/test/unit/awards/award-certificate-display.test.ts +0 -0
  271. package/test/unit/awards/award-collection-edge-cases.test.ts +0 -0
  272. package/test/unit/awards/award-collection-filtering.test.ts +0 -0
  273. package/test/unit/awards/award-completion-flow.test.ts +0 -0
  274. package/test/unit/awards/award-multi-lesson.test.ts +0 -0
  275. package/test/unit/awards/award-observer-integration.test.ts +0 -0
  276. package/test/unit/awards/award-query-messages.test.ts +0 -0
  277. package/test/unit/awards/award-user-collection.test.ts +0 -0
  278. package/test/unit/awards/duplicate-prevention.test.ts +0 -0
  279. package/test/unit/awards/helpers/completion-mock.ts +0 -0
  280. package/test/unit/awards/helpers/index.ts +0 -0
  281. package/test/unit/awards/helpers/mock-setup.ts +0 -0
  282. package/test/unit/awards/helpers/progress-emitter.ts +0 -0
  283. package/test/unit/awards/message-generator.test.ts +0 -0
  284. package/test/unit/content-progress/bubbleTrickle.test.ts +0 -0
  285. package/test/unit/content-progress/helpers.test.ts +0 -0
  286. package/test/unit/content-progress/navigateTo.test.ts +0 -0
  287. package/test/unit/contentLikes.test.ts +0 -0
  288. package/test/unit/contentMetaData.test.ts +0 -0
  289. package/test/unit/dataContext.test.ts +0 -0
  290. package/test/unit/dateUtils.test.ts +0 -0
  291. package/test/unit/endScreen.test.js +0 -0
  292. package/test/unit/imageSRCBuilder.test.ts +0 -0
  293. package/test/unit/imageSRCVerify.test.ts +0 -0
  294. package/test/unit/infrastructure/DefaultHeaderProvider.test.ts +0 -0
  295. package/test/unit/infrastructure/sanity/ContentClient.test.ts +0 -0
  296. package/test/unit/infrastructure/sanity/DefaultConfigProvider.test.ts +0 -0
  297. package/test/unit/infrastructure/sanity/FetchQueryExecutor.test.ts +0 -0
  298. package/test/unit/infrastructure/sanity/SanityClient.test.ts +0 -0
  299. package/test/unit/lib/__snapshots__/filter.test.ts.snap +0 -0
  300. package/test/unit/lib/filter.test.ts +0 -0
  301. package/test/unit/lib/lastUpdated.test.ts +0 -0
  302. package/test/unit/lib/query.test.ts +0 -0
  303. package/test/unit/lib/sanity/decorators/base.test.ts +0 -0
  304. package/test/unit/lib/sanity/decorators/navigate-to.test.ts +0 -0
  305. package/test/unit/lib/sanity/decorators/need-access.test.ts +0 -0
  306. package/test/unit/lib/sanity/decorators/need-lifetime-upgrade.test.ts +0 -0
  307. package/test/unit/lib/sanity/decorators/page-type.test.ts +0 -0
  308. package/test/unit/playerSettings.test.ts +0 -0
  309. package/test/unit/progress-row/content-card.test.ts +0 -0
  310. package/test/unit/progress-row/playlist-card.test.ts +0 -0
  311. package/test/unit/progressRows.test.ts +0 -0
  312. package/test/unit/recommendations.test.js +0 -0
  313. package/test/unit/sanityQueryService.test.ts +0 -0
  314. package/test/unit/search.test.ts +0 -0
  315. package/test/unit/sentry.test.ts +0 -0
  316. package/test/unit/services/progress-internal/bubble.test.ts +0 -0
  317. package/test/unit/services/progress.test.ts +0 -0
  318. package/test/unit/streakMessage.test.ts +0 -0
  319. package/test/unit/sync/context.test.ts +0 -0
  320. package/test/unit/sync/effects/logout-warning.test.ts +0 -0
  321. package/test/unit/sync/effects/push-failure-notification.test.ts +0 -0
  322. package/test/unit/sync/errors/sync-errors.test.ts +0 -0
  323. package/test/unit/sync/errors/validators.test.ts +0 -0
  324. package/test/unit/sync/helpers/TestModel.ts +0 -0
  325. package/test/unit/sync/helpers/index.ts +0 -0
  326. package/test/unit/sync/manager.test.ts +0 -0
  327. package/test/unit/sync/models/user-award-progress.test.ts +0 -0
  328. package/test/unit/sync/resolver.test.ts +0 -0
  329. package/test/unit/sync/retry.test.ts +0 -0
  330. package/test/unit/sync/run-scope.test.ts +0 -0
  331. package/test/unit/sync/stale-record-cleanup.test.ts +0 -0
  332. package/test/unit/sync/store/push-coalescer.test.ts +0 -0
  333. package/test/unit/sync/store-configs.test.ts +0 -0
  334. package/test/unit/sync/telemetry/sync-telemetry.test.ts +0 -0
  335. package/test/unit/sync/utils/event-emitter.test.ts +0 -0
  336. package/test/unit/sync/utils/throttle.test.ts +0 -0
  337. package/test/unit/url-builder.test.ts +0 -0
  338. package/test/unit/user/account.test.ts +0 -0
  339. package/test/unit/user/permissions.test.js +0 -0
  340. package/tools/generate-index.cjs +0 -0
  341. package/tsconfig.json +0 -0
  342. package/usage/sanity/decorators/examples.ts +0 -0
@@ -1,52 +1,24 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(npx jest *)",
5
- "Bash(npx tsc *)",
6
- "Skill(counselors)",
7
- "Bash(counselors ls *)",
8
- "Bash(counselors groups *)",
9
- "Bash(counselors run *)",
10
- "Bash(npm test *)",
11
- "Bash(gh pr *)",
12
- "Bash(gh api *)",
13
- "Bash(mkdir -p /tmp/pr-review-v2)",
14
- "Read(//tmp/pr-review-v2/**)",
15
- "Bash(cat /home/alesevero/railenvironment/applications/musora-content-services/AGENTS.md)",
16
- "Bash(echo \"no AGENTS.md\")",
17
- "Bash(echo \"exit=$?\")",
18
- "Bash(git checkout *)",
19
- "Skill(pr)",
20
- "Skill(create-decision)",
21
- "mcp__github__pull_request_read",
22
- "mcp__github__push_files",
23
- "Bash(git push *)",
24
- "mcp__github__create_pull_request",
25
- "mcp__github__search_pull_requests",
26
- "Bash(git commit *)",
27
- "Bash(git add *)"
4
+ "Bash(tree:*)",
5
+ "Bash(find:*)",
6
+ "Bash(docker exec:*)",
7
+ "Bash(node:*)",
8
+ "Bash(npm run build-index:*)",
9
+ "Bash(npm run link_mcs:*)",
10
+ "Bash(./link_mcs.sh:*)",
11
+ "Bash(curl:*)",
12
+ "Bash(php artisan:*)",
13
+ "Bash(git checkout:*)",
14
+ "Bash(source .env)",
15
+ "Bash(echo:*)",
16
+ "Bash(grep:*)",
17
+ "Bash(gh api repos/railroadmedia/musora-platform-backend/commits/1f9878a5e681bf1e2233c0d59a618d477b118c49 --jq '.commit.message' 2>/dev/null || echo \"no access\")",
18
+ "WebFetch(domain:github.com)",
19
+ "Read(//app/**)",
20
+ "Bash(git -C /app/musora-platform-backend log --oneline main..HEAD)",
21
+ "Bash(git -C /app/musora-platform-backend diff main..HEAD --name-only)"
28
22
  ]
29
- },
30
- "model": "sonnet",
31
- "enabledMcpjsonServers": [
32
- "atlassian",
33
- "figma",
34
- "google-workspace",
35
- "snowflake",
36
- "aws",
37
- "hex",
38
- "sanity",
39
- "mysql",
40
- "slack",
41
- "langfuse",
42
- "chrome-devtools",
43
- "railway",
44
- "github",
45
- "asana"
46
- ],
47
- "disabledMcpjsonServers": [
48
- "nightwatch",
49
- "1password"
50
- ],
51
- "effortLevel": "medium"
23
+ }
52
24
  }
package/.coderabbit.yaml CHANGED
File without changes
package/.editorconfig CHANGED
File without changes
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/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
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.167.0](https://github.com/railroadmedia/musora-content-services/compare/v2.165.5...v2.167.0) (2026-07-13)
6
+
7
+
8
+ ### Features
9
+
10
+ * **BEHLPT-186:** subscription upgrade endpoints ([#1003](https://github.com/railroadmedia/musora-content-services/issues/1003)) ([9da55f2](https://github.com/railroadmedia/musora-content-services/commit/9da55f24708976190317a3b69381acbccce2f33c))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **BR-658:** add playbass logo for ceritificates ([#1006](https://github.com/railroadmedia/musora-content-services/issues/1006)) ([da52391](https://github.com/railroadmedia/musora-content-services/commit/da5239178c3526c685b84220009f1f4e0774deb9))
16
+ * **BR-671:** fix Latin/World style search ([#1002](https://github.com/railroadmedia/musora-content-services/issues/1002)) ([25fdff8](https://github.com/railroadmedia/musora-content-services/commit/25fdff80c6279e8568ea057ac250f7e057717ccf))
17
+
18
+ ## [2.166.0](https://github.com/railroadmedia/musora-content-services/compare/v2.165.5...v2.166.0) (2026-07-02)
19
+
20
+
21
+ ### Features
22
+
23
+ * **BEHLPT-186:** subscription upgrade endpoints ([#1003](https://github.com/railroadmedia/musora-content-services/issues/1003)) ([9da55f2](https://github.com/railroadmedia/musora-content-services/commit/9da55f24708976190317a3b69381acbccce2f33c))
24
+
25
+
26
+ ### Bug Fixes
27
+
28
+ * **BR-671:** fix Latin/World style search ([#1002](https://github.com/railroadmedia/musora-content-services/issues/1002)) ([25fdff8](https://github.com/railroadmedia/musora-content-services/commit/25fdff80c6279e8568ea057ac250f7e057717ccf))
29
+
5
30
  ### [2.165.5](https://github.com/railroadmedia/musora-content-services/compare/v2.165.4...v2.165.5) (2026-06-25)
6
31
 
7
32
 
package/CLAUDE.md CHANGED
File without changes
package/README.md CHANGED
File without changes
package/babel.config.cjs CHANGED
File without changes
package/codecov.yml CHANGED
File without changes
package/jest.config.js CHANGED
File without changes
File without changes
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.165.5",
3
+ "version": "2.167.0",
4
4
  "description": "A package for Musoras content services ",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -21,15 +21,18 @@
21
21
 
22
22
  /** @type {AwardAssets} */
23
23
  export const AWARD_ASSETS = {
24
- ribbon: "https://d3fzm1tzeyr5n3.cloudfront.net/challenges/gold_ribbon.png",
25
- musoraLogo: "https://d3fzm1tzeyr5n3.cloudfront.net/challenges/on_musora.png",
26
- musoraBgLogo: "https://d3fzm1tzeyr5n3.cloudfront.net/challenges/certificate_logo.png",
24
+ ribbon: 'https://d3fzm1tzeyr5n3.cloudfront.net/challenges/gold_ribbon.png',
25
+ musoraLogo: 'https://d3fzm1tzeyr5n3.cloudfront.net/challenges/on_musora.png',
26
+ musoraBgLogo: 'https://d3fzm1tzeyr5n3.cloudfront.net/challenges/certificate_logo.png',
27
27
 
28
28
  brandLogos: {
29
- drumeo: "https://dpwjbsxqtam5n.cloudfront.net/logos/logo-blue.png",
30
- singeo: "https://d21xeg6s76swyd.cloudfront.net/sales/2021/singeo-logo.png",
31
- guitareo: "https://d122ay5chh2hr5.cloudfront.net/sales/guitareo-logo-green.png",
32
- pianote: "https://d21q7xesnoiieh.cloudfront.net/fit-in/marketing/pianote/membership/homepage/2023/pianote-logo-red.png",
33
- musora: "https://d3fzm1tzeyr5n3.cloudfront.net/challenges/on_musora.png"
34
- }
29
+ drumeo: 'https://dpwjbsxqtam5n.cloudfront.net/logos/logo-blue.png',
30
+ singeo: 'https://d21xeg6s76swyd.cloudfront.net/sales/2021/singeo-logo.png',
31
+ guitareo: 'https://d122ay5chh2hr5.cloudfront.net/sales/guitareo-logo-green.png',
32
+ pianote:
33
+ 'https://d21q7xesnoiieh.cloudfront.net/fit-in/marketing/pianote/membership/homepage/2023/pianote-logo-red.png',
34
+ playbass:
35
+ 'https://d21q7xesnoiieh.cloudfront.net/fit-in/1400x0/filters:quality(95)/marketing/musora/membership/homepage/2026/logo-playbass2.svg',
36
+ musora: 'https://d3fzm1tzeyr5n3.cloudfront.net/challenges/on_musora.png',
37
+ },
35
38
  }
File without changes
File without changes
@@ -876,7 +876,14 @@ function createTypeConditions(lessonTypes) {
876
876
  * Filter handler registry - maps filter keys to their handler functions
877
877
  */
878
878
  const filterHandlers = {
879
- style: (value) => `"${value}" in genre[]->name`,
879
+ style: (value) => {
880
+ const hasMultipleStyles = value.includes('/')
881
+ const styles = [value]
882
+ if (hasMultipleStyles) {
883
+ styles.push(...value.split('/').map((s) => s.trim()))
884
+ }
885
+ return styles.map((style) => `"${style}" in genre[]->name`).join(' || ')
886
+ },
880
887
 
881
888
  difficulty: (value) => {
882
889
  return `difficulty_string == "${value}"`
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
package/src/lib/brands.ts 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
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
@@ -20,7 +20,9 @@ export interface InviteResponse {
20
20
  can_be_accepted: boolean
21
21
  is_account_valid: boolean
22
22
  is_invite_active: boolean
23
- can_user_join: boolean
23
+ can_user_join: boolean // deprecated in favour of is_user_part_of_existing_mua which is more descriptive
24
+ is_user_active_subscriber: boolean
25
+ is_user_part_of_existing_mua: boolean
24
26
  primary_user_name: string
25
27
  product_name: string
26
28
  // These fields leak user information and are excluded entirely for the public endpoint
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
@@ -85,7 +85,7 @@ export const bubbleProgress = async (
85
85
  collection?: CollectionParameter
86
86
  ): Promise<Record<number, number>> => {
87
87
  const ids = getAncestorAndSiblingIds(hierarchy, contentId)
88
- const progresses = await getByIds(ids, 'progress_percent', 0, collection)
88
+ const progresses = await getByIds(ids, (p) => p.progress_percent, 0, collection)
89
89
  return averageProgressesFor(hierarchy, contentId, progresses)
90
90
  }
91
91
 
@@ -1,9 +1,12 @@
1
1
  import { db } from '../../sync'
2
- import { CollectionParameter } from '../../sync/models/ContentProgress'
2
+ import type { ModelSerialized } from '../../sync/serializers'
3
+ import ContentProgress, { CollectionParameter } from '../../sync/models/ContentProgress'
4
+
5
+ type Selector<V> = (p: ModelSerialized<ContentProgress>) => V
3
6
 
4
7
  export const getByIds = async <V>(
5
8
  contentIds: number[],
6
- dataKey: string,
9
+ selector: Selector<V>,
7
10
  defaultValue: V,
8
11
  collection?: CollectionParameter
9
12
  ): Promise<Map<number, V>> => {
@@ -12,7 +15,7 @@ export const getByIds = async <V>(
12
15
  const progress = new Map(contentIds.map((id) => [id, defaultValue]))
13
16
  await db.contentProgress.getSomeProgressByContentIds(contentIds, collection).then((r) => {
14
17
  r.data.forEach((p) => {
15
- progress.set(p.content_id, p[dataKey] ?? defaultValue)
18
+ progress.set(p.content_id, selector(p) ?? defaultValue)
16
19
  })
17
20
  })
18
21
  return progress
@@ -20,24 +23,39 @@ export const getByIds = async <V>(
20
23
 
21
24
  export const getById = async <V>(
22
25
  contentId: number,
23
- dataKey: string,
26
+ selector: Selector<V>,
24
27
  defaultValue: V,
25
28
  collection?: CollectionParameter
26
29
  ): Promise<V> => {
27
30
  if (!contentId) return defaultValue
28
31
  return db.contentProgress
29
32
  .getOneProgressByContentId(contentId, collection)
30
- .then((r) => r.data?.[dataKey] ?? defaultValue)
33
+ .then((r) => (r.data ? selector(r.data) : defaultValue) ?? defaultValue)
31
34
  }
32
35
 
33
- export const getByRecordIds = async <V>(ids: string[], dataKey: string, defaultValue: V) => {
36
+ export const getByRecordIds = async <V>(ids: string[], selector: Selector<V>, defaultValue: V) => {
34
37
  const progress = Object.fromEntries(ids.map((id) => [id, defaultValue]))
35
38
 
36
39
  await db.contentProgress.getSomeProgressByRecordIds(ids).then((r) => {
37
40
  r.data.forEach((p) => {
38
- progress[p.id] = p[dataKey] ?? defaultValue
41
+ progress[p.id] = selector(p) ?? defaultValue
39
42
  })
40
43
  })
41
44
 
42
45
  return progress
43
46
  }
47
+
48
+ export const queryById =
49
+ <V>(selector: Selector<V>, defaultValue: V) =>
50
+ (contentId: number, collection?: CollectionParameter) =>
51
+ getById(contentId, selector, defaultValue, collection)
52
+
53
+ export const queryByIds =
54
+ <V>(selector: Selector<V>, defaultValue: V) =>
55
+ (contentIds: number[], collection?: CollectionParameter) =>
56
+ getByIds(contentIds, selector, defaultValue, collection)
57
+
58
+ export const queryByRecordIds =
59
+ <V>(selector: Selector<V>, defaultValue: V) =>
60
+ (ids: string[]) =>
61
+ getByRecordIds(ids, selector, defaultValue)