Просмотр исходного кода

Update schema and fix route error

https://youtrack.weseek.co.jp/issue/GW-7910
- Update Bookmark model definition
- Update bookmark types in BookmarkFolderDocument and bookmarkFolderSchema
- Populate bookmarks in findFolderAndChildren method
- Update parameter name and Type of insertOrUpdateBookmarkedPage
- Adjust parameter name in addBookmarkToFolder method
- Add validator for bookmarked page parameter
- Update return value of bookmark folder list route
Mudana-Grune 3 лет назад
Родитель
Сommit
56c8e94dfc

+ 1 - 1
packages/app/src/components/Bookmarks/BookmarkFolderMenu.tsx

@@ -51,7 +51,7 @@ const BookmarkFolderMenu = (props: Props): JSX.Element => {
 
   const addBookmarkToFolder = useCallback(async(folderId: string) => {
     try {
-      await apiv3Post('/bookmark-folder/add-boookmark-to-folder', { page: currentPage, folderId });
+      await apiv3Post('/bookmark-folder/add-boookmark-to-folder', { pageId: currentPage?._id, folderId });
       toastSuccess('Bookmark added to bookmark folder successfully');
     }
     catch (err) {

+ 14 - 12
packages/app/src/server/models/bookmark-folder.ts

@@ -1,9 +1,10 @@
 import { isValidObjectId } from '@growi/core/src/utils/objectid-utils';
-import {
-  Types, Document, Model, Schema, model,
+import monggoose, {
+  Types, Document, Model, Schema,
 } from 'mongoose';
 
-import { IBookmarkFolder, BookmarkFolderItems, MyBookmarkList } from '~/interfaces/bookmark-info';
+
+import { IBookmarkFolder, BookmarkFolderItems } from '~/interfaces/bookmark-info';
 import { IPageHasId } from '~/interfaces/page';
 
 import loggerFactory from '../../utils/logger';
@@ -13,16 +14,15 @@ import { InvalidParentBookmarkFolderError } from './errors';
 
 
 const logger = loggerFactory('growi:models:bookmark-folder');
-const Bookmark = require('./bookmark');
+const Bookmark = monggoose.model('Bookmark');
 
-const BookmarkSchema = model('Bookmark').schema;
 
 export interface BookmarkFolderDocument extends Document {
   _id: Types.ObjectId
   name: string
   owner: Types.ObjectId
   parent?: [this]
-  bookmarks: MyBookmarkList
+  bookmarks: [Types.ObjectId]
 }
 
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
@@ -31,14 +31,16 @@ export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
   findChildFolderById(parentBookmarkFolder: Types.ObjectId | string): Promise<BookmarkFolderDocument[]>
   deleteFolderAndChildren(bookmarkFolderId: Types.ObjectId | string): {deletedCount: number}
   updateBookmarkFolder(bookmarkFolderId: string, name: string, parent: string): BookmarkFolderDocument | null
-  insertOrUpdateBookmarkedPage(page: IPageHasId, userId: Types.ObjectId | string, folderId: string)
+  insertOrUpdateBookmarkedPage(pageId: IPageHasId, userId: Types.ObjectId | string, folderId: string)
 }
 
 const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
   name: { type: String },
   owner: { type: Schema.Types.ObjectId, ref: 'User', index: true },
   parent: { type: Schema.Types.ObjectId, ref: 'BookmarkFolder', required: false },
-  bookmarks: { type: [BookmarkSchema], default: [], required: false },
+  bookmarks: [{
+    type: Schema.Types.ObjectId, ref: 'Bookmark', default: [], required: false,
+  }],
 }, {
   toObject: { virtuals: true },
 });
@@ -80,7 +82,7 @@ bookmarkFolderSchema.statics.findFolderAndChildren = async function(
 
   const parentFolder = await this.findById(parentId) as unknown as BookmarkFolderDocument;
   const bookmarkFolders = await this.find({ owner: userId, parent: parentFolder })
-    .populate({ path: 'children' }).exec() as unknown as BookmarkFolderItems[];
+    .populate({ path: 'children' }).populate({ path: 'bookmarks' }).exec() as unknown as BookmarkFolderItems[];
   return bookmarkFolders;
 };
 
@@ -119,9 +121,9 @@ bookmarkFolderSchema.statics.updateBookmarkFolder = async function(bookmarkFolde
 
 };
 
-bookmarkFolderSchema.statics.insertOrUpdateBookmarkedPage = async function(page: IPageHasId, userId: Types.ObjectId | string, folderId: string):
-Promise<BookmarkFolderDocument> {
-  const bookmarkedPage = await Bookmark.findOneAndUpdate({ page: page._id, user: userId }, { new: true, upsert: true });
+bookmarkFolderSchema.statics.insertOrUpdateBookmarkedPage = async function(pageId: IPageHasId, userId: Types.ObjectId | string, folderId: string):
+Promise<BookmarkFolderDocument | null> {
+  const bookmarkedPage = await Bookmark.findOneAndUpdate({ page: pageId, user: userId }, { page: pageId, user: userId }, { new: true, upsert: true });
   const bookmarkFolder = await this.findByIdAndUpdate(folderId, { $addToSet: { bookmarks: bookmarkedPage } }, { new: true, upsert: true });
   return bookmarkFolder;
 };

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

@@ -18,6 +18,10 @@ const validator = {
     body('name').isString().withMessage('name must be a string'),
     body('parent').isMongoId().optional({ nullable: true }),
   ],
+  bookmarkPage: [
+    body('pageId').isMongoId().withMessage('Page ID must be a valid mongo ID'),
+    body('folderId').isMongoId().withMessage('Folder ID must be a valid mongo ID'),
+  ],
 };
 
 module.exports = (crowi) => {
@@ -51,11 +55,13 @@ module.exports = (crowi) => {
     const _parentId = parentId ?? null;
     try {
       const bookmarkFolders = await BookmarkFolder.findFolderAndChildren(req.user?._id, _parentId);
+      console.log(bookmarkFolders);
       const bookmarkFolderItems = bookmarkFolders.map(bookmarkFolder => ({
         _id: bookmarkFolder._id,
         name: bookmarkFolder.name,
         parent: bookmarkFolder.parent,
         children: bookmarkFolder.children,
+        bookmarkedPages: bookmarkFolder.bookmarks,
       }));
       return res.apiv3({ bookmarkFolderItems });
     }
@@ -89,12 +95,12 @@ module.exports = (crowi) => {
     }
   });
 
-  router.post('/add-boookmark-to-folder', accessTokenParser, loginRequiredStrictly, validator.bookmarkFolder, apiV3FormValidator, async(req, res) => {
+  router.post('/add-boookmark-to-folder', accessTokenParser, loginRequiredStrictly, validator.bookmarkPage, apiV3FormValidator, async(req, res) => {
     const userId = req.user?._id;
-    const { page, folderId } = req.body;
+    const { pageId, folderId } = req.body;
 
     try {
-      const bookmarkFolder = await BookmarkFolder.insertOrUpdateBookmarkedPage(page, userId, folderId);
+      const bookmarkFolder = await BookmarkFolder.insertOrUpdateBookmarkedPage(pageId, userId, folderId);
       logger.debug('bookmark added to folder created', bookmarkFolder);
       return res.apiv3({ bookmarkFolder });
     }