Explorar o código

Find bookmarks not folders

https://youtrack.weseek.co.jp/issue/GW-7920
- Create method to get bookmarks in bookmark folder
- Create method to get all bookmarks recursively
- Filter users bookmarks that not folders
Mudana-Grune %!s(int64=3) %!d(string=hai) anos
pai
achega
e527343695
Modificáronse 1 ficheiros con 33 adicións e 0 borrados
  1. 33 0
      packages/app/src/server/models/bookmark-folder.ts

+ 33 - 0
packages/app/src/server/models/bookmark-folder.ts

@@ -1,3 +1,5 @@
+import { useId } from 'react';
+
 import { isValidObjectId } from '@growi/core/src/utils/objectid-utils';
 import monggoose, {
   Types, Document, Model, Schema,
@@ -32,6 +34,8 @@ export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
   deleteFolderAndChildren(bookmarkFolderId: Types.ObjectId | string): Promise<{deletedCount: number}>
   updateBookmarkFolder(bookmarkFolderId: string, name: string, parent: string): Promise<BookmarkFolderDocument>
   insertOrUpdateBookmarkedPage(pageId: IPageHasId, userId: Types.ObjectId | string, folderId: string): Promise<BookmarkFolderDocument>
+  findBookmarksNotInFolders(folder: BookmarkFolderDocument): Promise<Types.ObjectId[]>
+  findAllBookmarksNotInFolders(userId: Types.ObjectId| string): Promise<Types.ObjectId[]>
 }
 
 const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
@@ -164,4 +168,33 @@ Promise<BookmarkFolderDocument> {
   return bookmarkFolder;
 };
 
+bookmarkFolderSchema.statics.findBookmarksNotInFolders = async function(folder: BookmarkFolderDocument): Promise<Types.ObjectId[]> {
+  const bookmarkIds = (folder.bookmarks || []).map(bookmark => bookmark._id);
+  const bookmarks = await Bookmark.find({ _id: { $nin: bookmarkIds } });
+  return bookmarks.map(bookmark => bookmark._id);
+};
+
+bookmarkFolderSchema.statics.findAllBookmarksNotInFolders = async function(userId: Types.ObjectId | string): Promise<Types.ObjectId[]> {
+  const folders = await this.find({ owner: userId }).populate('bookmarks');
+  const bookmarks: Types.ObjectId[] = [];
+  await Promise.all(folders.map(async(folder) => {
+    const bookmarks = await this.findBookmarksNotInFolders(folder);
+    if (bookmarks.length > 0) {
+      bookmarks.push(...bookmarks);
+    }
+    const childFolders = await this.find({ parent: folder }).populate('bookmarks');
+    if (childFolders.length > 0) {
+      const childResult = await this.findAllBookmarksNotInFolders(userId);
+      if (childResult.length > 0) {
+        bookmarks.push(...childResult);
+      }
+    }
+  }));
+
+  const usersBookmarks = await Bookmark.find({ user: userId });
+  // TODO : Filter bookmarks not in folders
+
+  return bookmarks;
+};
+
 export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);