summaryrefslogtreecommitdiff
path: root/src/models/drive-folder.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/models/drive-folder.ts')
-rw-r--r--src/models/drive-folder.ts77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/models/drive-folder.ts b/src/models/drive-folder.ts
new file mode 100644
index 0000000000..ad27b151b1
--- /dev/null
+++ b/src/models/drive-folder.ts
@@ -0,0 +1,77 @@
+import * as mongo from 'mongodb';
+import deepcopy = require('deepcopy');
+import db from '../db/mongodb';
+import DriveFile from './drive-file';
+
+const DriveFolder = db.get<IDriveFolder>('drive_folders');
+export default DriveFolder;
+
+export type IDriveFolder = {
+ _id: mongo.ObjectID;
+ createdAt: Date;
+ name: string;
+ userId: mongo.ObjectID;
+ parentId: mongo.ObjectID;
+};
+
+export function isValidFolderName(name: string): boolean {
+ return (
+ (name.trim().length > 0) &&
+ (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({
+ parentId: _folder.id
+ });
+
+ const childFilesCount = await DriveFile.count({
+ 'metadata.folderId': _folder.id
+ });
+
+ _folder.foldersCount = childFoldersCount;
+ _folder.filesCount = childFilesCount;
+ }
+
+ if (opts.detail && _folder.parentId) {
+ // Populate parent folder
+ _folder.parent = await pack(_folder.parentId, {
+ detail: true
+ });
+ }
+
+ resolve(_folder);
+});