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

Merge branch 'feat/gw7833-create-bookmarkfolder-model-and-api' into feat/gw7895-create-new-folder-from-sidebar-bookamarks

Mudana-Grune 3 лет назад
Родитель
Сommit
f141110998

+ 6 - 0
packages/app/src/interfaces/bookmark-info.ts

@@ -17,3 +17,9 @@ type BookmarkedPage = {
 }
 }
 
 
 export type MyBookmarkList = BookmarkedPage[]
 export type MyBookmarkList = BookmarkedPage[]
+
+export interface IBookmarkFolder {
+  name: string
+  owner: Ref<IUser>
+  parent?: Ref<this>
+}

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

@@ -1,38 +1,29 @@
-import { Ref, IUser, HasObjectId } from '@growi/core';
 import { isValidObjectId } from '@growi/core/src/utils/objectid-utils';
 import { isValidObjectId } from '@growi/core/src/utils/objectid-utils';
-import ExtensibleCustomError from 'extensible-custom-error';
 import {
 import {
   Types, Document, Model, Schema,
   Types, Document, Model, Schema,
 } from 'mongoose';
 } from 'mongoose';
 
 
+import { IBookmarkFolder } from '~/interfaces/bookmark-info';
+
 
 
 import loggerFactory from '../../utils/logger';
 import loggerFactory from '../../utils/logger';
 import { getOrCreateModel } from '../util/mongoose-utils';
 import { getOrCreateModel } from '../util/mongoose-utils';
 
 
+import { InvalidParentBookmarkFolderError } from './errors';
+
 const logger = loggerFactory('growi:models:bookmark-folder');
 const logger = loggerFactory('growi:models:bookmark-folder');
 
 
-export class InvalidParentBookmarkFolder extends ExtensibleCustomError {}
 
 
-export type BookmarkFolderItems = {
-  bookmarkFolder: IBookmarkFolderDocument & HasObjectId
-  children: BookmarkFolderItems[]
-}
-
-export type IBookmarkFolderDocument = {
-  name: string
-  owner: Ref<IUser>
-  parent?: string
-}
 export interface BookmarkFolderDocument extends Document {
 export interface BookmarkFolderDocument extends Document {
   _id: Types.ObjectId
   _id: Types.ObjectId
   name: string
   name: string
   owner: Types.ObjectId
   owner: Types.ObjectId
-  parent?: Types.ObjectId | null
+  parent?: [this]
 }
 }
 
 
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
 export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
-  createByParameters(params: IBookmarkFolderDocument): IBookmarkFolderDocument
-  findParentFolderByUserId(user: Types.ObjectId | string, parentId: Types.ObjectId | string | null): BookmarkFolderDocument[]
+  createByParameters(params: IBookmarkFolder): BookmarkFolderDocument
+  findParentFolderByUserId(user: Types.ObjectId | string): BookmarkFolderDocument[]
   findChildFolderById(parentBookmarkFolder: Types.ObjectId | string): Promise<BookmarkFolderDocument[]>
   findChildFolderById(parentBookmarkFolder: Types.ObjectId | string): Promise<BookmarkFolderDocument[]>
   deleteFolderAndChildren(bookmarkFolderId: string): {deletedCount: number}
   deleteFolderAndChildren(bookmarkFolderId: string): {deletedCount: number}
   updateBookmarkFolder(bookmarkFolderId: string, name: string, parent: string): BookmarkFolderDocument | null
   updateBookmarkFolder(bookmarkFolderId: string, name: string, parent: string): BookmarkFolderDocument | null
@@ -45,38 +36,38 @@ const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderMo
 });
 });
 
 
 
 
