Rename users that had their namespace renamed

This commit is contained in:
Bob Van Landuyt 2017-05-18 23:31:03 +02:00
parent e4eec19156
commit df5c3f364a
3 changed files with 63 additions and 1 deletions

View file

@ -0,0 +1,43 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class RenameUsersWithRenamedNamespace < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
DISALLOWED_ROOT_PATHS = %w[
-
abuse_reports
api
autocomplete
explore
health_check
import
invites
jwt
koding
member
notification_settings
oauth
sent_notifications
unicorn_test
uploads
users
]
def up
namespace_table = Arel::Table.new('namespaces')
users_table = Arel::Table.new('users')
matching_path = namespace_table.project(namespace_table[:path])
.join(users_table).on(users_table[:id].eq(namespace_table[:owner_id]))
.where(users_table[:username].not_eq(namespace_table[:path]))
path_name = Arel::Nodes::SqlLiteral.new("matching_path.path FROM (#{matching_path.to_sql}) as matching_path")
update_column_in_batches(:users, :username, path_name) do |table, query|
query.where(table[:username].matches_any(DISALLOWED_ROOT_PATHS))
end
end
def down
end
end

View file

@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170516183131) do
ActiveRecord::Schema.define(version: 20170518200835) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"

View file

@ -0,0 +1,19 @@
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20170518200835_rename_users_with_renamed_namespace.rb')
describe RenameUsersWithRenamedNamespace, truncate: true do
it 'renames a user that had his namespace renamed to the namespace path' do
other_user = create(:user, username: 'kodingu')
user = create(:user, username: "Users0")
user.update_attribute(:username, 'Users')
user1 = create(:user, username: "import0")
user1.update_attribute(:username, 'import')
described_class.new.up
expect(user.reload.username).to eq('Users0')
expect(user1.reload.username).to eq('import0')
expect(other_user.reload.username).to eq('kodingu')
end
end