musora-content-services 2.107.3 → 2.107.4
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 +16 -0
- 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/.yarnrc.yml +1 -0
- package/CHANGELOG.md +9 -0
- package/CLAUDE.md +0 -0
- package/README.md +0 -0
- package/babel.config.cjs +0 -0
- package/check_content.js +30 -0
- package/check_content.mjs +32 -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 +17 -0
- package/src/index.js +17 -0
- package/src/infrastructure/http/HttpClient.ts +0 -0
- 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 +0 -0
- package/src/services/content/content.ts +0 -0
- package/src/services/content/genre.ts +0 -0
- package/src/services/content/instructor.ts +0 -0
- package/src/services/content-org/content-org.js +0 -0
- package/src/services/content-org/guided-courses.ts +0 -0
- package/src/services/content-org/learning-paths.ts +0 -0
- package/src/services/content-org/playlists-types.js +0 -0
- package/src/services/content-org/playlists.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 +50 -2
- package/src/services/forums/threads.ts +13 -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 +80 -3
- package/src/services/recommendations.js +0 -0
- package/src/services/reporting/README.md +0 -0
- package/src/services/reporting/reporting.ts +71 -3
- 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/urlBuilder.ts +297 -0
- package/src/services/user/account.ts +0 -0
- package/src/services/user/chat.js +0 -0
- package/src/services/user/interests.js +0 -0
- package/src/services/user/management.js +0 -0
- package/src/services/user/memberships.ts +0 -0
- package/src/services/user/notifications.js +0 -0
- package/src/services/user/onboarding.ts +0 -0
- package/src/services/user/payments.ts +0 -0
- package/src/services/user/permissions.js +0 -0
- package/src/services/user/profile.js +0 -0
- package/src/services/user/sessions.js +0 -0
- package/src/services/user/types.d.ts +0 -0
- package/src/services/user/types.js +0 -0
- package/src/services/user/user-management-system.js +0 -0
- package/src/services/userActivity.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/reporting.test.js +132 -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/test_owned_navigate.js +74 -0
- package/tools/generate-index.cjs +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
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/.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/.yarnrc.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nodeLinker: node-modules
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
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.4](https://github.com/railroadmedia/musora-content-services/compare/v2.107.1...v2.107.4) (2025-12-22)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **AGI:** contentType optional ([deae293](https://github.com/railroadmedia/musora-content-services/commit/deae2934c26ea0b9ee4d68c736fbb5753616a5e9))
|
|
11
|
+
* **AGI:** return children on AGI lessons functions ([#671](https://github.com/railroadmedia/musora-content-services/issues/671)) ([92ed791](https://github.com/railroadmedia/musora-content-services/commit/92ed791ce563aa4f1bf16cb41d2b6fe421504064))
|
|
12
|
+
* **onboarding:** call BE for recommendation ([#670](https://github.com/railroadmedia/musora-content-services/issues/670)) ([a876736](https://github.com/railroadmedia/musora-content-services/commit/a8767363ff3428638bde477cd6c30e5bf61179b2))
|
|
13
|
+
|
|
5
14
|
### [2.107.3](https://github.com/railroadmedia/musora-content-services/compare/v2.107.2...v2.107.3) (2025-12-19)
|
|
6
15
|
|
|
7
16
|
|
package/CLAUDE.md
CHANGED
|
File without changes
|
package/README.md
CHANGED
|
File without changes
|
package/babel.config.cjs
CHANGED
|
File without changes
|
package/check_content.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
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);
|
|
@@ -0,0 +1,32 @@
|
|
|
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/jest.config.js
CHANGED
|
File without changes
|
package/jsdoc.json
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
File without changes
|
package/src/contentMetaData.js
CHANGED
|
File without changes
|
package/src/filterBuilder.js
CHANGED
|
File without changes
|
package/src/index.d.ts
CHANGED
|
@@ -155,6 +155,7 @@ import {
|
|
|
155
155
|
createPost,
|
|
156
156
|
deletePost,
|
|
157
157
|
fetchCommunityGuidelines,
|
|
158
|
+
fetchPost,
|
|
158
159
|
fetchPosts,
|
|
159
160
|
jumpToPost,
|
|
160
161
|
likePost,
|
|
@@ -168,6 +169,7 @@ import {
|
|
|
168
169
|
deleteThread,
|
|
169
170
|
fetchFollowedThreads,
|
|
170
171
|
fetchLatestThreads,
|
|
172
|
+
fetchThread,
|
|
171
173
|
fetchThreads,
|
|
172
174
|
followThread,
|
|
173
175
|
lockThread,
|
|
@@ -310,6 +312,14 @@ import {
|
|
|
310
312
|
jumpToContinueContent
|
|
311
313
|
} from './services/sanity.js';
|
|
312
314
|
|
|
315
|
+
import {
|
|
316
|
+
generateCommentUrl,
|
|
317
|
+
generateContentUrl,
|
|
318
|
+
generateContentUrlWithDomain,
|
|
319
|
+
generateForumPostUrl,
|
|
320
|
+
generatePlaylistUrl
|
|
321
|
+
} from './services/urlBuilder.ts';
|
|
322
|
+
|
|
313
323
|
import {
|
|
314
324
|
confirmEmailChange,
|
|
315
325
|
deleteAccount,
|
|
@@ -543,6 +553,7 @@ declare module 'musora-content-services' {
|
|
|
543
553
|
fetchPlayAlongsCount,
|
|
544
554
|
fetchPlaylist,
|
|
545
555
|
fetchPlaylistItems,
|
|
556
|
+
fetchPost,
|
|
546
557
|
fetchPosts,
|
|
547
558
|
fetchRecent,
|
|
548
559
|
fetchRecentActivitiesActiveTabs,
|
|
@@ -563,6 +574,7 @@ declare module 'musora-content-services' {
|
|
|
563
574
|
fetchSongById,
|
|
564
575
|
fetchSongsInProgress,
|
|
565
576
|
fetchTabData,
|
|
577
|
+
fetchThread,
|
|
566
578
|
fetchThreads,
|
|
567
579
|
fetchTopComment,
|
|
568
580
|
fetchTopLevelParentId,
|
|
@@ -580,6 +592,11 @@ declare module 'musora-content-services' {
|
|
|
580
592
|
findIncompleteLesson,
|
|
581
593
|
followThread,
|
|
582
594
|
generateAuthSessionUrl,
|
|
595
|
+
generateCommentUrl,
|
|
596
|
+
generateContentUrl,
|
|
597
|
+
generateContentUrlWithDomain,
|
|
598
|
+
generateForumPostUrl,
|
|
599
|
+
generatePlaylistUrl,
|
|
583
600
|
getActiveDiscussions,
|
|
584
601
|
getActivePath,
|
|
585
602
|
getAllCompleted,
|
package/src/index.js
CHANGED
|
@@ -159,6 +159,7 @@ import {
|
|
|
159
159
|
createPost,
|
|
160
160
|
deletePost,
|
|
161
161
|
fetchCommunityGuidelines,
|
|
162
|
+
fetchPost,
|
|
162
163
|
fetchPosts,
|
|
163
164
|
jumpToPost,
|
|
164
165
|
likePost,
|
|
@@ -172,6 +173,7 @@ import {
|
|
|
172
173
|
deleteThread,
|
|
173
174
|
fetchFollowedThreads,
|
|
174
175
|
fetchLatestThreads,
|
|
176
|
+
fetchThread,
|
|
175
177
|
fetchThreads,
|
|
176
178
|
followThread,
|
|
177
179
|
lockThread,
|
|
@@ -314,6 +316,14 @@ import {
|
|
|
314
316
|
jumpToContinueContent
|
|
315
317
|
} from './services/sanity.js';
|
|
316
318
|
|
|
319
|
+
import {
|
|
320
|
+
generateCommentUrl,
|
|
321
|
+
generateContentUrl,
|
|
322
|
+
generateContentUrlWithDomain,
|
|
323
|
+
generateForumPostUrl,
|
|
324
|
+
generatePlaylistUrl
|
|
325
|
+
} from './services/urlBuilder.ts';
|
|
326
|
+
|
|
317
327
|
import {
|
|
318
328
|
confirmEmailChange,
|
|
319
329
|
deleteAccount,
|
|
@@ -542,6 +552,7 @@ export {
|
|
|
542
552
|
fetchPlayAlongsCount,
|
|
543
553
|
fetchPlaylist,
|
|
544
554
|
fetchPlaylistItems,
|
|
555
|
+
fetchPost,
|
|
545
556
|
fetchPosts,
|
|
546
557
|
fetchRecent,
|
|
547
558
|
fetchRecentActivitiesActiveTabs,
|
|
@@ -562,6 +573,7 @@ export {
|
|
|
562
573
|
fetchSongById,
|
|
563
574
|
fetchSongsInProgress,
|
|
564
575
|
fetchTabData,
|
|
576
|
+
fetchThread,
|
|
565
577
|
fetchThreads,
|
|
566
578
|
fetchTopComment,
|
|
567
579
|
fetchTopLevelParentId,
|
|
@@ -579,6 +591,11 @@ export {
|
|
|
579
591
|
findIncompleteLesson,
|
|
580
592
|
followThread,
|
|
581
593
|
generateAuthSessionUrl,
|
|
594
|
+
generateCommentUrl,
|
|
595
|
+
generateContentUrl,
|
|
596
|
+
generateContentUrlWithDomain,
|
|
597
|
+
generateForumPostUrl,
|
|
598
|
+
generatePlaylistUrl,
|
|
582
599
|
getActiveDiscussions,
|
|
583
600
|
getActivePath,
|
|
584
601
|
getAllCompleted,
|
|
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/ads/monoid.ts
CHANGED
|
File without changes
|
package/src/lib/ads/semigroup.ts
CHANGED
|
File without changes
|
package/src/lib/brands.ts
CHANGED
|
File without changes
|
package/src/lib/lastUpdated.js
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/src/services/config.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/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
|
|
@@ -23,8 +23,26 @@ export interface CreatePostParams {
|
|
|
23
23
|
* @throws {HttpError} - If the request fails.
|
|
24
24
|
*/
|
|
25
25
|
export async function createPost(threadId: number, params: CreatePostParams): Promise<ForumPost> {
|
|
26
|
+
const { generateForumPostUrl } = await import('../urlBuilder.ts')
|
|
27
|
+
const { fetchThread } = await import('./threads.ts')
|
|
28
|
+
|
|
29
|
+
// Fetch thread to get category_id for URL generation
|
|
30
|
+
const thread = await fetchThread(threadId, params.brand)
|
|
31
|
+
|
|
32
|
+
// Generate forum post URL
|
|
33
|
+
const contentUrl = generateForumPostUrl({
|
|
34
|
+
brand: params.brand,
|
|
35
|
+
thread: {
|
|
36
|
+
category_id: thread.category_id,
|
|
37
|
+
id: threadId
|
|
38
|
+
}
|
|
39
|
+
}, false)
|
|
40
|
+
|
|
26
41
|
const httpClient = new HttpClient(globalConfig.baseUrl)
|
|
27
|
-
return httpClient.post<ForumPost>(`${baseUrl}/v1/threads/${threadId}/posts`,
|
|
42
|
+
return httpClient.post<ForumPost>(`${baseUrl}/v1/threads/${threadId}/posts`, {
|
|
43
|
+
...params,
|
|
44
|
+
content_url: contentUrl
|
|
45
|
+
})
|
|
28
46
|
}
|
|
29
47
|
|
|
30
48
|
/**
|
|
@@ -40,6 +58,19 @@ export async function updatePost(postId: number, params: CreatePostParams): Prom
|
|
|
40
58
|
return httpClient.put<ForumPost>(`${baseUrl}/v1/posts/${postId}`, params)
|
|
41
59
|
}
|
|
42
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Fetches a single forum post by ID.
|
|
63
|
+
*
|
|
64
|
+
* @param {number} postId - The ID of the post to fetch.
|
|
65
|
+
* @param {string} brand - The brand context (e.g., "drumeo", "singeo").
|
|
66
|
+
* @returns {Promise<ForumPost>} - A promise that resolves to the forum post.
|
|
67
|
+
* @throws {HttpError} - If the HTTP request fails.
|
|
68
|
+
*/
|
|
69
|
+
export async function fetchPost(postId: number, brand: string): Promise<ForumPost> {
|
|
70
|
+
const httpClient = new HttpClient(globalConfig.baseUrl)
|
|
71
|
+
return httpClient.get<ForumPost>(`${baseUrl}/v1/posts/${postId}?brand=${brand}`)
|
|
72
|
+
}
|
|
73
|
+
|
|
43
74
|
export interface FetchPostParams {
|
|
44
75
|
page?: number
|
|
45
76
|
limit?: number
|
|
@@ -91,8 +122,25 @@ export async function fetchPosts(
|
|
|
91
122
|
* @throws {HttpError} - If the request fails.
|
|
92
123
|
*/
|
|
93
124
|
export async function likePost(postId: number, brand: string): Promise<void> {
|
|
125
|
+
const { generateForumPostUrl } = await import('../urlBuilder.ts')
|
|
126
|
+
|
|
127
|
+
// Fetch post to get thread info for URL generation
|
|
128
|
+
const post = await fetchPost(postId, brand)
|
|
129
|
+
|
|
130
|
+
// Generate forum post URL
|
|
131
|
+
const contentUrl = generateForumPostUrl({
|
|
132
|
+
brand,
|
|
133
|
+
thread: {
|
|
134
|
+
category_id: post.thread.category_id,
|
|
135
|
+
id: post.thread.id
|
|
136
|
+
}
|
|
137
|
+
}, false)
|
|
138
|
+
|
|
94
139
|
const httpClient = new HttpClient(globalConfig.baseUrl)
|
|
95
|
-
return httpClient.post<void>(`${baseUrl}/v1/posts/${postId}/likes`, {
|
|
140
|
+
return httpClient.post<void>(`${baseUrl}/v1/posts/${postId}/likes`, {
|
|
141
|
+
brand,
|
|
142
|
+
content_url: contentUrl
|
|
143
|
+
})
|
|
96
144
|
}
|
|
97
145
|
|
|
98
146
|
/**
|
|
@@ -89,6 +89,19 @@ export async function markThreadAsRead(threadId: number, brand: string): Promise
|
|
|
89
89
|
return httpClient.put<void>(`${baseUrl}/v1/threads/${threadId}/read?brand=${brand}`, {})
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Fetches a single forum thread by ID.
|
|
94
|
+
*
|
|
95
|
+
* @param {number} threadId - The ID of the thread to fetch.
|
|
96
|
+
* @param {string} brand - The brand context (e.g., "drumeo", "singeo").
|
|
97
|
+
* @returns {Promise<ForumThread>} - A promise that resolves to the forum thread.
|
|
98
|
+
* @throws {HttpError} - If the HTTP request fails.
|
|
99
|
+
*/
|
|
100
|
+
export async function fetchThread(threadId: number, brand: string): Promise<ForumThread> {
|
|
101
|
+
const httpClient = new HttpClient(globalConfig.baseUrl)
|
|
102
|
+
return httpClient.get<ForumThread>(`${baseUrl}/v1/threads/${threadId}?brand=${brand}`)
|
|
103
|
+
}
|
|
104
|
+
|
|
92
105
|
export interface FetchThreadParams {
|
|
93
106
|
is_followed?: boolean,
|
|
94
107
|
page?: number,
|
|
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
|
|
@@ -249,8 +249,38 @@ export async function restoreComment(commentId) {
|
|
|
249
249
|
* @returns {Promise<*|null>}
|
|
250
250
|
*/
|
|
251
251
|
export async function replyToComment(commentId, comment) {
|
|
252
|
+
const { generateCommentUrl } = await import('./urlBuilder.ts')
|
|
253
|
+
const { fetchByRailContentIds } = await import('./sanity.js')
|
|
254
|
+
|
|
255
|
+
// Fetch parent comment to get content info
|
|
256
|
+
const parentComment = await fetchComment(commentId)
|
|
257
|
+
|
|
258
|
+
if (!parentComment?.content) {
|
|
259
|
+
const url = `/api/content/v1/comments/${commentId}/reply`
|
|
260
|
+
return await POST(url, { comment })
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Fetch content from Sanity to get parentId and correct type
|
|
264
|
+
const contents = await fetchByRailContentIds([parentComment.content.id])
|
|
265
|
+
const content = contents?.[0]
|
|
266
|
+
|
|
267
|
+
// Generate content URL
|
|
268
|
+
const contentUrl = content ? generateCommentUrl({
|
|
269
|
+
id: commentId,
|
|
270
|
+
content: {
|
|
271
|
+
id: content.id,
|
|
272
|
+
type: content.type,
|
|
273
|
+
parentId: content.parentId || content.parent_id,
|
|
274
|
+
brand: content.brand
|
|
275
|
+
}
|
|
276
|
+
}, false) : null
|
|
277
|
+
|
|
278
|
+
const data = {
|
|
279
|
+
comment: comment,
|
|
280
|
+
...(contentUrl && { content_url: contentUrl })
|
|
281
|
+
}
|
|
252
282
|
const url = `/api/content/v1/comments/${commentId}/reply`
|
|
253
|
-
return await POST(url,
|
|
283
|
+
return await POST(url, data)
|
|
254
284
|
}
|
|
255
285
|
|
|
256
286
|
/**
|
|
@@ -259,8 +289,28 @@ export async function replyToComment(commentId, comment) {
|
|
|
259
289
|
* @returns {Promise<*|null>}
|
|
260
290
|
*/
|
|
261
291
|
export async function createComment(railcontentId, comment) {
|
|
292
|
+
const { generateContentUrl } = await import('./urlBuilder.ts')
|
|
293
|
+
const { fetchByRailContentIds } = await import('./sanity.js')
|
|
294
|
+
|
|
295
|
+
// Fetch content to get type and brand info
|
|
296
|
+
const contents = await fetchByRailContentIds([railcontentId])
|
|
297
|
+
const content = contents?.[0]
|
|
298
|
+
|
|
299
|
+
// Generate content URL
|
|
300
|
+
const contentUrl = content ? generateContentUrl({
|
|
301
|
+
id: content.id,
|
|
302
|
+
type: content.type,
|
|
303
|
+
parentId: content.parentId || content.parent_id,
|
|
304
|
+
brand: content.brand
|
|
305
|
+
}) : null
|
|
306
|
+
|
|
307
|
+
const data = {
|
|
308
|
+
comment: comment,
|
|
309
|
+
content_id: railcontentId,
|
|
310
|
+
...(contentUrl && { content_url: contentUrl })
|
|
311
|
+
}
|
|
262
312
|
const url = `/api/content/v1/comments/store`
|
|
263
|
-
return await POST(url,
|
|
313
|
+
return await POST(url, data)
|
|
264
314
|
}
|
|
265
315
|
|
|
266
316
|
/**
|
|
@@ -286,8 +336,35 @@ export async function unassignModeratorToComment(commentId) {
|
|
|
286
336
|
* @returns {Promise<*|null>}
|
|
287
337
|
*/
|
|
288
338
|
export async function likeComment(commentId) {
|
|
339
|
+
const { generateCommentUrl } = await import('./urlBuilder.ts')
|
|
340
|
+
const { fetchByRailContentIds } = await import('./sanity.js')
|
|
341
|
+
|
|
342
|
+
// Fetch comment to get content info
|
|
343
|
+
const comment = await fetchComment(commentId)
|
|
344
|
+
|
|
345
|
+
if (!comment?.content) {
|
|
346
|
+
const url = `/api/content/v1/comments/${commentId}/like`
|
|
347
|
+
return await POST(url, null)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Fetch content from Sanity to get parentId and correct type
|
|
351
|
+
const contents = await fetchByRailContentIds([comment.content.id])
|
|
352
|
+
const content = contents?.[0]
|
|
353
|
+
|
|
354
|
+
// Generate content URL
|
|
355
|
+
const contentUrl = content ? generateCommentUrl({
|
|
356
|
+
id: commentId,
|
|
357
|
+
content: {
|
|
358
|
+
id: content.id,
|
|
359
|
+
type: content.type,
|
|
360
|
+
parentId: content.parentId || content.parent_id,
|
|
361
|
+
brand: content.brand
|
|
362
|
+
}
|
|
363
|
+
}, false) : null
|
|
364
|
+
|
|
289
365
|
const url = `/api/content/v1/comments/${commentId}/like`
|
|
290
|
-
|
|
366
|
+
const data = contentUrl ? { content_url: contentUrl } : {}
|
|
367
|
+
return await POST(url, data)
|
|
291
368
|
}
|
|
292
369
|
|
|
293
370
|
/**
|
|
File without changes
|
|
File without changes
|