-bookmarkFolderSchema.statics.createByParameters = async function(params: IBookmarkFolderDocument): Promise<BookmarkFolderDocument> {
+bookmarkFolderSchema.statics.createByParameters = async function(params: IBookmarkFolder): Promise<BookmarkFolderDocument> {
   const { name, owner, parent } = params;
   const { name, owner, parent } = params;
   let bookmarkFolder;
   let bookmarkFolder;
 
 
-  if (parent === null) {
-    bookmarkFolder = await this.create({ name, owner, parent:  null }) as unknown as BookmarkFolderDocument;
+  if (parent == null) {
+    bookmarkFolder = await this.create({ name, owner }) as unknown as BookmarkFolderDocument;
   }
   }
   else {
   else {
     // Check if parent folder id is valid and parent folder exists
     // Check if parent folder id is valid and parent folder exists
-    const isParentFolderIdValid = isValidObjectId(parent);
-    const parentFolder = await this.findById(parent);
+    const isParentFolderIdValid = isValidObjectId(parent as string);
 
 
-    if (!isParentFolderIdValid || parentFolder == null) {
-      throw new InvalidParentBookmarkFolder("Parent folder id is invalid or parent folder doesn't exists");
+    if (!isParentFolderIdValid) {
+      throw new InvalidParentBookmarkFolderError('Parent folder id is invalid');
+    }
+    const parentFolder = await this.findById(parent);
+    if (parentFolder == null) {
+      throw new InvalidParentBookmarkFolderError('Parent folder not found');
     }
     }
-    bookmarkFolder = await this.create({ name, owner, parent:  parentFolder?._id }) as unknown as BookmarkFolderDocument;
+    bookmarkFolder = await this.create({ name, owner, parent:  parentFolder._id }) as unknown as BookmarkFolderDocument;
   }
   }
 
 
   return bookmarkFolder;
   return bookmarkFolder;
 };
 };
 
 
-bookmarkFolderSchema.statics.findParentFolderByUserId = async function(
-    userId: Types.ObjectId | string,
-    parentId: Types.ObjectId | string | null,
-): Promise<BookmarkFolderDocument[]> {
-  const bookmarks = this.find({ owner: userId, parent: parentId }) as unknown as BookmarkFolderDocument[];
+bookmarkFolderSchema.statics.findParentFolderByUserId = async function(userId: Types.ObjectId | string): Promise<BookmarkFolderDocument[]> {
+  const bookmarks = this.find({ owner: userId, parent: { $exists: false } }) as unknown as BookmarkFolderDocument[];
   return bookmarks;
   return bookmarks;
 };
 };
 
 
 bookmarkFolderSchema.statics.findChildFolderById = async function(parentFolderId: Types.ObjectId | string): Promise<BookmarkFolderDocument[]> {
 bookmarkFolderSchema.statics.findChildFolderById = async function(parentFolderId: Types.ObjectId | string): Promise<BookmarkFolderDocument[]> {
   const parentFolder = await this.findById(parentFolderId) as unknown as BookmarkFolderDocument;
   const parentFolder = await this.findById(parentFolderId) as unknown as BookmarkFolderDocument;
-  const childFolders = await this.find({ parent: parentFolder._id });
+  const childFolders = await this.find({ parent: parentFolder });
   return childFolders;
   return childFolders;
 };
 };
 
 

+ 3 - 0
packages/app/src/server/models/errors.ts

@@ -16,3 +16,6 @@ export class PathAlreadyExistsError extends ExtensibleCustomError {
 * User Authentication
 * User Authentication
 */
 */
 export class NullUsernameToBeRegisteredError extends ExtensibleCustomError {}
 export class NullUsernameToBeRegisteredError extends ExtensibleCustomError {}
+
+// Invalid Parent bookmark folder error
+export class InvalidParentBookmarkFolderError extends ExtensibleCustomError {}

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

@@ -2,9 +2,10 @@ import { ErrorV3 } from '@growi/core';
 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 { InvalidParentBookmarkFolderError } from '~/server/models/errors';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
-import BookmarkFolder, { InvalidParentBookmarkFolder } from '../../models/bookmark-folder';
+import BookmarkFolder from '../../models/bookmark-folder';
 
 
 const logger = loggerFactory('growi:routes:apiv3:bookmark-folder');
 const logger = loggerFactory('growi:routes:apiv3:bookmark-folder');
 
 
@@ -37,7 +38,7 @@ module.exports = (crowi) => {
       return res.apiv3({ bookmarkFolder });
       return res.apiv3({ bookmarkFolder });
     }
     }
     catch (err) {
     catch (err) {
-      if (err instanceof InvalidParentBookmarkFolder) {
+      if (err instanceof InvalidParentBookmarkFolderError) {
         return res.apiv3Err(new ErrorV3(err.message, 'failed_to_create_bookmark_folder'));
         return res.apiv3Err(new ErrorV3(err.message, 'failed_to_create_bookmark_folder'));
       }
       }
       return res.apiv3Err(err, 500);
       return res.apiv3Err(err, 500);