From 05540ca8a75e067ab6d3d592db28213358dca31d Mon Sep 17 00:00:00 2001 From: James Allen Date: Mon, 30 Jan 2017 14:36:06 +0100 Subject: [PATCH] Add migration to remove holding accounts --- migrations/5_remove_holding_accounts.coffee | 53 +++++++++++++++++++++ migrations/about_migrations.md | 11 ++++- 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 migrations/5_remove_holding_accounts.coffee diff --git a/migrations/5_remove_holding_accounts.coffee b/migrations/5_remove_holding_accounts.coffee new file mode 100644 index 0000000000..c9ab2a041b --- /dev/null +++ b/migrations/5_remove_holding_accounts.coffee @@ -0,0 +1,53 @@ +Settings = require "settings-sharelatex" +mongojs = require("mongojs") +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) + +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) + +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) + +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) -> + throw error if error? + console.log "[Removed holding accounts]" + done() + +exports.rollback = (client, done) -> + done() diff --git a/migrations/about_migrations.md b/migrations/about_migrations.md index 146cb9c047..97f91442b1 100644 --- a/migrations/about_migrations.md +++ b/migrations/about_migrations.md @@ -1,2 +1,9 @@ -* if migration is stopped mid way it will start at the beginging next time -* to see the run migrations do db.getCollection('_migrations').find() you can't do db._migrations.find() \ No newline at end of file +If migration is stopped mid way it will start at the beginging next time + +To see the run migrations do db.getCollection('_migrations').find() you can't do db._migrations.find() + +When testing, to roll back a migration run: + +``` +./node_modules/east/bin/east rollback 5 --adapter east-mongo --url mongodb://localhost:27017/sharelatex +```