diff --git a/scripts/mongodb/migrations/2014-07-09-name-conflicts.js b/scripts/mongodb/migrations/2014-07-09-name-conflicts.js new file mode 100644 index 000000000..cf8c81f66 --- /dev/null +++ b/scripts/mongodb/migrations/2014-07-09-name-conflicts.js @@ -0,0 +1,52 @@ +load('bower_components/lodash/dist/lodash.js'); +load('bower_components/underscore.string/dist/underscore.string.min.js'); + +var slugs = {}; +var num = 0; + +var unconflictName; + +unconflictName = function(name) { + var otherUser, suffix; + otherUser = db.users.findOne({ + slug: _.string.slugify(name) + }); + if (!otherUser) { + return name; + } + suffix = _.random(0, 9) + ''; + return unconflictName(name + suffix); +}; + +var params = { + name:1, + emails:1, + email:1, + slug:1, + dateCreated:1 +}; + +db.users.find({anonymous:false}, params).sort({_id:1}).forEach(function (user) { + num += 1; + var slug = _.string.slugify(user.name); + if(!slug) return; + var update = {}; + if(slugs[slug]) { + originalName = slugs[slug]; + conflictingName = user.name; + availableName = unconflictName(conflictingName); + conflictingSlug = slug; + slug = _.string.slugify(availableName); + update.name = availableName; + update.nameLower = availableName.toLowerCase(); + if (!(user.emails && user.emails.anyNotes === false)) + db.changedEmails.insert({email:user.email, user:user._id, name:user.name}); + print(_.str.sprintf('\n\n\tConflict! Username "%s" conflicts with "%s" (both sluggify to "%s"). Changing to "%s"\n\n\n', + conflictingName, originalName, conflictingSlug, availableName)); + } + update.slug = slug; + slugs[slug] = user.name; + if(user.slug) return; + print(_.str.sprintf('Setting user %s (%s) to slug %s with update %s', user.name, user.dateCreated, slug, JSON.stringify({$set:update}))); + db.users.update({_id:user._id}, {$set:update}); +}); \ No newline at end of file