From 9f981d875afef35329268e6a7dc5d35d8a854c72 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Wed, 24 Oct 2018 18:37:58 +0900
Subject: [PATCH] Implement drive/folders/delete

---
 .../api/endpoints/drive/folders/delete.ts     | 60 +++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 src/server/api/endpoints/drive/folders/delete.ts

diff --git a/src/server/api/endpoints/drive/folders/delete.ts b/src/server/api/endpoints/drive/folders/delete.ts
new file mode 100644
index 0000000000..72ad5c81ab
--- /dev/null
+++ b/src/server/api/endpoints/drive/folders/delete.ts
@@ -0,0 +1,60 @@
+import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import DriveFolder, { pack } from '../../../../../models/drive-folder';
+import { ILocalUser } from '../../../../../models/user';
+import getParams from '../../../get-params';
+import { publishDriveStream } from '../../../../../stream';
+import DriveFile from '../../../../../models/drive-file';
+
+export const meta = {
+	stability: 'stable',
+
+	desc: {
+		'ja-JP': '指定したドライブのフォルダを削除します。',
+		'en-US': 'Delete specified folder of drive.'
+	},
+
+	requireCredential: true,
+
+	kind: 'drive-write',
+
+	params: {
+		folderId: $.type(ID).note({
+			desc: {
+				'ja-JP': '対象のフォルダID',
+				'en-US': 'Target folder ID'
+			}
+		})
+	}
+};
+
+export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
+	const [ps, psErr] = getParams(meta, params);
+	if (psErr) return rej(psErr);
+
+	// Get folder
+	const folder = await DriveFolder
+		.findOne({
+			_id: ps.folderId,
+			userId: user._id
+		});
+
+	if (folder === null) {
+		return rej('folder-not-found');
+	}
+
+	const [childFoldersCount, childFilesCount] = await Promise.all([
+		DriveFolder.count({ parentId: folder._id }),
+		DriveFile.count({ folderId: folder._id })
+	]);
+
+	if (childFoldersCount !== 0 || childFilesCount !== 0) {
+		return rej('has-child-contents');
+	}
+
+	await DriveFolder.remove({ _id: folder._id });
+
+	// Publish folderCreated event
+	publishDriveStream(user._id, 'folderDeleted', folder._id);
+
+	res();
+});