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

Add update bookmark folder api

https://youtrack.weseek.co.jp/issue/GW-7833
- Update parent type
- Add updateBookmarkFolder statics in BookmarkFolder schema
- Update create bookmark folder method
- Update findChildFolderById method
- Update create bookmark params
- Change get children list route to get
- Add update bookmark folder route
- Add try catch block to all bookmark folder route
Mudana-Grune 3 лет назад
Родитель
Сommit
93a5a7a603

+ 22 - 6
packages/app/src/server/models/bookmark-folder.ts

@@ -12,13 +12,13 @@ const logger = loggerFactory('growi:models:bookmark-folder');
 export type IBookmarkFolderDocument = {
   name: string
   owner: Ref<IUser>
-  parent?: Ref<IBookmarkFolderDocument>
+  parent?: string
 }
 export interface BookmarkFolderDocument extends Document {
   _id: Types.ObjectId
   name: string
   owner: Types.ObjectId
-  parent?: BookmarkFolderDocument
+  parent?: Types.ObjectId | null
 }
 
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
@@ -26,6 +26,7 @@ export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
   findParentFolderByUserId(user: Types.ObjectId | string): IBookmarkFolderDocument[]
   findChildFolderById(parentBookmarkFolder: Types.ObjectId | string): Promise<IBookmarkFolderDocument[]>
   deleteFolderAndChildren(bookmarkFolderId: string): void
+  updateBookmarkFolder(bookmarkFolderId: string, name: string, parent: string): BookmarkFolderDocument | null
 }
 
 const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
@@ -36,18 +37,21 @@ const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderMo
 
 
 bookmarkFolderSchema.statics.createByParameters = async function(params: IBookmarkFolderDocument): Promise<BookmarkFolderDocument> {
-  const bookmarkFolder = await this.create(params) as unknown as BookmarkFolderDocument;
+  const { name, owner, parent } = params;
+  const parentFolder = await this.findById(parent);
+
+  const bookmarkFolder = await this.create({ name, owner, parent: parentFolder?._id || null }) as unknown as BookmarkFolderDocument;
   return bookmarkFolder;
 };
 
 bookmarkFolderSchema.statics.findParentFolderByUserId = async function(userId: Types.ObjectId | string): Promise<BookmarkFolderDocument[]> {
-  const bookmarks = this.find({ owner: userId }, { parent: null }) as unknown as BookmarkFolderDocument[];
+  const bookmarks = this.find({ owner: userId, parent: null }) as unknown as BookmarkFolderDocument[];
   return bookmarks;
 };
 
 bookmarkFolderSchema.statics.findChildFolderById = async function(parentFolderId: Types.ObjectId | string): Promise<BookmarkFolderDocument[]> {
-  const parentFolder = this.findById(parentFolderId) as unknown as BookmarkFolderDocument;
-  const childFolders = this.find({ parent: parentFolder.id });
+  const parentFolder = await this.findById(parentFolderId) as unknown as BookmarkFolderDocument;
+  const childFolders = await this.find({ parent: parentFolder._id });
   return childFolders;
 };
 
@@ -57,4 +61,16 @@ bookmarkFolderSchema.statics.deleteFolderAndChildren = async function(boookmarkF
   await this.deleteMany({ parent: bookmarkFolder?.id });
 };
 
+bookmarkFolderSchema.statics.updateBookmarkFolder = async function(bookmarkFolderId: string, name: string, parent: string):
+ Promise<BookmarkFolderDocument | null> {
+
+  const parentFolder = await this.findById(parent);
+  const updateFields = {
+    name, parent: parentFolder?._id || null,
+  };
+  const bookmarkFolder = await this.findByIdAndUpdate(bookmarkFolderId, { $set: updateFields }, { new: true });
+  return bookmarkFolder;
+
+};
+
 export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);

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

@@ -13,7 +13,6 @@ const router = express.Router();
 
 const validator = {
   bookmarkFolder: [
-    param('parentId').isString().withMessage('parentId is required'),
     body('name').isString().withMessage('name must be a string'),
     body('parent').optional({ nullable: true }),
   ],
@@ -27,14 +26,12 @@ module.exports = (crowi) => {
   router.post('/', accessTokenParser, loginRequiredStrictly, validator.bookmarkFolder, apiV3FormValidator, async(req, res) => {
     const owner = req.user?._id;
     const { name, parent } = req.body;
-    const data = {
-      name,
-      owner,
-      parent,
+    const params = {
+      name, owner, parent,
     };
 
     try {
-      const bookmarkFolder = await BookmarkFolder.createByParameters(data);
+      const bookmarkFolder = BookmarkFolder.createByParameters(params);
       logger.debug('bookmark folder created', bookmarkFolder);
       return res.apiv3({ bookmarkFolder });
     }
@@ -46,14 +43,24 @@ module.exports = (crowi) => {
 
   // List all main bookmark folders
   router.get('/list', accessTokenParser, loginRequiredStrictly, async(req, res) => {
-    const bookmarkFolders = await BookmarkFolder.findParentFolderByUserId(req.user?._id);
-    return res.apiv3({ bookmarkFolders });
+    try {
+      const bookmarkFolders = await BookmarkFolder.findParentFolderByUserId(req.user?._id);
+      return res.apiv3({ bookmarkFolders });
+    }
+    catch (err) {
+      return res.apiv3Err(err, 500);
+    }
   });
 
-  router.post('/list-child/', accessTokenParser, loginRequiredStrictly, async(req, res) => {
-    const { parentId } = req.body;
-    const bookmarkFolders = await BookmarkFolder.findChildFolderById(parentId);
-    return res.apiv3({ bookmarkFolders });
+  router.get('/list-child/:parentId', accessTokenParser, loginRequiredStrictly, async(req, res) => {
+    const { parentId } = req.params;
+    try {
+      const bookmarkFolders = await BookmarkFolder.findChildFolderById(parentId);
+      return res.apiv3({ bookmarkFolders });
+    }
+    catch (err) {
+      return res.apiv3Err(err, 500);
+    }
   });
 
   // Delete bookmark folder and children
@@ -68,5 +75,16 @@ module.exports = (crowi) => {
       return res.apiv3Err(err, 500);
     }
   });
+
+  router.put('/', accessTokenParser, loginRequiredStrictly, validator.bookmarkFolder, async(req, res) => {
+    const { bookmarkFolderId, name, parent } = req.body;
+    try {
+      const bookmarkFolder = await BookmarkFolder.updateBookmarkFolder(bookmarkFolderId, name, parent);
+      return res.apiv3({ bookmarkFolder });
+    }
+    catch (err) {
+      return res.apiv3Err(err, 500);
+    }
+  });
   return router;
 };