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

This commit is contained in:
James Allen 2017-01-30 15:40:31 +01:00
parent 92da38bb6b
commit a539398275

View file

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