@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.
@@ -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', 'BOOKMARKS_UPDATE', 'BOOKMARK_REMOVE'];
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
- findByUserId: async (userId) => Bookmarks.find({ userId }).toArray(),
16
- findByUserIdAndProductId: async ({ userId, productId }) => Bookmarks.findOne({ userId, productId }),
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
- find: async (query) => Bookmarks.find(query).toArray(),
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 result = await Bookmarks.updateMany({ userId: fromUserId }, {
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":"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"}
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.find({ userId: fromUser._id });
5
+ const fromBookmarks = await modules.bookmarks.findBookmarks({ userId: fromUser._id });
3
6
  if (!fromBookmarks) {
4
7
  // No bookmarks no copy needed
5
- return null;
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,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,aAAa,EAAE;QAClB,8BAA8B;QAC9B,OAAO,IAAI,CAAC;KACb;IACD,IAAI,CAAC,WAAW,EAAE;QAChB,MAAM,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KACpD;IACD,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhE,OAAO,IAAI,CAAC;AACd,CAAC,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.2.3",
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.2.3",
35
- "@unchainedshop/utils": "^2.2.3",
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.16",
40
- "@unchainedshop/types": "^2.2.3",
41
- "jest": "^29.5.0",
42
- "ts-jest": "^29.1.0",
43
- "typescript": "^4.9.5"
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', 'BOOKMARKS_UPDATE', 'BOOKMARK_REMOVE'];
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
- findByUserId: async (userId) => Bookmarks.find({ userId }).toArray(),
25
- findByUserIdAndProductId: async ({ userId, productId }) => Bookmarks.findOne({ userId, productId }),
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
- find: async (query) => Bookmarks.find(query).toArray(),
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 result = await Bookmarks.updateMany(
49
- { userId: fromUserId },
50
- {
51
- $set: {
52
- userId: toUserId,
53
- updated: new Date(),
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.find({ userId: fromUser._id });
11
+ const fromBookmarks = await modules.bookmarks.findBookmarks({ userId: fromUser._id });
8
12
  if (!fromBookmarks) {
9
13
  // No bookmarks no copy needed
10
- return null;
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
  };