bookmark-folder.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Ref, IUser } from '@growi/core';
  2. import {
  3. Types, Document, Model, Schema,
  4. } from 'mongoose';
  5. import loggerFactory from '../../utils/logger';
  6. import { getOrCreateModel } from '../util/mongoose-utils';
  7. const logger = loggerFactory('growi:models:bookmark-folder');
  8. export type IBookmarkFolderDocument = {
  9. name: string
  10. owner: Ref<IUser>
  11. parent?: Ref<IBookmarkFolderDocument>
  12. }
  13. export interface BookmarkFolderDocument extends Document {
  14. _id: Types.ObjectId
  15. name: string
  16. owner: Types.ObjectId
  17. parent?: IBookmarkFolderDocument
  18. }
  19. export interface BookmarkFolderModel extends Model<BookmarkFolderDocument>{
  20. createByParameters(params: IBookmarkFolderDocument): IBookmarkFolderDocument
  21. findByUser(user: string): IBookmarkFolderDocument[]
  22. deleteFolderAndChildren(bookmarkFolderId: string): void
  23. }
  24. const bookmarkFolderSchema = new Schema<BookmarkFolderDocument, BookmarkFolderModel>({
  25. name: { type: String },
  26. owner: { type: Schema.Types.ObjectId, ref: 'User', index: true },
  27. parent: { type: Schema.Types.ObjectId, refPath: 'BookmarkFolder', required: false },
  28. });
  29. bookmarkFolderSchema.statics.createByParameters = async function(params: IBookmarkFolderDocument): Promise<IBookmarkFolderDocument> {
  30. const bookmarkFolder = await this.create(params) as unknown as IBookmarkFolderDocument;
  31. return bookmarkFolder;
  32. };
  33. bookmarkFolderSchema.statics.findByUser = async function(userId: string): Promise<BookmarkFolderDocument[]> {
  34. // TODO: Get all folder structure
  35. return this.find({ owner: userId });
  36. };
  37. bookmarkFolderSchema.statics.deleteFolderAndChildren = async function(boookmarkFolderId: string): Promise<void> {
  38. // Delete parent and all children folder
  39. const bookmarkFolder = await this.findByIdAndDelete(boookmarkFolderId);
  40. await this.deleteMany({ parent: bookmarkFolder?.id });
  41. };
  42. export default getOrCreateModel<BookmarkFolderDocument, BookmarkFolderModel>('BookmarkFolder', bookmarkFolderSchema);