Browse Source

Add in dry run option for holding account migration and log out removed users

James Allen 9 năm trước cách đây
mục cha
commit
a539398275
1 tập tin đã thay đổi với 73 bổ sung và 43 xóa
  1. 73 43
      server-ce/migrations/5_remove_holding_accounts.coffee

+ 73 - 43
server-ce/migrations/5_remove_holding_accounts.coffee

@@ -4,50 +4,80 @@ ObjectId = mongojs.ObjectId
 db = mongojs(Settings.mongo.url, ['users', 'projects'])
 async = require "async"
 
-findHoldingAccounts = (callback = (error, users) ->) ->
-	db.users.find({holdingAccount: true}, {holdingAccount: 1, email: 1}, callback)
+module.exports = HoldingAccountMigration = 
+	DRY_RUN: true
 
-deleteUserProjects = (user_id, callback = (error) ->) ->
-	# Holding accounts can't own projects, so only remove from 
-	# collaberator_refs and readOnly_refs
-	console.log "[Removing user from projects]", user_id
-	db.projects.update {
-		$or: [
-			{collaberator_refs: user_id},
-			{readOnly_refs: user_id}
-		]
-	}, {
-		$pull: {
-			collaberator_refs: user_id,
-			readOnly_refs: user_id
-		}
-	}, {
-		multi: true
-	}, (error, result) ->
-		console.log "[Removed user from projects]", user_id, result
-		callback(error)
+	findHoldingAccounts: (callback = (error, users) ->) ->
+		db.users.find({holdingAccount: true}, {holdingAccount: 1, email: 1}, callback)
 
-deleteUser = (user_id, callback = (error) ->) ->
-	if !user_id?
-		throw new Error("must have user_id")
-	console.log "[Removing user]", user_id
-	db.users.remove {_id: user_id}, (error, result) ->
-		console.log "[Removed user]", user_id, result
-		callback(error)
+	deleteUserProjects: (user_id, callback = (error) ->) ->
+		# Holding accounts can't own projects, so only remove from 
+		# collaberator_refs and readOnly_refs
+		console.log "[Removing user from projects]", user_id
+		db.projects.find {
+			$or: [
+				{collaberator_refs: user_id},
+				{readOnly_refs: user_id}
+			]
+		}, { collaberator_refs: 1, readOnly_refs: 1 }, (error, projects = []) ->
+			return callback(error) if error?
+			jobs = projects.map (project) ->
+				(cb) ->
+					console.log "[Removing user from project]", user_id, JSON.stringify(project)
+					if !project._id?
+						throw new Error("no project id")
+				
+					if !HoldingAccountMigration.DRY_RUN
+						db.projects.update {
+							_id: project._id
+						}, {
+							$pull: {
+								collaberator_refs: user_id,
+								readOnly_refs: user_id
+							}
+						}, (error, result) ->
+							return cb(error) if error?
+							console.log "[Removed user from project]", user_id, project._id, result
+							cb()
+					else
+						console.log "[Would have removed user from project]", user_id, project._id
+						cb()
+						
+			async.series jobs, callback
 
-exports.migrate = (client, done=()->) ->
-	findHoldingAccounts (error, users) ->
-		throw error if error?
-		console.log "[Got list of holding accounts]", users.map (u) -> u._id
-		jobs = users.map (u) ->
-			(cb) ->
-				deleteUserProjects u._id, (error) ->
-					return cb(error) if error?
-					deleteUser u._id, cb
-		async.series jobs, (error) ->
+	deleteUser: (user_id, callback = (error) ->) ->
+		if !user_id?
+			throw new Error("must have user_id")
+		db.users.find {_id: user_id}, (error, user) ->
+			return callback(error) if error?
+			if !user?
+				throw new Error("expected user")
+			console.log "[Removing user]", user_id, JSON.stringify(user)
+			if !HoldingAccountMigration.DRY_RUN
+				db.users.remove {_id: user_id}, (error, result) ->
+					console.log "[Removed user]", user_id, result
+					callback(error)
+			else
+				console.log "[Would have removed user]", user_id
+				callback()
+
+	run: (done) ->
+		HoldingAccountMigration.findHoldingAccounts (error, users) ->
 			throw error if error?
-			console.log "[Removed holding accounts]"
-			done()
-			
-exports.rollback = (client, done) ->
-	done()
+			console.log "[Got list of holding accounts]", users.map (u) -> u._id
+			jobs = users.map (u) ->
+				(cb) ->
+					HoldingAccountMigration.deleteUserProjects u._id, (error) ->
+						return cb(error) if error?
+						HoldingAccountMigration.deleteUser u._id, cb
+			async.series jobs, (error) ->
+				throw error if error?
+				console.log "[Removed holding accounts]"
+				done()
+
+	migrate: (client, done=()->) ->
+		HoldingAccountMigration.DRY_RUN = false
+		HoldingAccountMigration.run(done)
+				
+	rollback: (client, done) ->
+		done()