2
0
Эх сурвалжийг харах

Create api list and delete bookmark folder

https://youtrack.weseek.co.jp/issue/GW-7833
- Add method to find all bookmark folder by user id
- Add method to delete bookmark folder and children
- Fix express validator rule for bookmark folder
- Update module import and requirement
- Update store bookmark folder route
- Add list and delete route
Mudana-Grune 3 жил өмнө
parent
commit
d6f9a592bf

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

@@ -23,6 +23,8 @@ export interface BookmarkFolderDocument extends Document {
 
 
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
   createByParameters(params: IBookmarkFolderDocument): IBookmarkFolderDocument
   createByParameters(params: IBookmarkFolderDocument): IBookmarkFolderDocument
+  findByUser(user: string): IBookmarkFolderDocument[]
+  deleteFolderAndChildren(bookmarkFolderId: string): void
 }
 }
 
 
 const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
 const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
@@ -37,5 +39,15 @@ bookmarkFolderSchema.statics.createByParameters = async function(params: IBookma
   return bookmarkFolder;
   return bookmarkFolder;
 };
 };
 
 
+bookmarkFolderSchema.statics.findByUser = async function(userId: string): Promise<BookmarkFolderDocument[]> {
+  // TODO: Get all folder structure
+  return this.find({ owner: userId });
+};
+
+bookmarkFolderSchema.statics.deleteFolderAndChildren = async function(boookmarkFolderId: string): Promise<void> {
+  // Delete parent and all children folder
+  const bookmarkFolder = await this.findByIdAndDelete(boookmarkFolderId);
+  await this.deleteMany({ parent: bookmarkFolder?.id });
+};
 
 
 export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);
 export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);

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

@@ -1,33 +1,35 @@
-import express, { Request } from 'express';
 import { body } from 'express-validator';
 import { body } from 'express-validator';
 
 
 import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
-import Crowi from '../../crowi';
 import BookmarkFolder from '../../models/bookmark-folder';
 import BookmarkFolder from '../../models/bookmark-folder';
 
 
-import { ApiV3Response } from './interfaces/apiv3-response';
-
 const logger = loggerFactory('growi:routes:apiv3:bookmark-folder');
 const logger = loggerFactory('growi:routes:apiv3:bookmark-folder');
 
 
+const express = require('express');
+
+const router = express.Router();
+
 const validator = {
 const validator = {
   bookmarkFolder: [
   bookmarkFolder: [
     body('name').isString().withMessage('name must be a string'),
     body('name').isString().withMessage('name must be a string'),
-    body('owner').isMongoId().withMessage('owner must be a mongo ID'),
-    body('parent').optional().isMongoId().withMessage('parent must be a mongo ID'),
+    body('parent').optional({ nullable: true }),
   ],
   ],
 };
 };
 
 
-module.exports = (crowi: Crowi) => {
-  const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
+module.exports = (crowi) => {
   const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
   const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
-  const router = express.Router();
-  router.post('/', accessTokenParser, loginRequiredStrictly, validator.bookmarkFolder, apiV3FormValidator, async(req: Request, res: ApiV3Response) => {
+  const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
+
+  // Create new bookmark folder
+  router.post('/', accessTokenParser, loginRequiredStrictly, validator.bookmarkFolder, apiV3FormValidator, async(req, res) => {
+    const owner = req.user?._id;
+    const { name, parent } = req.body;
     const data = {
     const data = {
-      name: req.body.name,
-      owner: req.body.owner,
-      parent: req.body.parent,
+      name,
+      owner,
+      parent,
     };
     };
 
 
     try {
     try {
@@ -41,5 +43,24 @@ module.exports = (crowi: Crowi) => {
     }
     }
   });
   });
 
 
+  // List all bookmark folders
+  router.get('/list', accessTokenParser, loginRequiredStrictly, async(req, res) => {
+    const bookmarkFolders = await BookmarkFolder.findByUser(req.user?._id);
+    return res.apiv3({ bookmarkFolders });
+  });
+
+
+  // Delete bookmark folder and children
+  router.delete('/', accessTokenParser, loginRequiredStrictly, async(req, res) => {
+    const { boookmarkFolderId } = req.body;
+    try {
+      await BookmarkFolder.deleteFolderAndChildren(boookmarkFolderId);
+      return res.apiv3();
+    }
+    catch (err) {
+      logger.error(err);
+      return res.apiv3Err(err, 500);
+    }
+  });
   return router;
   return router;
 };
 };