diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2018-02-04 15:02:14 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-04 15:02:14 +0900 |
| commit | 744c3e2ef8ef89355f72262b1e8c8f2fbb020f2a (patch) | |
| tree | de3630065fcddeb1916668ef3b0b43a219340e2e /src/api/models/drive-folder.ts | |
| parent | Update dependencies :rocket: (diff) | |
| parent | wip (diff) | |
| download | sharkey-744c3e2ef8ef89355f72262b1e8c8f2fbb020f2a.tar.gz sharkey-744c3e2ef8ef89355f72262b1e8c8f2fbb020f2a.tar.bz2 sharkey-744c3e2ef8ef89355f72262b1e8c8f2fbb020f2a.zip | |
Merge pull request #1097 from syuilo/refactor
Refactor
Diffstat (limited to 'src/api/models/drive-folder.ts')
| -rw-r--r-- | src/api/models/drive-folder.ts | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/src/api/models/drive-folder.ts b/src/api/models/drive-folder.ts index f81ffe855d..54b45049b9 100644 --- a/src/api/models/drive-folder.ts +++ b/src/api/models/drive-folder.ts @@ -1,6 +1,18 @@ +import * as mongo from 'mongodb'; +import deepcopy = require('deepcopy'); import db from '../../db/mongodb'; +import DriveFile from './drive-file'; -export default db.get('drive_folders') as any; // fuck type definition +const DriveFolder = db.get<IDriveFolder>('drive_folders'); +export default DriveFolder; + +export type IDriveFolder = { + _id: mongo.ObjectID; + created_at: Date; + name: string; + user_id: mongo.ObjectID; + parent_id: mongo.ObjectID; +}; export function isValidFolderName(name: string): boolean { return ( @@ -8,3 +20,58 @@ export function isValidFolderName(name: string): boolean { (name.length <= 200) ); } + +/** + * Pack a drive folder for API response + * + * @param {any} folder + * @param {any} options? + * @return {Promise<any>} + */ +export const pack = ( + folder: any, + options?: { + detail: boolean + } +) => new Promise<any>(async (resolve, reject) => { + const opts = Object.assign({ + detail: false + }, options); + + let _folder: any; + + // Populate the folder if 'folder' is ID + if (mongo.ObjectID.prototype.isPrototypeOf(folder)) { + _folder = await DriveFolder.findOne({ _id: folder }); + } else if (typeof folder === 'string') { + _folder = await DriveFolder.findOne({ _id: new mongo.ObjectID(folder) }); + } else { + _folder = deepcopy(folder); + } + + // Rename _id to id + _folder.id = _folder._id; + delete _folder._id; + + if (opts.detail) { + const childFoldersCount = await DriveFolder.count({ + parent_id: _folder.id + }); + + const childFilesCount = await DriveFile.count({ + 'metadata.folder_id': _folder.id + }); + + _folder.folders_count = childFoldersCount; + _folder.files_count = childFilesCount; + } + + if (opts.detail && _folder.parent_id) { + // Populate parent folder + _folder.parent = await pack(_folder.parent_id, { + detail: true + }); + } + + resolve(_folder); +}); |