musora-content-services 2.107.1 → 2.107.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.
- package/.coderabbit.yaml +0 -0
- package/.editorconfig +0 -0
- package/.github/pull_request_template.md +0 -0
- package/.github/workflows/conventional-commits.yaml +0 -0
- package/.github/workflows/docs.js.yml +0 -0
- package/.github/workflows/node.js.yml +0 -0
- package/.prettierignore +0 -0
- package/.prettierrc +0 -0
- package/CHANGELOG.md +11 -0
- package/CLAUDE.md +0 -0
- package/README.md +0 -0
- package/babel.config.cjs +0 -0
- package/jest.config.js +0 -0
- package/jsdoc.json +0 -0
- package/package.json +1 -1
- package/src/constants/award-assets.js +0 -0
- package/src/contentMetaData.js +0 -0
- package/src/filterBuilder.js +0 -0
- package/src/index.d.ts +2 -4
- package/src/index.js +2 -4
- package/src/infrastructure/http/executors/FetchRequestExecutor.ts +0 -0
- package/src/infrastructure/http/index.ts +0 -0
- package/src/infrastructure/http/interfaces/HeaderProvider.ts +0 -0
- package/src/infrastructure/http/interfaces/HttpError.ts +0 -0
- package/src/infrastructure/http/interfaces/NetworkError.ts +0 -0
- package/src/infrastructure/http/interfaces/RequestExecutor.ts +0 -0
- package/src/infrastructure/http/interfaces/RequestOptions.ts +0 -0
- package/src/infrastructure/http/providers/DefaultHeaderProvider.ts +0 -0
- package/src/lib/ads/monoid.ts +0 -0
- package/src/lib/ads/semigroup.ts +0 -0
- package/src/lib/brands.ts +0 -0
- package/src/lib/lastUpdated.js +0 -0
- package/src/lib/sanity/filter.ts +0 -0
- package/src/lib/sanity/query.ts +0 -0
- package/src/services/api/types.js +0 -0
- package/src/services/api/types.ts +0 -0
- package/src/services/awards/award-callbacks.js +0 -0
- package/src/services/awards/award-query.js +0 -0
- package/src/services/awards/internal/.indexignore +0 -0
- package/src/services/awards/internal/award-definitions.js +0 -0
- package/src/services/awards/internal/award-events.js +0 -0
- package/src/services/awards/internal/award-manager.js +0 -0
- package/src/services/awards/internal/certificate-builder.js +0 -0
- package/src/services/awards/internal/completion-data-generator.js +0 -0
- package/src/services/awards/internal/content-progress-observer.js +0 -0
- package/src/services/awards/internal/image-utils.js +0 -0
- package/src/services/awards/internal/message-generator.js +0 -0
- package/src/services/awards/internal/types.js +0 -0
- package/src/services/awards/types.d.ts +0 -0
- package/src/services/awards/types.js +0 -0
- package/src/services/config.js +0 -0
- package/src/services/content/artist.ts +5 -5
- package/src/services/content/content.ts +0 -0
- package/src/services/content/genre.ts +5 -5
- package/src/services/content/instructor.ts +7 -6
- package/src/services/content-org/content-org.js +0 -0
- package/src/services/content-org/playlists-types.js +0 -0
- package/src/services/content.js +0 -0
- package/src/services/contentAggregator.js +0 -0
- package/src/services/contentLikes.js +0 -0
- package/src/services/contentProgress.js +0 -0
- package/src/services/dataContext.js +0 -0
- package/src/services/dateUtils.js +0 -0
- package/src/services/eventsAPI.js +0 -0
- package/src/services/forums/categories.ts +0 -0
- package/src/services/forums/forums.ts +0 -0
- package/src/services/forums/posts.ts +0 -0
- package/src/services/forums/threads.ts +0 -0
- package/src/services/forums/types.ts +0 -0
- package/src/services/gamification/awards.ts +0 -0
- package/src/services/gamification/gamification.js +0 -0
- package/src/services/imageSRCBuilder.js +0 -0
- package/src/services/imageSRCVerify.js +0 -0
- package/src/services/liveTesting.ts +0 -0
- package/src/services/permissions/PermissionsAdapter.ts +0 -0
- package/src/services/permissions/PermissionsAdapterFactory.ts +0 -0
- package/src/services/permissions/PermissionsV1Adapter.ts +0 -0
- package/src/services/permissions/PermissionsV2Adapter.ts +0 -0
- package/src/services/permissions/README.md +0 -0
- package/src/services/permissions/index.ts +0 -0
- package/src/services/progress-events.js +0 -0
- package/src/services/progress-row/method-card.js +0 -0
- package/src/services/railcontent.js +0 -0
- package/src/services/reporting/README.md +0 -0
- package/src/services/reporting/reporting.ts +0 -0
- package/src/services/reporting/types.ts +0 -0
- package/src/services/sentry/.indexignore +0 -0
- package/src/services/sentry/index.ts +0 -0
- package/src/services/sync/.indexignore +0 -0
- package/src/services/sync/adapters/factory.ts +0 -0
- package/src/services/sync/adapters/lokijs.ts +0 -0
- package/src/services/sync/adapters/sqlite.ts +0 -0
- package/src/services/sync/concurrency-safety.ts +0 -0
- package/src/services/sync/context/index.ts +0 -0
- package/src/services/sync/context/providers/base.ts +0 -0
- package/src/services/sync/context/providers/connectivity.ts +0 -0
- package/src/services/sync/context/providers/durability.ts +0 -0
- package/src/services/sync/context/providers/index.ts +0 -0
- package/src/services/sync/context/providers/session.ts +0 -0
- package/src/services/sync/context/providers/tabs.ts +0 -0
- package/src/services/sync/context/providers/visibility.ts +0 -0
- package/src/services/sync/database/factory.ts +0 -0
- package/src/services/sync/errors/boundary.ts +0 -0
- package/src/services/sync/errors/index.ts +0 -0
- package/src/services/sync/errors/validators.ts +0 -0
- package/src/services/sync/fetch.ts +0 -0
- package/src/services/sync/index.ts +0 -0
- package/src/services/sync/manager.ts +0 -0
- package/src/services/sync/models/Base.ts +0 -0
- package/src/services/sync/models/ContentLike.ts +0 -0
- package/src/services/sync/models/ContentProgress.ts +0 -0
- package/src/services/sync/models/Practice.ts +0 -0
- package/src/services/sync/models/PracticeDayNote.ts +0 -0
- package/src/services/sync/models/UserAwardProgress.ts +0 -0
- package/src/services/sync/models/index.ts +0 -0
- package/src/services/sync/repositories/base.ts +0 -0
- package/src/services/sync/repositories/content-likes.ts +0 -0
- package/src/services/sync/repositories/content-progress.ts +0 -0
- package/src/services/sync/repositories/index.ts +0 -0
- package/src/services/sync/repositories/practice-day-notes.ts +0 -0
- package/src/services/sync/repositories/practices.ts +0 -0
- package/src/services/sync/repositories/user-award-progress.ts +0 -0
- package/src/services/sync/repository-proxy.ts +0 -0
- package/src/services/sync/resolver.ts +0 -0
- package/src/services/sync/retry.ts +0 -0
- package/src/services/sync/run-scope.ts +0 -0
- package/src/services/sync/schema/index.ts +0 -0
- package/src/services/sync/serializers/index.ts +0 -0
- package/src/services/sync/serializers/model.ts +0 -0
- package/src/services/sync/serializers/raw.ts +0 -0
- package/src/services/sync/store/index.ts +0 -0
- package/src/services/sync/store/push-coalescer.ts +0 -0
- package/src/services/sync/store-configs.ts +0 -0
- package/src/services/sync/strategies/base.ts +0 -0
- package/src/services/sync/strategies/index.ts +0 -0
- package/src/services/sync/strategies/initial.ts +0 -0
- package/src/services/sync/strategies/polling.ts +0 -0
- package/src/services/sync/telemetry/index.ts +0 -0
- package/src/services/sync/telemetry/sampling.ts +0 -0
- package/src/services/sync/utils/event-emitter.ts +0 -0
- package/src/services/sync/utils/index.ts +0 -0
- package/src/services/sync/utils/throttle.ts +0 -0
- package/src/services/sync/utils/timers.ts +0 -0
- package/src/services/types.js +0 -0
- package/src/services/user/account.ts +0 -0
- package/src/services/user/memberships.ts +0 -0
- package/src/services/user/onboarding.ts +12 -122
- package/src/services/user/payments.ts +0 -0
- package/src/services/user/permissions.js +0 -0
- package/src/services/user/sessions.js +25 -33
- package/src/services/user/types.d.ts +0 -0
- package/src/services/user/types.js +6 -0
- package/src/services/user/user-management-system.js +0 -0
- package/test/HttpClient.test.js +0 -0
- package/test/awards/award-alacarte-observer.test.js +0 -0
- package/test/awards/award-auto-refresh.test.js +0 -0
- package/test/awards/award-calculations.test.js +0 -0
- package/test/awards/award-certificate-display.test.js +0 -0
- package/test/awards/award-collection-edge-cases.test.js +0 -0
- package/test/awards/award-collection-filtering.test.js +0 -0
- package/test/awards/award-completion-flow.test.js +0 -0
- package/test/awards/award-exclusion-handling.test.js +0 -0
- package/test/awards/award-multi-lesson.test.js +0 -0
- package/test/awards/award-observer-integration.test.js +0 -0
- package/test/awards/award-query-messages.test.js +0 -0
- package/test/awards/award-user-collection.test.js +0 -0
- package/test/awards/duplicate-prevention.test.js +0 -0
- package/test/awards/helpers/completion-mock.js +0 -0
- package/test/awards/helpers/index.js +0 -0
- package/test/awards/helpers/mock-setup.js +0 -0
- package/test/awards/helpers/progress-emitter.js +0 -0
- package/test/awards/message-generator.test.js +0 -0
- package/test/content.test.js +0 -0
- package/test/contentLikes.test.js +0 -0
- package/test/contentProgress.test.js +0 -0
- package/test/dataContext.test.js +0 -0
- package/test/forum.test.js +0 -0
- package/test/imageSRCBuilder.test.js +0 -0
- package/test/imageSRCVerify.test.js +0 -0
- package/test/initializeTests.js +0 -0
- package/test/learningPaths.test.js +0 -0
- package/test/lib/__snapshots__/filter.test.ts.snap +0 -0
- package/test/lib/filter.test.ts +0 -0
- package/test/lib/lastUpdated.test.js +0 -0
- package/test/lib/query.test.ts +0 -0
- package/test/live/contentProgressLive.test.js +0 -0
- package/test/live/railcontentLive.test.js +0 -0
- package/test/localStorageMock.js +0 -0
- package/test/log.js +0 -0
- package/test/mockData/award-definitions.js +0 -0
- package/test/mockData/mockData_fetchByRailContentIds_one_content.json +0 -0
- package/test/mockData/mockData_progress_content.json +0 -0
- package/test/mockData/mockData_sanity_progress_content.json +0 -0
- package/test/mockData/mockData_user_practices.json +0 -0
- package/test/notifications.test.js +0 -0
- package/test/progressRows.test.js +0 -0
- package/test/sanityQueryService.test.js +0 -0
- package/test/streakMessage.test.js +0 -0
- package/test/sync/adapter.ts +0 -0
- package/test/sync/initialize-sync-manager.js +0 -0
- package/test/sync/models/award-database-integration.test.js +0 -0
- package/test/user/permissions.test.js +0 -0
- package/test/userActivity.test.js +0 -0
- package/tools/generate-index.cjs +0 -0
- package/.claude/settings.local.json +0 -16
- package/.yarnrc.yml +0 -1
- package/check_content.js +0 -30
- package/check_content.mjs +0 -32
- package/test/reporting.test.js +0 -132
- package/test_owned_navigate.js +0 -74
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module Onboarding
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import { Brands } from '../../lib/brands'
|
|
4
|
+
import { GET, POST, PUT } from '../../infrastructure/http/HttpClient'
|
|
6
5
|
import { globalConfig } from '../config.js'
|
|
7
6
|
|
|
8
7
|
export interface OnboardingSteps {
|
|
@@ -55,8 +54,7 @@ export async function startOnboarding({
|
|
|
55
54
|
steps = {},
|
|
56
55
|
marketingOptIn = false,
|
|
57
56
|
}: StartOnboardingParams): Promise<Onboarding> {
|
|
58
|
-
|
|
59
|
-
return httpClient.post<Onboarding>(`/api/user-management-system/v1/onboardings`, {
|
|
57
|
+
return POST(`/api/user-management-system/v1/onboardings`, {
|
|
60
58
|
email,
|
|
61
59
|
brand,
|
|
62
60
|
flow,
|
|
@@ -91,8 +89,7 @@ export async function updateOnboarding({
|
|
|
91
89
|
is_completed = false,
|
|
92
90
|
marketingOptIn = false,
|
|
93
91
|
}: UpdateOnboardingParams): Promise<Onboarding> {
|
|
94
|
-
|
|
95
|
-
return httpClient.put<Onboarding>(`/api/user-management-system/v1/onboardings/${id}`, {
|
|
92
|
+
return PUT(`/api/user-management-system/v1/onboardings/${id}`, {
|
|
96
93
|
email,
|
|
97
94
|
brand,
|
|
98
95
|
flow,
|
|
@@ -111,8 +108,7 @@ export async function updateOnboarding({
|
|
|
111
108
|
* @throws {HttpError} - If the HTTP request fails.
|
|
112
109
|
*/
|
|
113
110
|
export async function userOnboardingForBrand(brand: string): Promise<Onboarding> {
|
|
114
|
-
|
|
115
|
-
return httpClient.get<Onboarding>(
|
|
111
|
+
return GET(
|
|
116
112
|
`/api/user-management-system/v1/users/${globalConfig.sessionConfig.userId}/onboardings/brand/${encodeURIComponent(brand)}`
|
|
117
113
|
)
|
|
118
114
|
}
|
|
@@ -132,126 +128,20 @@ export interface OnboardingRecommendedContent {
|
|
|
132
128
|
}
|
|
133
129
|
}
|
|
134
130
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
title: 'The Power Of Your Left Hand (Beginner)',
|
|
139
|
-
difficulty: 'Beginner',
|
|
140
|
-
lesson_count: 12,
|
|
141
|
-
skill_count: 1,
|
|
142
|
-
badge:
|
|
143
|
-
'https://cdn.sanity.io/files/4032r8py/staging/9470587f03479b7c1f8019c3cbcbdfe12aa267f3.png',
|
|
144
|
-
description:
|
|
145
|
-
'Start your drumming journey with essential techniques and rhythms to get you playing quickly.',
|
|
146
|
-
video: {
|
|
147
|
-
external_id: '1002267396',
|
|
148
|
-
hlsManifestUrl:
|
|
149
|
-
'https://player.vimeo.com/external/250467786.m3u8?s=52dc97fc96fe903d80bf71bc1b1709cc444db407&oauth2_token_id=1284792283',
|
|
150
|
-
type: 'vimeo-video',
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
pianote: {
|
|
154
|
-
id: 412405,
|
|
155
|
-
title: 'Getting Started On The Piano',
|
|
156
|
-
difficulty: 'Beginner',
|
|
157
|
-
lesson_count: 4,
|
|
158
|
-
skill_count: 3,
|
|
159
|
-
badge:
|
|
160
|
-
'https://cdn.sanity.io/files/4032r8py/staging/9470587f03479b7c1f8019c3cbcbdfe12aa267f3.png',
|
|
161
|
-
description:
|
|
162
|
-
'The goal of this course is to introduce you to the keys, and get you playing a song as fast as possible. ',
|
|
163
|
-
video: {
|
|
164
|
-
external_id: '1001267395',
|
|
165
|
-
hlsManifestUrl:
|
|
166
|
-
'https://player.vimeo.com/external/1001267395.m3u8?s=8f8d8a8a762f688058e6e6fd6704c402baf1b797&oauth2_token_id=1284792283',
|
|
167
|
-
type: 'vimeo-video',
|
|
168
|
-
},
|
|
169
|
-
},
|
|
170
|
-
guitareo: {
|
|
171
|
-
id: 191346,
|
|
172
|
-
title: 'Understanding Your Instrument',
|
|
173
|
-
difficulty: 'Beginner',
|
|
174
|
-
lesson_count: 6,
|
|
175
|
-
skill_count: 5,
|
|
176
|
-
badge:
|
|
177
|
-
'https://cdn.sanity.io/files/4032r8py/staging/9470587f03479b7c1f8019c3cbcbdfe12aa267f3.png',
|
|
178
|
-
description:
|
|
179
|
-
'New to the acoustic guitar? Then this Course is for you! Learn everything you need to get started on the acoustic guitar, and start playing music as fast as possible!',
|
|
180
|
-
video: {
|
|
181
|
-
external_id: '1003267397',
|
|
182
|
-
hlsManifestUrl:
|
|
183
|
-
'https://player.vimeo.com/external/166972298.m3u8?s=a93bfe96a4ce9ac5a4eba3441838847ef2eafc9b&oauth2_token_id=1284792283',
|
|
184
|
-
type: 'vimeo-video',
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
singeo: {
|
|
188
|
-
id: 415737,
|
|
189
|
-
title: 'Sound Like A Star — Mastering Iconic Pop Voices',
|
|
190
|
-
difficulty: 'Beginner',
|
|
191
|
-
lesson_count: 5,
|
|
192
|
-
skill_count: 4,
|
|
193
|
-
badge:
|
|
194
|
-
'https://cdn.sanity.io/files/4032r8py/staging/9470587f03479b7c1f8019c3cbcbdfe12aa267f3.png',
|
|
195
|
-
description:
|
|
196
|
-
'Welcome to the Singing Starter Kit! This course will teach you everything you need to know to sound better when you sing! You will learn how your unique voice works so that you can develop vocal strength, accurate pitch, and find confidence singing your favorite songs. You can sing, and the Singing Starter Kit is the perfect way to start your singing journey.',
|
|
197
|
-
video: {
|
|
198
|
-
external_id: '1004267398',
|
|
199
|
-
hlsManifestUrl:
|
|
200
|
-
'https://player.vimeo.com/external/1040159819.m3u8?s=f238ad1a650fb30a49c36d61996c982f06ffffb1&oauth2_token_id=1284792283',
|
|
201
|
-
type: 'vimeo-video',
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
playbass: {
|
|
205
|
-
id: 191346,
|
|
206
|
-
title: 'Understanding Your Instrument',
|
|
207
|
-
difficulty: 'Beginner',
|
|
208
|
-
lesson_count: 6,
|
|
209
|
-
skill_count: 5,
|
|
210
|
-
badge:
|
|
211
|
-
'https://cdn.sanity.io/files/4032r8py/staging/9470587f03479b7c1f8019c3cbcbdfe12aa267f3.png',
|
|
212
|
-
description:
|
|
213
|
-
'New to the acoustic guitar? Then this Course is for you! Learn everything you need to get started on the acoustic guitar, and start playing music as fast as possible!',
|
|
214
|
-
video: {
|
|
215
|
-
external_id: '1003267397',
|
|
216
|
-
hlsManifestUrl:
|
|
217
|
-
'https://player.vimeo.com/external/166972298.m3u8?s=a93bfe96a4ce9ac5a4eba3441838847ef2eafc9b&oauth2_token_id=1284792283',
|
|
218
|
-
type: 'vimeo-video',
|
|
219
|
-
},
|
|
220
|
-
},
|
|
131
|
+
export interface OnboardingRecommendationResponse {
|
|
132
|
+
recommendation: OnboardingRecommendedContent
|
|
133
|
+
user_onboarding: Onboarding
|
|
221
134
|
}
|
|
222
135
|
|
|
223
136
|
/**
|
|
224
137
|
* Fetches recommended content for onboarding based on the specified brand.
|
|
225
138
|
*
|
|
226
|
-
* @param {
|
|
227
|
-
* @
|
|
228
|
-
* @returns {Promise<OnboardingRecommendedContent>} - A promise that resolves with the recommended content.
|
|
139
|
+
* @param {number} onboardingId - The ID of the onboarding process.
|
|
140
|
+
* @returns {Promise<OnboardingRecommendationResponse>} - A promise that resolves with the recommended content.
|
|
229
141
|
* @throws {HttpError} - If the HTTP request fails.
|
|
230
142
|
*/
|
|
231
143
|
export async function getOnboardingRecommendedContent(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
// TODO: Replace with real API call when available
|
|
236
|
-
if (recommendedContentCache[brand]) {
|
|
237
|
-
return recommendedContentCache[brand]
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return {
|
|
241
|
-
id: 412405,
|
|
242
|
-
title: 'Getting Started On The Piano',
|
|
243
|
-
difficulty: 'Beginner',
|
|
244
|
-
lesson_count: 4,
|
|
245
|
-
skill_count: 3,
|
|
246
|
-
badge:
|
|
247
|
-
'https://cdn.sanity.io/files/4032r8py/staging/9470587f03479b7c1f8019c3cbcbdfe12aa267f3.png',
|
|
248
|
-
description:
|
|
249
|
-
'The goal of this course is to introduce you to the keys, and get you playing a song as fast as possible. ',
|
|
250
|
-
video: {
|
|
251
|
-
external_id: '1001267395',
|
|
252
|
-
hlsManifestUrl:
|
|
253
|
-
'https://player.vimeo.com/external/1001267395.m3u8?s=8f8d8a8a762f688058e6e6fd6704c402baf1b797&oauth2_token_id=1284792283',
|
|
254
|
-
type: 'vimeo-video',
|
|
255
|
-
},
|
|
256
|
-
}
|
|
144
|
+
onboardingId: number
|
|
145
|
+
): Promise<OnboardingRecommendationResponse> {
|
|
146
|
+
return POST(`/api/user-management-system/v1/onboardings/${onboardingId}/recommendation`, {})
|
|
257
147
|
}
|
|
File without changes
|
|
File without changes
|
|
@@ -98,50 +98,42 @@ export async function logout() {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
|
-
* @param {
|
|
102
|
-
* @
|
|
101
|
+
* @param {number} userId
|
|
102
|
+
* @param {string} redirectTo
|
|
103
|
+
* @returns {Promise<string>}
|
|
103
104
|
*
|
|
104
105
|
* @example
|
|
105
|
-
*
|
|
106
|
-
* .then(response => {
|
|
107
|
-
* const authKey = response.data
|
|
108
|
-
* const webViewUrl = `https://app.musora.com/page?user_id=${userId}&auth_key=${authKey}`
|
|
109
|
-
* })
|
|
110
|
-
* .catch(error => console.error(error));
|
|
106
|
+
* const authUrl = await generateAuthSessionUrl(592656, 'https://app.musora.com/drumeo')
|
|
111
107
|
*/
|
|
112
|
-
export async function
|
|
108
|
+
export async function generateAuthSessionUrl(userId, redirectTo) {
|
|
113
109
|
const baseUrl = `${globalConfig.baseUrl}/api/user-management-system`
|
|
114
|
-
const url = brand ? `${baseUrl}/v1/auth-key?brand=${brand}` : `${baseUrl}/v1/auth-key`
|
|
115
110
|
|
|
116
|
-
const
|
|
111
|
+
const headers = {
|
|
112
|
+
'Content-Type': 'application/json',
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (globalConfig.isMA) {
|
|
116
|
+
headers.Authorization = `Bearer ${globalConfig.sessionConfig.authToken}`
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const response = await fetch(`${baseUrl}/v1/auth-key`, {
|
|
117
120
|
method: 'GET',
|
|
118
|
-
headers
|
|
119
|
-
|
|
120
|
-
'Content-Type': 'application/json',
|
|
121
|
-
},
|
|
121
|
+
headers,
|
|
122
|
+
credentials: globalConfig.isMA ? undefined : 'include',
|
|
122
123
|
})
|
|
123
124
|
|
|
124
125
|
if (!response.ok) {
|
|
125
|
-
throw new Error(`Failed to
|
|
126
|
+
throw new Error(`Failed to generate auth key: ${response.status}`)
|
|
126
127
|
}
|
|
127
128
|
|
|
128
|
-
|
|
129
|
-
|
|
129
|
+
const authKeyResponse = await response.json()
|
|
130
|
+
const authKey = authKeyResponse.data || authKeyResponse.auth_key
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
headers: {
|
|
136
|
-
'Content-Type': 'application/json',
|
|
137
|
-
Authorization: null,
|
|
138
|
-
},
|
|
139
|
-
body: JSON.stringify({
|
|
140
|
-
user_id: userId,
|
|
141
|
-
auth_key: authKey,
|
|
142
|
-
device_name: deviceName,
|
|
143
|
-
device_token: deviceToken,
|
|
144
|
-
platform: platform,
|
|
145
|
-
}),
|
|
132
|
+
const params = new URLSearchParams({
|
|
133
|
+
user_id: userId.toString(),
|
|
134
|
+
auth_key: authKey,
|
|
135
|
+
redirect_to: redirectTo,
|
|
146
136
|
})
|
|
137
|
+
|
|
138
|
+
return `${baseUrl}/v1/sessions/auth-key?${params.toString()}`
|
|
147
139
|
}
|
|
File without changes
|
|
File without changes
|
package/test/HttpClient.test.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/content.test.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/dataContext.test.js
CHANGED
|
File without changes
|
package/test/forum.test.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/initializeTests.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/lib/filter.test.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/test/lib/query.test.ts
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/localStorageMock.js
CHANGED
|
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
|
package/test/sync/adapter.ts
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/tools/generate-index.cjs
CHANGED
|
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);
|
package/test/reporting.test.js
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
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
|
-
})
|