@unchainedshop/core-bookmarks 2.2.3 → 2.3.1
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/lib/module/configureBookmarksModule.js +10 -20
- package/lib/module/configureBookmarksModule.js.map +1 -1
- package/lib/service/migrateBookmarksService.js +17 -4
- package/lib/service/migrateBookmarksService.js.map +1 -1
- package/package.json +8 -8
- package/src/module/configureBookmarksModule.ts +15 -28
- package/src/service/migrateBookmarksService.ts +17 -5
|
@@ -2,7 +2,7 @@ import { emit, registerEvents } from '@unchainedshop/events';
|
|
|
2
2
|
import { generateDbFilterById, generateDbMutations } from '@unchainedshop/utils';
|
|
3
3
|
import { BookmarksCollection } from '../db/BookmarksCollection.js';
|
|
4
4
|
import { BookmarkSchema } from '../db/BookmarksSchema.js';
|
|
5
|
-
const BOOKMARK_EVENTS = ['BOOKMARK_CREATE', '
|
|
5
|
+
const BOOKMARK_EVENTS = ['BOOKMARK_CREATE', 'BOOKMARK_UPDATE', 'BOOKMARK_REMOVE'];
|
|
6
6
|
export const configureBookmarksModule = async ({ db, }) => {
|
|
7
7
|
registerEvents(BOOKMARK_EVENTS);
|
|
8
8
|
const Bookmarks = await BookmarksCollection(db);
|
|
@@ -12,29 +12,19 @@ export const configureBookmarksModule = async ({ db, }) => {
|
|
|
12
12
|
return {
|
|
13
13
|
// Queries
|
|
14
14
|
...mutations,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
findById: async (bookmarkId) => {
|
|
15
|
+
findBookmarksByUserId: async (userId) => Bookmarks.find({ userId }).toArray(),
|
|
16
|
+
findBookmarkById: async (bookmarkId) => {
|
|
18
17
|
const filter = generateDbFilterById(bookmarkId);
|
|
19
18
|
return Bookmarks.findOne(filter, {});
|
|
20
19
|
},
|
|
21
|
-
|
|
22
|
-
existsByUserIdAndProductId: async ({ productId, userId }) => {
|
|
23
|
-
let selector = {};
|
|
24
|
-
if (productId && userId) {
|
|
25
|
-
selector = { userId, productId };
|
|
26
|
-
}
|
|
27
|
-
else if (userId) {
|
|
28
|
-
selector = { userId };
|
|
29
|
-
}
|
|
30
|
-
const bookmarkCount = await Bookmarks.countDocuments(selector, {
|
|
31
|
-
limit: 1,
|
|
32
|
-
});
|
|
33
|
-
return !!bookmarkCount;
|
|
34
|
-
},
|
|
20
|
+
findBookmarks: async (query) => Bookmarks.find(query).toArray(),
|
|
35
21
|
// Mutations
|
|
36
|
-
replaceUserId: async (fromUserId, toUserId) => {
|
|
37
|
-
const
|
|
22
|
+
replaceUserId: async (fromUserId, toUserId, bookmarkIds) => {
|
|
23
|
+
const selector = { userId: fromUserId };
|
|
24
|
+
if (bookmarkIds) {
|
|
25
|
+
selector._id = { $in: bookmarkIds };
|
|
26
|
+
}
|
|
27
|
+
const result = await Bookmarks.updateMany(selector, {
|
|
38
28
|
$set: {
|
|
39
29
|
userId: toUserId,
|
|
40
30
|
updated: new Date(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configureBookmarksModule.js","sourceRoot":"","sources":["../../src/module/configureBookmarksModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"configureBookmarksModule.js","sourceRoot":"","sources":["../../src/module/configureBookmarksModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,26 @@
|
|
|
1
|
+
const hashBookmark = (bookmark) => {
|
|
2
|
+
return `${bookmark.productId}:${bookmark.userId}:${JSON.stringify(bookmark.meta || {})}`;
|
|
3
|
+
};
|
|
1
4
|
export const migrateBookmarksService = async ({ fromUser, toUser, shouldMerge }, { modules }) => {
|
|
2
|
-
const fromBookmarks = await modules.bookmarks.
|
|
5
|
+
const fromBookmarks = await modules.bookmarks.findBookmarks({ userId: fromUser._id });
|
|
3
6
|
if (!fromBookmarks) {
|
|
4
7
|
// No bookmarks no copy needed
|
|
5
|
-
return
|
|
8
|
+
return;
|
|
6
9
|
}
|
|
7
10
|
if (!shouldMerge) {
|
|
8
11
|
await modules.bookmarks.deleteByUserId(toUser._id);
|
|
12
|
+
await modules.bookmarks.replaceUserId(fromUser._id, toUser._id);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
const toBookmarks = await modules.bookmarks.findBookmarks({ userId: toUser._id });
|
|
16
|
+
const toBookmarkHashes = toBookmarks.map(hashBookmark);
|
|
17
|
+
const newBookmarkIds = fromBookmarks
|
|
18
|
+
.filter((fromBookmark) => {
|
|
19
|
+
const hash = hashBookmark(fromBookmark);
|
|
20
|
+
return !toBookmarkHashes.includes(hash);
|
|
21
|
+
})
|
|
22
|
+
.map((bookmark) => bookmark._id);
|
|
23
|
+
await modules.bookmarks.replaceUserId(fromUser._id, toUser._id, newBookmarkIds);
|
|
9
24
|
}
|
|
10
|
-
await modules.bookmarks.replaceUserId(fromUser._id, toUser._id);
|
|
11
|
-
return null;
|
|
12
25
|
};
|
|
13
26
|
//# sourceMappingURL=migrateBookmarksService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrateBookmarksService.js","sourceRoot":"","sources":["../../src/service/migrateBookmarksService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAA4B,KAAK,EACnE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EACjC,EAAE,OAAO,EAAE,EACX,EAAE;IACF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"migrateBookmarksService.js","sourceRoot":"","sources":["../../src/service/migrateBookmarksService.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,EAAE;IAChC,OAAO,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAA4B,KAAK,EACnE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EACjC,EAAE,OAAO,EAAE,EACX,EAAE;IACF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC,aAAa,EAAE;QAClB,8BAA8B;QAC9B,OAAO;KACR;IACD,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;KACjE;SAAM;QACL,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAClF,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,aAAa;aACjC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YACxC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;KACjF;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/core-bookmarks",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"main": "lib/bookmarks-index.js",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./lib/bookmarks-index.js",
|
|
@@ -31,15 +31,15 @@
|
|
|
31
31
|
},
|
|
32
32
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@unchainedshop/events": "^2.
|
|
35
|
-
"@unchainedshop/utils": "^2.
|
|
34
|
+
"@unchainedshop/events": "^2.3.1",
|
|
35
|
+
"@unchainedshop/utils": "^2.3.1",
|
|
36
36
|
"simpl-schema": "=3.2.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@types/node": "^18.16.
|
|
40
|
-
"@unchainedshop/types": "^2.
|
|
41
|
-
"jest": "^29.
|
|
42
|
-
"ts-jest": "^29.1.
|
|
43
|
-
"typescript": "^
|
|
39
|
+
"@types/node": "^18.16.19",
|
|
40
|
+
"@unchainedshop/types": "^2.3.1",
|
|
41
|
+
"jest": "^29.6.1",
|
|
42
|
+
"ts-jest": "^29.1.1",
|
|
43
|
+
"typescript": "^5.1.6"
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -2,10 +2,11 @@ import { emit, registerEvents } from '@unchainedshop/events';
|
|
|
2
2
|
import { Bookmark, BookmarksModule } from '@unchainedshop/types/bookmarks.js';
|
|
3
3
|
import { ModuleInput, ModuleMutations } from '@unchainedshop/types/core.js';
|
|
4
4
|
import { generateDbFilterById, generateDbMutations } from '@unchainedshop/utils';
|
|
5
|
+
import { Query } from '@unchainedshop/types/common.js';
|
|
5
6
|
import { BookmarksCollection } from '../db/BookmarksCollection.js';
|
|
6
7
|
import { BookmarkSchema } from '../db/BookmarksSchema.js';
|
|
7
8
|
|
|
8
|
-
const BOOKMARK_EVENTS: string[] = ['BOOKMARK_CREATE', '
|
|
9
|
+
const BOOKMARK_EVENTS: string[] = ['BOOKMARK_CREATE', 'BOOKMARK_UPDATE', 'BOOKMARK_REMOVE'];
|
|
9
10
|
|
|
10
11
|
export const configureBookmarksModule = async ({
|
|
11
12
|
db,
|
|
@@ -21,39 +22,25 @@ export const configureBookmarksModule = async ({
|
|
|
21
22
|
return {
|
|
22
23
|
// Queries
|
|
23
24
|
...mutations,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
findById: async (bookmarkId) => {
|
|
25
|
+
findBookmarksByUserId: async (userId) => Bookmarks.find({ userId }).toArray(),
|
|
26
|
+
findBookmarkById: async (bookmarkId) => {
|
|
27
27
|
const filter = generateDbFilterById(bookmarkId);
|
|
28
28
|
return Bookmarks.findOne(filter, {});
|
|
29
29
|
},
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
existsByUserIdAndProductId: async ({ productId, userId }) => {
|
|
33
|
-
let selector = {};
|
|
34
|
-
if (productId && userId) {
|
|
35
|
-
selector = { userId, productId };
|
|
36
|
-
} else if (userId) {
|
|
37
|
-
selector = { userId };
|
|
38
|
-
}
|
|
39
|
-
const bookmarkCount = await Bookmarks.countDocuments(selector, {
|
|
40
|
-
limit: 1,
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
return !!bookmarkCount;
|
|
44
|
-
},
|
|
30
|
+
findBookmarks: async (query) => Bookmarks.find(query).toArray(),
|
|
45
31
|
|
|
46
32
|
// Mutations
|
|
47
|
-
replaceUserId: async (fromUserId, toUserId) => {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
{
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
33
|
+
replaceUserId: async (fromUserId, toUserId, bookmarkIds) => {
|
|
34
|
+
const selector: Query = { userId: fromUserId };
|
|
35
|
+
if (bookmarkIds) {
|
|
36
|
+
selector._id = { $in: bookmarkIds };
|
|
37
|
+
}
|
|
38
|
+
const result = await Bookmarks.updateMany(selector, {
|
|
39
|
+
$set: {
|
|
40
|
+
userId: toUserId,
|
|
41
|
+
updated: new Date(),
|
|
55
42
|
},
|
|
56
|
-
);
|
|
43
|
+
});
|
|
57
44
|
return result.upsertedCount;
|
|
58
45
|
},
|
|
59
46
|
deleteByUserId: async (userId) => {
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
import { MigrateBookmarksService } from '@unchainedshop/types/bookmarks.js';
|
|
2
2
|
|
|
3
|
+
const hashBookmark = (bookmark) => {
|
|
4
|
+
return `${bookmark.productId}:${bookmark.userId}:${JSON.stringify(bookmark.meta || {})}`;
|
|
5
|
+
};
|
|
6
|
+
|
|
3
7
|
export const migrateBookmarksService: MigrateBookmarksService = async (
|
|
4
8
|
{ fromUser, toUser, shouldMerge },
|
|
5
9
|
{ modules },
|
|
6
10
|
) => {
|
|
7
|
-
const fromBookmarks = await modules.bookmarks.
|
|
11
|
+
const fromBookmarks = await modules.bookmarks.findBookmarks({ userId: fromUser._id });
|
|
8
12
|
if (!fromBookmarks) {
|
|
9
13
|
// No bookmarks no copy needed
|
|
10
|
-
return
|
|
14
|
+
return;
|
|
11
15
|
}
|
|
12
16
|
if (!shouldMerge) {
|
|
13
17
|
await modules.bookmarks.deleteByUserId(toUser._id);
|
|
18
|
+
await modules.bookmarks.replaceUserId(fromUser._id, toUser._id);
|
|
19
|
+
} else {
|
|
20
|
+
const toBookmarks = await modules.bookmarks.findBookmarks({ userId: toUser._id });
|
|
21
|
+
const toBookmarkHashes = toBookmarks.map(hashBookmark);
|
|
22
|
+
const newBookmarkIds = fromBookmarks
|
|
23
|
+
.filter((fromBookmark) => {
|
|
24
|
+
const hash = hashBookmark(fromBookmark);
|
|
25
|
+
return !toBookmarkHashes.includes(hash);
|
|
26
|
+
})
|
|
27
|
+
.map((bookmark) => bookmark._id);
|
|
28
|
+
await modules.bookmarks.replaceUserId(fromUser._id, toUser._id, newBookmarkIds);
|
|
14
29
|
}
|
|
15
|
-
await modules.bookmarks.replaceUserId(fromUser._id, toUser._id);
|
|
16
|
-
|
|
17
|
-
return null;
|
|
18
30
|
};
|