Przeglądaj źródła

Improve query and rename method

https://youtrack.weseek.co.jp/issue/GW-7833
- Rename findParentFolderByUserId to findFolderAndChildren
- Add new interface of BookmarkFolderItems
- Add virtual method to get children folder
- Update findFolderAndChildren method
Mudana-Grune 3 lat temu
rodzic
commit
f7a1c08871

+ 19 - 4
packages/app/src/server/models/bookmark-folder.ts

@@ -13,7 +13,11 @@ import { InvalidParentBookmarkFolderError } from './errors';
 
 const logger = loggerFactory('growi:models:bookmark-folder');
 
-
+export interface BookmarkFolderItems {
+  _id: string
+  name: string
+  children: this[]
+}
 export interface BookmarkFolderDocument extends Document {
   _id: Types.ObjectId
   name: string
@@ -23,7 +27,7 @@ export interface BookmarkFolderDocument extends Document {
 
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
   createByParameters(params: IBookmarkFolder): BookmarkFolderDocument
-  findParentFolderByUserId(user: Types.ObjectId | string): BookmarkFolderDocument[]
+  findFolderAndChildren(user: Types.ObjectId | string, parentId?: Types.ObjectId | string): BookmarkFolderItems[]
   findChildFolderById(parentBookmarkFolder: Types.ObjectId | string): Promise<BookmarkFolderDocument[]>
   deleteFolderAndChildren(bookmarkFolderId: string): {deletedCount: number}
   updateBookmarkFolder(bookmarkFolderId: string, name: string, parent: string): BookmarkFolderDocument | null
@@ -35,6 +39,11 @@ const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderMo
   parent: { type: Schema.Types.ObjectId, ref: 'BookmarkFolder', required: false },
 });
 
+bookmarkFolderSchema.virtual('children', {
+  ref: 'BookmarkFolder',
+  localField: '_id',
+  foreignField: 'parent',
+});
 
 bookmarkFolderSchema.statics.createByParameters = async function(params: IBookmarkFolder): Promise<BookmarkFolderDocument> {
   const { name, owner, parent } = params;
@@ -60,8 +69,12 @@ bookmarkFolderSchema.statics.createByParameters = async function(params: IBookma
   return bookmarkFolder;
 };
 
-bookmarkFolderSchema.statics.findParentFolderByUserId = async function(userId: Types.ObjectId | string): Promise<BookmarkFolderDocument[]> {
-  const bookmarks = this.find({ owner: userId, parent: { $exists: false } }) as unknown as BookmarkFolderDocument[];
+bookmarkFolderSchema.statics.findFolderAndChildren = async function(
+    userId: Types.ObjectId | string,
+    parentId?: Types.ObjectId | string,
+): Promise<BookmarkFolderItems[]> {
+  const parentFolder = await this.findById(parentId) as unknown as BookmarkFolderDocument;
+  const bookmarks = await this.find({ owner: userId, parent: parentFolder }).populate({ path: 'children' }).exec() as unknown as BookmarkFolderItems[];
   return bookmarks;
 };
 
@@ -94,4 +107,6 @@ bookmarkFolderSchema.statics.updateBookmarkFolder = async function(bookmarkFolde
 
 };
 
+bookmarkFolderSchema.set('toObject', { virtuals: true });
+
 export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);

+ 1 - 1
packages/app/src/server/routes/apiv3/bookmark-folder.ts

@@ -48,7 +48,7 @@ module.exports = (crowi) => {
   // List all main bookmark folders
   router.get('/list', accessTokenParser, loginRequiredStrictly, async(req, res) => {
     try {
-      const bookmarkFolders = await BookmarkFolder.findParentFolderByUserId(req.user?._id);
+      const bookmarkFolders = await BookmarkFolder.findFolderAndChildren(req.user?._id);
       return res.apiv3({ bookmarkFolders });
     }
     catch (err) {