From bf7601fa8d2728969823fb5a6ce24ae47cf4a992 Mon Sep 17 00:00:00 2001
From: otofune <otofune@gmail.com>
Date: Tue, 7 Nov 2017 22:08:21 +0900
Subject: [PATCH] run parallely

---
 package.json                  |  1 +
 tools/migration/use-gridfs.js | 33 +++++++++++----------------------
 2 files changed, 12 insertions(+), 22 deletions(-)

diff --git a/package.json b/package.json
index cf291fe2b2..96831a3c4a 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
 		"format": "gulp format"
 	},
 	"devDependencies": {
+		"@prezzemolo/zip": "0.0.3",
 		"@types/bcryptjs": "2.4.1",
 		"@types/body-parser": "1.16.7",
 		"@types/chai": "4.0.4",
diff --git a/tools/migration/use-gridfs.js b/tools/migration/use-gridfs.js
index 106cbd3889..228943f49f 100644
--- a/tools/migration/use-gridfs.js
+++ b/tools/migration/use-gridfs.js
@@ -3,6 +3,7 @@
 const { default: db } = require('../../built/db/mongodb')
 const { default: DriveFile, getGridFSBucket } = require('../../built/api/models/drive-file')
 const { Duplex } = require('stream')
+const { default: zip } = require('@prezzemolo/zip')
 
 const writeToGridFS = (bucket, buffer, ...rest) => new Promise((resolve, reject) => {
 	const writeStream = bucket.openUploadStreamWithId(...rest)
@@ -45,30 +46,18 @@ const migrateToGridFS = async (doc) => {
 }
 
 async function main() {
-	let i = 0;
+	const count = await DriveFile.count({});
 
-	const count = await db.get('drive_files').count({});
+	const dop = Number.parseInt(process.argv[2]) || 5
 
-	const iterate = async () => {
-		if (i == count) return true;
-		console.log(`${i} / ${count}`);
-		const doc = (await db.get('drive_files').find({}, { limit: 1, skip: i }))[0]
-		const res = await migrateToGridFS(doc);
-		if (!res) {
-			return false;
-		} else {
-			i++
-			return await iterate();
-		}
-	}
-
-	const res = await iterate();
-
-	if (res) {
-		return 'ok';
-	} else {
-		throw 'something happened';
-	}
+	return zip(
+		1,
+		async (time) => {
+			const doc = await DriveFile.find({}, { limit: dop, skip: time * dop })
+			return Promise.all(doc.map(migrateToGridFS))
+		},
+		((count - (count % dop)) / dop) + 1
+	)
 }
 
 main().then(console.dir).catch(console.error)