summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/drive/files
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/drive/files')
-rw-r--r--src/server/api/endpoints/drive/files/create.ts51
-rw-r--r--src/server/api/endpoints/drive/files/find.ts34
-rw-r--r--src/server/api/endpoints/drive/files/show.ts36
-rw-r--r--src/server/api/endpoints/drive/files/update.ts75
-rw-r--r--src/server/api/endpoints/drive/files/upload_from_url.ts26
5 files changed, 222 insertions, 0 deletions
diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts
new file mode 100644
index 0000000000..db801b61fe
--- /dev/null
+++ b/src/server/api/endpoints/drive/files/create.ts
@@ -0,0 +1,51 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import { validateFileName, pack } from '../../../models/drive-file';
+import create from '../../../common/drive/add-file';
+
+/**
+ * Create a file
+ *
+ * @param {any} file
+ * @param {any} params
+ * @param {any} user
+ * @return {Promise<any>}
+ */
+module.exports = async (file, params, user): Promise<any> => {
+ if (file == null) {
+ throw 'file is required';
+ }
+
+ // Get 'name' parameter
+ let name = file.originalname;
+ if (name !== undefined && name !== null) {
+ name = name.trim();
+ if (name.length === 0) {
+ name = null;
+ } else if (name === 'blob') {
+ name = null;
+ } else if (!validateFileName(name)) {
+ throw 'invalid name';
+ }
+ } else {
+ name = null;
+ }
+
+ // Get 'folder_id' parameter
+ const [folderId = null, folderIdErr] = $(params.folder_id).optional.nullable.id().$;
+ if (folderIdErr) throw 'invalid folder_id param';
+
+ try {
+ // Create file
+ const driveFile = await create(user, file.path, name, null, folderId);
+
+ // Serialize
+ return pack(driveFile);
+ } catch (e) {
+ console.error(e);
+
+ throw e;
+ }
+};
diff --git a/src/server/api/endpoints/drive/files/find.ts b/src/server/api/endpoints/drive/files/find.ts
new file mode 100644
index 0000000000..e026afe936
--- /dev/null
+++ b/src/server/api/endpoints/drive/files/find.ts
@@ -0,0 +1,34 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import DriveFile, { pack } from '../../../models/drive-file';
+
+/**
+ * Find a file(s)
+ *
+ * @param {any} params
+ * @param {any} user
+ * @return {Promise<any>}
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+ // Get 'name' parameter
+ const [name, nameErr] = $(params.name).string().$;
+ if (nameErr) return rej('invalid name param');
+
+ // Get 'folder_id' parameter
+ const [folderId = null, folderIdErr] = $(params.folder_id).optional.nullable.id().$;
+ if (folderIdErr) return rej('invalid folder_id param');
+
+ // Issue query
+ const files = await DriveFile
+ .find({
+ filename: name,
+ 'metadata.user_id': user._id,
+ 'metadata.folder_id': folderId
+ });
+
+ // Serialize
+ res(await Promise.all(files.map(async file =>
+ await pack(file))));
+});
diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts
new file mode 100644
index 0000000000..21664f7ba4
--- /dev/null
+++ b/src/server/api/endpoints/drive/files/show.ts
@@ -0,0 +1,36 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import DriveFile, { pack } from '../../../models/drive-file';
+
+/**
+ * Show a file
+ *
+ * @param {any} params
+ * @param {any} user
+ * @return {Promise<any>}
+ */
+module.exports = async (params, user) => {
+ // Get 'file_id' parameter
+ const [fileId, fileIdErr] = $(params.file_id).id().$;
+ if (fileIdErr) throw 'invalid file_id param';
+
+ // Fetch file
+ const file = await DriveFile
+ .findOne({
+ _id: fileId,
+ 'metadata.user_id': user._id
+ });
+
+ if (file === null) {
+ throw 'file-not-found';
+ }
+
+ // Serialize
+ const _file = await pack(file, {
+ detail: true
+ });
+
+ return _file;
+};
diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts
new file mode 100644
index 0000000000..83da462113
--- /dev/null
+++ b/src/server/api/endpoints/drive/files/update.ts
@@ -0,0 +1,75 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import DriveFolder from '../../../models/drive-folder';
+import DriveFile, { validateFileName, pack } from '../../../models/drive-file';
+import { publishDriveStream } from '../../../event';
+
+/**
+ * Update a file
+ *
+ * @param {any} params
+ * @param {any} user
+ * @return {Promise<any>}
+ */
+module.exports = (params, user) => new Promise(async (res, rej) => {
+ // Get 'file_id' parameter
+ const [fileId, fileIdErr] = $(params.file_id).id().$;
+ if (fileIdErr) return rej('invalid file_id param');
+
+ // Fetch file
+ const file = await DriveFile
+ .findOne({
+ _id: fileId,
+ 'metadata.user_id': user._id
+ });
+
+ if (file === null) {
+ return rej('file-not-found');
+ }
+
+ // Get 'name' parameter
+ const [name, nameErr] = $(params.name).optional.string().pipe(validateFileName).$;
+ if (nameErr) return rej('invalid name param');
+ if (name) file.filename = name;
+
+ // Get 'folder_id' parameter
+ const [folderId, folderIdErr] = $(params.folder_id).optional.nullable.id().$;
+ if (folderIdErr) return rej('invalid folder_id param');
+
+ if (folderId !== undefined) {
+ if (folderId === null) {
+ file.metadata.folder_id = null;
+ } else {
+ // Fetch folder
+ const folder = await DriveFolder
+ .findOne({
+ _id: folderId,
+ user_id: user._id
+ });
+
+ if (folder === null) {
+ return rej('folder-not-found');
+ }
+
+ file.metadata.folder_id = folder._id;
+ }
+ }
+
+ await DriveFile.update(file._id, {
+ $set: {
+ filename: file.filename,
+ 'metadata.folder_id': file.metadata.folder_id
+ }
+ });
+
+ // Serialize
+ const fileObj = await pack(file);
+
+ // Response
+ res(fileObj);
+
+ // Publish file_updated event
+ publishDriveStream(user._id, 'file_updated', fileObj);
+});
diff --git a/src/server/api/endpoints/drive/files/upload_from_url.ts b/src/server/api/endpoints/drive/files/upload_from_url.ts
new file mode 100644
index 0000000000..346633c616
--- /dev/null
+++ b/src/server/api/endpoints/drive/files/upload_from_url.ts
@@ -0,0 +1,26 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import { pack } from '../../../models/drive-file';
+import uploadFromUrl from '../../../common/drive/upload_from_url';
+
+/**
+ * Create a file from a URL
+ *
+ * @param {any} params
+ * @param {any} user
+ * @return {Promise<any>}
+ */
+module.exports = async (params, user): Promise<any> => {
+ // Get 'url' parameter
+ // TODO: Validate this url
+ const [url, urlErr] = $(params.url).string().$;
+ if (urlErr) throw 'invalid url param';
+
+ // Get 'folder_id' parameter
+ const [folderId = null, folderIdErr] = $(params.folder_id).optional.nullable.id().$;
+ if (folderIdErr) throw 'invalid folder_id param';
+
+ return pack(await uploadFromUrl(url, user, folderId));
+};