musora-content-services 2.107.1 โ 2.107.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -6
- package/CHANGELOG.md +2 -0
- package/package.json +1 -1
- package/src/filterBuilder.js +0 -0
- package/src/index.d.ts +2 -4
- package/src/index.js +2 -4
- package/src/lib/ads/monoid.ts +0 -0
- package/src/lib/ads/semigroup.ts +0 -0
- package/src/lib/sanity/filter.ts +0 -0
- package/src/lib/sanity/query.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/award-definitions.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/types.d.ts +0 -0
- package/src/services/awards/types.js +0 -0
- package/src/services/content/artist.ts +0 -0
- package/src/services/content/genre.ts +0 -0
- package/src/services/content/instructor.ts +0 -0
- package/src/services/content.js +0 -0
- package/src/services/contentAggregator.js +0 -0
- package/src/services/contentProgress.js +0 -0
- package/src/services/forums/forums.ts +0 -0
- package/src/services/forums/threads.ts +0 -0
- package/src/services/permissions/PermissionsV2Adapter.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/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/manager.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/repositories/content-progress.ts +0 -0
- package/src/services/sync/repositories/user-award-progress.ts +0 -0
- package/src/services/sync/retry.ts +0 -0
- package/src/services/sync/schema/index.ts +0 -0
- package/src/services/sync/store/index.ts +0 -0
- package/src/services/user/memberships.ts +0 -0
- package/src/services/user/onboarding.ts +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/test/awards/award-completion-flow.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/query.test.ts +0 -0
- package/test/sanityQueryService.test.js +0 -0
- package/test/sync/adapter.ts +0 -0
- package/test/sync/initialize-sync-manager.js +0 -0
- 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,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"permissions": {
|
|
3
3
|
"allow": [
|
|
4
|
-
"Read(//app/musora-platform-backend/**)",
|
|
5
|
-
"Read(//app/musora-platform-frontend/**)",
|
|
6
4
|
"Bash(find:*)",
|
|
7
|
-
"Bash(sed:*)",
|
|
8
|
-
"Read(//app/**)",
|
|
9
|
-
"Bash(cat:*)",
|
|
10
5
|
"Bash(docker exec:*)",
|
|
11
|
-
"Bash(npm
|
|
6
|
+
"Bash(npm test:*)",
|
|
7
|
+
"WebSearch",
|
|
8
|
+
"WebFetch(domain:watermelondb.dev)",
|
|
9
|
+
"WebFetch(domain:github.com)",
|
|
10
|
+
"Bash(git checkout:*)",
|
|
11
|
+
"Bash(npm run doc:*)",
|
|
12
|
+
"Bash(cat:*)",
|
|
13
|
+
"Bash(tr:*)",
|
|
14
|
+
"Bash(npm run build-index:*)"
|
|
12
15
|
],
|
|
13
16
|
"deny": [],
|
|
14
17
|
"ask": []
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
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.107.2](https://github.com/railroadmedia/musora-content-services/compare/v2.107.1...v2.107.2) (2025-12-19)
|
|
6
|
+
|
|
5
7
|
### [2.107.1](https://github.com/railroadmedia/musora-content-services/compare/v2.107.0...v2.107.1) (2025-12-19)
|
|
6
8
|
|
|
7
9
|
## [2.107.0](https://github.com/railroadmedia/musora-content-services/compare/v2.105.0...v2.107.0) (2025-12-19)
|
package/package.json
CHANGED
package/src/filterBuilder.js
CHANGED
|
File without changes
|
package/src/index.d.ts
CHANGED
|
@@ -396,9 +396,8 @@ import {
|
|
|
396
396
|
} from './services/user/profile.js';
|
|
397
397
|
|
|
398
398
|
import {
|
|
399
|
-
|
|
399
|
+
generateAuthSessionUrl,
|
|
400
400
|
login,
|
|
401
|
-
loginWithAuthKey,
|
|
402
401
|
logout
|
|
403
402
|
} from './services/user/sessions.js';
|
|
404
403
|
|
|
@@ -580,13 +579,13 @@ declare module 'musora-content-services' {
|
|
|
580
579
|
fetchUserPractices,
|
|
581
580
|
findIncompleteLesson,
|
|
582
581
|
followThread,
|
|
582
|
+
generateAuthSessionUrl,
|
|
583
583
|
getActiveDiscussions,
|
|
584
584
|
getActivePath,
|
|
585
585
|
getAllCompleted,
|
|
586
586
|
getAllCompletedByIds,
|
|
587
587
|
getAllStarted,
|
|
588
588
|
getAllStartedOrCompleted,
|
|
589
|
-
getAuthKey,
|
|
590
589
|
getAwardStatistics,
|
|
591
590
|
getCompletedAwards,
|
|
592
591
|
getContentAwards,
|
|
@@ -650,7 +649,6 @@ declare module 'musora-content-services' {
|
|
|
650
649
|
likePost,
|
|
651
650
|
lockThread,
|
|
652
651
|
login,
|
|
653
|
-
loginWithAuthKey,
|
|
654
652
|
logout,
|
|
655
653
|
mapContentToParent,
|
|
656
654
|
markAllNotificationsAsRead,
|
package/src/index.js
CHANGED
|
@@ -400,9 +400,8 @@ import {
|
|
|
400
400
|
} from './services/user/profile.js';
|
|
401
401
|
|
|
402
402
|
import {
|
|
403
|
-
|
|
403
|
+
generateAuthSessionUrl,
|
|
404
404
|
login,
|
|
405
|
-
loginWithAuthKey,
|
|
406
405
|
logout
|
|
407
406
|
} from './services/user/sessions.js';
|
|
408
407
|
|
|
@@ -579,13 +578,13 @@ export {
|
|
|
579
578
|
fetchUserPractices,
|
|
580
579
|
findIncompleteLesson,
|
|
581
580
|
followThread,
|
|
581
|
+
generateAuthSessionUrl,
|
|
582
582
|
getActiveDiscussions,
|
|
583
583
|
getActivePath,
|
|
584
584
|
getAllCompleted,
|
|
585
585
|
getAllCompletedByIds,
|
|
586
586
|
getAllStarted,
|
|
587
587
|
getAllStartedOrCompleted,
|
|
588
|
-
getAuthKey,
|
|
589
588
|
getAwardStatistics,
|
|
590
589
|
getCompletedAwards,
|
|
591
590
|
getContentAwards,
|
|
@@ -649,7 +648,6 @@ export {
|
|
|
649
648
|
likePost,
|
|
650
649
|
lockThread,
|
|
651
650
|
login,
|
|
652
|
-
loginWithAuthKey,
|
|
653
651
|
logout,
|
|
654
652
|
mapContentToParent,
|
|
655
653
|
markAllNotificationsAsRead,
|
package/src/lib/ads/monoid.ts
CHANGED
|
File without changes
|
package/src/lib/ads/semigroup.ts
CHANGED
|
File without changes
|
package/src/lib/sanity/filter.ts
CHANGED
|
File without changes
|
package/src/lib/sanity/query.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
|
package/src/services/content.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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/initializeTests.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/test/lib/filter.test.ts
CHANGED
|
File without changes
|
package/test/lib/query.test.ts
CHANGED
|
File without changes
|
|
File without changes
|
package/test/sync/adapter.ts
CHANGED
|
File without changes
|
|
File without changes
|
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
|
-
})
|
package/test_owned_navigate.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { initializeService } from './src/services/config.js'
|
|
2
|
-
import { getOwnedContent } from './src/services/content.js'
|
|
3
|
-
import dotenv from 'dotenv'
|
|
4
|
-
|
|
5
|
-
dotenv.config()
|
|
6
|
-
|
|
7
|
-
// Initialize service with credentials from .env
|
|
8
|
-
initializeService({
|
|
9
|
-
sanityConfig: {
|
|
10
|
-
token: process.env.SANITY_API_TOKEN,
|
|
11
|
-
projectId: process.env.SANITY_PROJECT_ID,
|
|
12
|
-
dataset: process.env.SANITY_DATASET,
|
|
13
|
-
version: '2023-01-01',
|
|
14
|
-
},
|
|
15
|
-
railcontentConfig: {
|
|
16
|
-
email: process.env.RAILCONTENT_EMAIL,
|
|
17
|
-
password: process.env.RAILCONTENT_PASSWORD,
|
|
18
|
-
userId: parseInt(process.env.RAILCONTENT_USER_ID),
|
|
19
|
-
baseUrl: process.env.RAILCONTENT_BASE_URL,
|
|
20
|
-
},
|
|
21
|
-
localStorage: null,
|
|
22
|
-
isMA: false,
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
async function testOwnedContentNavigateTo() {
|
|
26
|
-
console.log('\n๐งช Testing owned content with navigateTo...\n')
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
// Test for drumeo lessons
|
|
30
|
-
const result = await getOwnedContent('drumeo', {
|
|
31
|
-
type: ['course', 'guided-course', 'pack'],
|
|
32
|
-
limit: 5,
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
console.log('๐ Results:', {
|
|
36
|
-
total: result.total,
|
|
37
|
-
count: result.entity?.length || 0,
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
if (result.entity && result.entity.length > 0) {
|
|
41
|
-
result.entity.forEach((item, index) => {
|
|
42
|
-
console.log(`\n๐ฆ Item ${index + 1}:`)
|
|
43
|
-
console.log(` - ID: ${item.id}`)
|
|
44
|
-
console.log(` - Title: ${item.title}`)
|
|
45
|
-
console.log(` - Type: ${item.type}`)
|
|
46
|
-
console.log(` - Has children: ${item.children ? 'โ
YES' : 'โ NO'}`)
|
|
47
|
-
console.log(` - Children count: ${item.children?.length || 0}`)
|
|
48
|
-
console.log(` - Has navigateTo: ${item.navigateTo ? 'โ
YES' : 'โ NO'}`)
|
|
49
|
-
|
|
50
|
-
if (item.navigateTo) {
|
|
51
|
-
console.log(` - NavigateTo ID: ${item.navigateTo.id}`)
|
|
52
|
-
console.log(` - NavigateTo Type: ${item.navigateTo.type}`)
|
|
53
|
-
console.log(` - NavigateTo Title: ${item.children?.find(c => c.id === item.navigateTo.id)?.title || 'N/A'}`)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (item.progressPercentage !== undefined) {
|
|
57
|
-
console.log(` - Progress: ${item.progressPercentage}%`)
|
|
58
|
-
}
|
|
59
|
-
if (item.progressStatus) {
|
|
60
|
-
console.log(` - Status: ${item.progressStatus}`)
|
|
61
|
-
}
|
|
62
|
-
})
|
|
63
|
-
} else {
|
|
64
|
-
console.log('\nโ ๏ธ No owned content found for this user')
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
console.log('\nโ
Test completed successfully!')
|
|
68
|
-
} catch (error) {
|
|
69
|
-
console.error('\nโ Test failed:', error.message)
|
|
70
|
-
console.error(error.stack)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
testOwnedContentNavigateTo()
|