musora-content-services 1.0.162 → 1.0.164
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/CHANGELOG.md +4 -0
- package/docs/config.js.html +0 -0
- package/docs/index.html +0 -0
- package/docs/module-Config.html +0 -0
- package/docs/module-Railcontent-Services.html +0 -0
- package/docs/module-Sanity-Services.html +0 -0
- package/docs/railcontent.js.html +0 -0
- package/docs/sanity.js.html +0 -0
- package/package.json +1 -1
- package/src/filterBuilder.js +0 -0
- package/src/index.d.ts +4 -0
- package/src/index.js +4 -0
- package/src/services/contentProgress.js +48 -8
- package/src/services/dataContext.js +0 -0
- package/src/services/lastUpdated.js +0 -0
- package/src/services/railcontent.js +0 -0
- package/src/services/userPermissions.js +0 -0
- package/test/contentLikes.test.js +0 -0
- package/test/contentProgress.test.js +45 -2
- package/test/initializeTests.js +0 -0
- package/test/lastUpdated.test.js +0 -0
- package/test/sanityQueryService.test.js +0 -0
- package/test/userPermissions.test.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
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
|
+
### [1.0.164](https://github.com/railroadmedia/musora-content-services/compare/v1.0.163...v1.0.164) (2024-11-09)
|
|
6
|
+
|
|
7
|
+
### [1.0.163](https://github.com/railroadmedia/musora-content-services/compare/v1.0.162...v1.0.163) (2024-11-08)
|
|
8
|
+
|
|
5
9
|
### [1.0.162](https://github.com/railroadmedia/musora-content-services/compare/v1.0.161...v1.0.162) (2024-11-08)
|
|
6
10
|
|
|
7
11
|
### [1.0.161](https://github.com/railroadmedia/musora-content-services/compare/v1.0.152...v1.0.161) (2024-11-08)
|
package/docs/config.js.html
CHANGED
|
File without changes
|
package/docs/index.html
CHANGED
|
File without changes
|
package/docs/module-Config.html
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/docs/railcontent.js.html
CHANGED
|
File without changes
|
package/docs/sanity.js.html
CHANGED
|
File without changes
|
package/package.json
CHANGED
package/src/filterBuilder.js
CHANGED
|
File without changes
|
package/src/index.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ import {
|
|
|
14
14
|
import {
|
|
15
15
|
contentStatusCompleted,
|
|
16
16
|
contentStatusReset,
|
|
17
|
+
getAllCompleted,
|
|
18
|
+
getAllStarted,
|
|
17
19
|
getProgressPercentage,
|
|
18
20
|
getProgressPercentageByIds,
|
|
19
21
|
getProgressState,
|
|
@@ -200,6 +202,8 @@ declare module 'musora-content-services' {
|
|
|
200
202
|
fetchUserPermissionsData,
|
|
201
203
|
fetchUserPlaylists,
|
|
202
204
|
fetchWorkouts,
|
|
205
|
+
getAllCompleted,
|
|
206
|
+
getAllStarted,
|
|
203
207
|
getProgressPercentage,
|
|
204
208
|
getProgressPercentageByIds,
|
|
205
209
|
getProgressState,
|
package/src/index.js
CHANGED
|
@@ -14,6 +14,8 @@ import {
|
|
|
14
14
|
import {
|
|
15
15
|
contentStatusCompleted,
|
|
16
16
|
contentStatusReset,
|
|
17
|
+
getAllCompleted,
|
|
18
|
+
getAllStarted,
|
|
17
19
|
getProgressPercentage,
|
|
18
20
|
getProgressPercentageByIds,
|
|
19
21
|
getProgressState,
|
|
@@ -199,6 +201,8 @@ export {
|
|
|
199
201
|
fetchUserPermissionsData,
|
|
200
202
|
fetchUserPlaylists,
|
|
201
203
|
fetchWorkouts,
|
|
204
|
+
getAllCompleted,
|
|
205
|
+
getAllStarted,
|
|
202
206
|
getProgressPercentage,
|
|
203
207
|
getProgressPercentageByIds,
|
|
204
208
|
getProgressState,
|
|
@@ -2,17 +2,17 @@ import {
|
|
|
2
2
|
fetchContentProgress,
|
|
3
3
|
postContentCompleted,
|
|
4
4
|
postContentReset,
|
|
5
|
-
postContentStarted,
|
|
6
5
|
postRecordWatchSession
|
|
7
6
|
} from "./railcontent";
|
|
8
7
|
import {DataContext, ContentProgressVersionKey} from "./dataContext";
|
|
9
|
-
import {fetchHierarchy
|
|
8
|
+
import {fetchHierarchy} from "./sanity";
|
|
10
9
|
|
|
11
10
|
const STATE_STARTED = 'started';
|
|
12
11
|
const STATE_COMPLETED = 'completed';
|
|
13
12
|
const DATA_KEY_STATUS = 's';
|
|
14
13
|
const DATA_KEY_PROGRESS = 'p';
|
|
15
14
|
const DATA_KEY_RESUME_TIME = 't';
|
|
15
|
+
const DATA_KEY_LAST_UPDATED_TIME = 'u';
|
|
16
16
|
export let dataContext = new DataContext(ContentProgressVersionKey, fetchContentProgress);
|
|
17
17
|
|
|
18
18
|
export async function getProgressPercentage(contentId) {
|
|
@@ -43,6 +43,44 @@ export async function getProgressStateByIds(contentIds) {
|
|
|
43
43
|
return progress;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
export async function getAllStarted(limit = null) {
|
|
47
|
+
const data = await dataContext.getData();
|
|
48
|
+
let ids = Object.keys(data).filter(function (key) {
|
|
49
|
+
return data[parseInt(key)][DATA_KEY_STATUS] === STATE_STARTED;
|
|
50
|
+
}).map(function (key) {
|
|
51
|
+
return parseInt(key);
|
|
52
|
+
}).sort(function (a, b) {
|
|
53
|
+
let v1 = data[a][DATA_KEY_LAST_UPDATED_TIME];
|
|
54
|
+
let v2 = data[b][DATA_KEY_LAST_UPDATED_TIME];
|
|
55
|
+
if (v1 > v2) return -1;
|
|
56
|
+
else if (v1 < v2) return 1;
|
|
57
|
+
return 0;
|
|
58
|
+
});
|
|
59
|
+
if (limit) {
|
|
60
|
+
ids = ids.slice(0, limit);
|
|
61
|
+
}
|
|
62
|
+
return ids;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function getAllCompleted(limit = null) {
|
|
66
|
+
const data = await dataContext.getData();
|
|
67
|
+
let ids = Object.keys(data).filter(function (key) {
|
|
68
|
+
return data[parseInt(key)][DATA_KEY_STATUS] === STATE_COMPLETED;
|
|
69
|
+
}).map(function (key) {
|
|
70
|
+
return parseInt(key);
|
|
71
|
+
}).sort(function (a, b) {
|
|
72
|
+
let v1 = data[a][DATA_KEY_LAST_UPDATED_TIME];
|
|
73
|
+
let v2 = data[b][DATA_KEY_LAST_UPDATED_TIME];
|
|
74
|
+
if (v1 > v2) return -1;
|
|
75
|
+
else if (v1 < v2) return 1;
|
|
76
|
+
return 0;
|
|
77
|
+
});
|
|
78
|
+
if (limit) {
|
|
79
|
+
ids = ids.slice(0, limit);
|
|
80
|
+
}
|
|
81
|
+
return ids;
|
|
82
|
+
}
|
|
83
|
+
|
|
46
84
|
export async function getResumeTimeSeconds(contentId) {
|
|
47
85
|
let data = await dataContext.getData();
|
|
48
86
|
return data[contentId]?.[DATA_KEY_RESUME_TIME] ?? 0;
|
|
@@ -50,8 +88,8 @@ export async function getResumeTimeSeconds(contentId) {
|
|
|
50
88
|
|
|
51
89
|
export async function contentStatusCompleted(contentId) {
|
|
52
90
|
await dataContext.update(
|
|
53
|
-
function (localContext) {
|
|
54
|
-
let hierarchy = fetchHierarchy(contentId);
|
|
91
|
+
async function (localContext) {
|
|
92
|
+
let hierarchy = await fetchHierarchy(contentId);
|
|
55
93
|
completeStatusInLocalContext(contentId, localContext, hierarchy);
|
|
56
94
|
},
|
|
57
95
|
async function () {
|
|
@@ -60,9 +98,10 @@ export async function contentStatusCompleted(contentId) {
|
|
|
60
98
|
}
|
|
61
99
|
|
|
62
100
|
function completeStatusInLocalContext(contentId, localContext, hierarchy) {
|
|
63
|
-
let data = localContext.data[contentId] ??
|
|
101
|
+
let data = localContext.data[contentId] ?? {};
|
|
64
102
|
data[DATA_KEY_STATUS] = STATE_COMPLETED;
|
|
65
103
|
data[DATA_KEY_PROGRESS] = 100;
|
|
104
|
+
data[DATA_KEY_LAST_UPDATED_TIME] = Math.round(new Date().getTime() / 1000);
|
|
66
105
|
localContext.data[contentId] = data;
|
|
67
106
|
|
|
68
107
|
let children = hierarchy.children[contentId] ?? [];
|
|
@@ -105,7 +144,7 @@ export async function recordWatchSession(contentId, mediaType, mediaCategory, me
|
|
|
105
144
|
await dataContext.update(
|
|
106
145
|
async function (localContext) {
|
|
107
146
|
if (contentId && updateLocalProgress) {
|
|
108
|
-
let data = localContext.data[contentId] ??
|
|
147
|
+
let data = localContext.data[contentId] ?? {};
|
|
109
148
|
let progress = data?.[DATA_KEY_PROGRESS] ?? 0;
|
|
110
149
|
let status = data?.[DATA_KEY_STATUS] ?? 0;
|
|
111
150
|
|
|
@@ -117,6 +156,7 @@ export async function recordWatchSession(contentId, mediaType, mediaCategory, me
|
|
|
117
156
|
data[DATA_KEY_PROGRESS] = progress;
|
|
118
157
|
data[DATA_KEY_STATUS] = status;
|
|
119
158
|
data[DATA_KEY_RESUME_TIME] = currentSeconds;
|
|
159
|
+
data[DATA_KEY_LAST_UPDATED_TIME] = Math.round(new Date().getTime() / 1000);
|
|
120
160
|
localContext.data[contentId] = data;
|
|
121
161
|
|
|
122
162
|
let hierarchy = await fetchHierarchy(contentId);
|
|
@@ -146,7 +186,7 @@ function getMediaTypeId(mediaType, mediaCategory) {
|
|
|
146
186
|
}
|
|
147
187
|
|
|
148
188
|
function uuidv4() {
|
|
149
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
189
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
150
190
|
var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
151
191
|
return v.toString(16);
|
|
152
192
|
});
|
|
@@ -155,7 +195,7 @@ function uuidv4() {
|
|
|
155
195
|
function bubbleProgress(hierarchy, contentId, localContext) {
|
|
156
196
|
let parentId = hierarchy.parents[contentId];
|
|
157
197
|
if (!parentId) return;
|
|
158
|
-
let data = localContext.data[parentId] ??
|
|
198
|
+
let data = localContext.data[parentId] ?? {};
|
|
159
199
|
let progress = data[DATA_KEY_PROGRESS];
|
|
160
200
|
let status = data[DATA_KEY_STATUS];
|
|
161
201
|
if (status !== STATE_COMPLETED && progress !== 100) {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -2,9 +2,15 @@ import {
|
|
|
2
2
|
getProgressPercentage,
|
|
3
3
|
dataContext,
|
|
4
4
|
recordWatchSession,
|
|
5
|
-
getProgressPercentageByIds,
|
|
5
|
+
getProgressPercentageByIds,
|
|
6
|
+
getProgressState,
|
|
7
|
+
getProgressStateByIds,
|
|
8
|
+
getAllStarted,
|
|
9
|
+
getAllCompleted,
|
|
10
|
+
contentStatusCompleted
|
|
6
11
|
} from "../src/services/contentProgress";
|
|
7
12
|
import {initializeTestService} from "./initializeTests";
|
|
13
|
+
import {postContentCompleted} from "../src";
|
|
8
14
|
|
|
9
15
|
const railContentModule = require('../src/services/railcontent.js')
|
|
10
16
|
|
|
@@ -15,7 +21,7 @@ describe('contentProgressDataContext', function () {
|
|
|
15
21
|
beforeEach(() => {
|
|
16
22
|
initializeTestService();
|
|
17
23
|
mock = jest.spyOn(dataContext, 'fetchData');
|
|
18
|
-
var json = JSON.parse(`{"version":${testVersion},"data":{"234191":{"s":"started","p":6,"t":20},"233955":{"s":"started","p":1}}}`);
|
|
24
|
+
var json = JSON.parse(`{"version":${testVersion},"data":{"234191":{"s":"started","p":6,"t":20,"u":1731108082},"233955":{"s":"started","p":1,"u":1731108083},"259426":{"s":"completed","p":100,"u":1731108085}}}`);
|
|
19
25
|
mock.mockImplementation(() => json);
|
|
20
26
|
|
|
21
27
|
});
|
|
@@ -47,6 +53,43 @@ describe('contentProgressDataContext', function () {
|
|
|
47
53
|
expect(result[120402]).toBe("");
|
|
48
54
|
});
|
|
49
55
|
|
|
56
|
+
test('getAllStarted', async () => {
|
|
57
|
+
let result = await getAllStarted();
|
|
58
|
+
expect(result).toStrictEqual([233955, 234191]);
|
|
59
|
+
|
|
60
|
+
result = await getAllStarted(1);
|
|
61
|
+
expect(result).toStrictEqual([233955]);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// test('getAllStartedWithUpdate', async () => {
|
|
65
|
+
// let mock2 = jest.spyOn(railContentModule, 'postRecordWatchSession');
|
|
66
|
+
// let serverVersion = 2;
|
|
67
|
+
// mock2.mockImplementation(() => JSON.parse(`{"version": ${serverVersion}}`));
|
|
68
|
+
// let result = await getAllStarted();
|
|
69
|
+
// expect(result).toStrictEqual([233955, 234191]);
|
|
70
|
+
// await recordWatchSession(111111, "video", "vimeo", 100, 50, 50);
|
|
71
|
+
//
|
|
72
|
+
// let result2 = await getAllStarted();
|
|
73
|
+
// expect(result2).toStrictEqual([111111, 233955, 234191]);
|
|
74
|
+
// });
|
|
75
|
+
|
|
76
|
+
test('getAllCompleted', async () => {
|
|
77
|
+
let result = await getAllCompleted();
|
|
78
|
+
expect(result).toStrictEqual([259426]);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// test('getAllCompletedWithUpdate', async () => {
|
|
82
|
+
// let mock2 = jest.spyOn(railContentModule, 'postContentCompleted');
|
|
83
|
+
// let serverVersion = 2;
|
|
84
|
+
// mock2.mockImplementation(() => JSON.parse(`{"version": ${serverVersion}}`));
|
|
85
|
+
//
|
|
86
|
+
// let result = await getAllCompleted();
|
|
87
|
+
// expect(result).toStrictEqual([259426]);
|
|
88
|
+
// await contentStatusCompleted(111111);
|
|
89
|
+
// let result2 = await getAllCompleted();
|
|
90
|
+
// expect(result2).toStrictEqual([111111, 259426]);
|
|
91
|
+
// });
|
|
92
|
+
|
|
50
93
|
test('progressBubbling', async () => {
|
|
51
94
|
let mock2 = jest.spyOn(railContentModule, 'postRecordWatchSession');
|
|
52
95
|
let serverVersion = 2;
|
package/test/initializeTests.js
CHANGED
|
File without changes
|
package/test/lastUpdated.test.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|