Browse Source

Create api for create bookmark folder

https://youtrack.weseek.co.jp/issue/GW-7833
- Update BookmarkFolderDocument
- Add new type of IBookmarkFolderDocument
- Update BookmarkFolderModel
- Update createByParameters statics function
- Create route new route file bookmark-folder
- Create store bookmark-folder method in bookmark-folder route
- Import bookmark-folder route to apiV3 route
Mudana-Grune 3 years ago
parent
commit
4e8ee1a2dc

+ 30 - 20
packages/app/src/server/models/bookmark-folder.ts

@@ -1,31 +1,41 @@
-import { Ref, IUser, IUserHasId } from '@growi/core';
+import { Ref, IUser } from '@growi/core';
+import {
+  Types, Document, Model, Schema,
+} from 'mongoose';
 
-import {  Model, Schema, Document } from 'mongoose';
+
+import loggerFactory from '../../utils/logger';
 import { getOrCreateModel } from '../util/mongoose-utils';
 
+const logger = loggerFactory('growi:models:bookmark-folder');
+
+export type IBookmarkFolderDocument = {
+  name: string
+  owner: Ref<IUser>
+  parent?: Ref<IBookmarkFolderDocument>
+}
 export interface BookmarkFolderDocument extends Document {
-  name : string,
-  owner: Ref<IUser>,
-  parent?: BookmarkFolderDocument
+  _id: Types.ObjectId
+  name: string
+  owner: Types.ObjectId
+  parent?: IBookmarkFolderDocument
 }
 
-export type BookmarkFolderModel = Model<BookmarkFolderDocument>
+export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
+  createByParameters(params: IBookmarkFolderDocument): IBookmarkFolderDocument
+}
 
 const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
-  name: {type: String},
-  owner: { type: Schema.Types.ObjectId, ref: 'User'},
-  parent: { type: Schema.Types.ObjectId, ref: 'BookmarkFolder', required: false}
+  name: { type: String },
+  owner: { type: Schema.Types.ObjectId, ref: 'User', index: true },
+  parent: { type: Schema.Types.ObjectId, refPath: 'BookmarkFolder', required: false },
 });
 
-bookmarkFolderSchema.statics.createBookmarkFolder = async function (name: string, user:IUserHasId, parent?: BookmarkFolderDocument ): Promise<BookmarkFolderDocument> {
-  const BookmarkFolder = this;
-  const bookmarkFolder = new BookmarkFolder();
-  bookmarkFolder.name = name;
-  bookmarkFolder.owner = user._id;
-  if(parent != null ){
-    bookmarkFolder.parent = parent._id;
-  }
-  return bookmarkFolder.save()
-}
 
-export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema)
+bookmarkFolderSchema.statics.createByParameters = async function(params: IBookmarkFolderDocument): Promise<IBookmarkFolderDocument> {
+  const bookmarkFolder = await this.create(params) as unknown as IBookmarkFolderDocument;
+  return bookmarkFolder;
+};
+
+
+export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);

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

@@ -0,0 +1,45 @@
+import express, { Request } from 'express';
+import { body } from 'express-validator';
+
+import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
+import loggerFactory from '~/utils/logger';
+
+import Crowi from '../../crowi';
+import BookmarkFolder from '../../models/bookmark-folder';
+
+import { ApiV3Response } from './interfaces/apiv3-response';
+
+const logger = loggerFactory('growi:routes:apiv3:bookmark-folder');
+
+const validator = {
+  bookmarkFolder: [
+    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'),
+  ],
+};
+
+module.exports = (crowi: Crowi) => {
+  const loginRequiredStrictly = require('../../middlewares/login-required')(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 data = {
+      name: req.body.name,
+      owner: req.body.owner,
+      parent: req.body.parent,
+    };
+
+    try {
+      const bookmarkFolder = await BookmarkFolder.createByParameters(data);
+      logger.debug('bookmark folder created', bookmarkFolder);
+      return res.apiv3({ bookmarkFolder });
+    }
+    catch (err) {
+      logger.error('create bookmark folder failed', err);
+      return res.apiv3Err(err, 500);
+    }
+  });
+
+  return router;
+};

+ 1 - 0
packages/app/src/server/routes/apiv3/index.js

@@ -101,6 +101,7 @@ module.exports = (crowi, app, isInstalled) => {
 
   router.use('/user-ui-settings', require('./user-ui-settings')(crowi));
 
+  router.use('/bookmark-folder', require('./bookmark-folder')(crowi));
 
   return [router, routerForAdmin, routerForAuth];
 };