From 4a99d8cfc751c0cef7cbb72f50f2399cdd3590a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s=20Calzado?= Date: Mon, 8 Nov 2021 13:02:24 +0100 Subject: [PATCH 1/3] Add new rake to change usernames --- lib/tasks/user_username_change.rake | 48 +++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 lib/tasks/user_username_change.rake diff --git a/lib/tasks/user_username_change.rake b/lib/tasks/user_username_change.rake new file mode 100644 index 0000000000..d07cbd2a2b --- /dev/null +++ b/lib/tasks/user_username_change.rake @@ -0,0 +1,48 @@ +namespace :cartodb do + namespace :user do + desc 'Change user username' + task :change_username, [:old_username, :new_username] => :environment do |_task, args| + raise "You must pass an existing username, and a new username for the existing user" unless args[:old_username] && args[:new_username] + + user = User.find(username: args[:old_username]) + raise "User with username #{args[:old_username]} doesn't exist!" unless user + + # Update username and database_schema + user.username = args[:new_username] + user.database_schema = args[:new_username] + user.save + + # Update Redis metadata + user.save_metadata + + # Rename user and database schema + user.in_database({as: :superuser}) do |db| + db.run("ALTER SCHEMA \"#{args[:old_username]}\" RENAME TO \"#{args[:new_username]}\";") + end + + # Regenerate API Keys + user.carto_user.api_keys.each { |api_key| + if api_key.master? + api_key.regenerate_token! + end + } + + # Fix map analysis + user.carto_user.tables.each do |table| + table.dependent_visualizations.each do |visualization| + visualization.analyses.each do |analysis| + analysis.update_table_name( + "#{args[:old_username]}.#{table.name}", + "\"#{args[:new_username]}\".#{table.name}" + ) + end + end + end + + # Fix public maps + Carto::Visualization.where(type: 'derived', privacy: 'public', user: user.carto_user).each { |visualization| + visualization.create_mapcap! + } + end + end +end From e51ea11e9c077ba624c0dbaa9b9905baeb344367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s=20Calzado?= Date: Mon, 8 Nov 2021 13:49:14 +0100 Subject: [PATCH 2/3] Regenerate all published maps, instead of public ones --- NEWS.md | 1 + lib/tasks/user_username_change.rake | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 0c09776128..8b1171964e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -70,6 +70,7 @@ Development - Fix Auth URL generation while establishing a connection with Google Drive [#16357](https://github.com/CartoDB/cartodb/pull/16357) - Fix adding license metadata to a dataset [#16356](https://github.com/CartoDB/cartodb/pull/16356) - Fix notifications when organization seats limit is reached [#16359](https://github.com/CartoDB/cartodb/pull/16359) +- Add a new rake to update a user username [#16370](https://github.com/CartoDB/cartodb/pull/16370) 4.45.0 (2021-04-14) ------------------- diff --git a/lib/tasks/user_username_change.rake b/lib/tasks/user_username_change.rake index d07cbd2a2b..acb3a04a39 100644 --- a/lib/tasks/user_username_change.rake +++ b/lib/tasks/user_username_change.rake @@ -40,8 +40,10 @@ namespace :cartodb do end # Fix public maps - Carto::Visualization.where(type: 'derived', privacy: 'public', user: user.carto_user).each { |visualization| - visualization.create_mapcap! + Carto::Visualization.where(type: 'derived', user: user.carto_user).each { |visualization| + if visualization.published? + visualization.create_mapcap! + end } end end From 82dd384a7917505fdbb0984c5bf815fc1d01ce54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s=20Calzado?= Date: Mon, 8 Nov 2021 17:14:29 +0100 Subject: [PATCH 3/3] Refactor after code review --- lib/tasks/user_username_change.rake | 66 +++++++++++++---------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/lib/tasks/user_username_change.rake b/lib/tasks/user_username_change.rake index acb3a04a39..f36f05cefe 100644 --- a/lib/tasks/user_username_change.rake +++ b/lib/tasks/user_username_change.rake @@ -1,50 +1,42 @@ namespace :cartodb do namespace :user do - desc 'Change user username' - task :change_username, [:old_username, :new_username] => :environment do |_task, args| - raise "You must pass an existing username, and a new username for the existing user" unless args[:old_username] && args[:new_username] + desc 'Change user username' + task :change_username, [:old_username, :new_username] => :environment do |_task, args| + raise "You must pass an existing username, and a new username for the existing user" unless args[:old_username] && args[:new_username] - user = User.find(username: args[:old_username]) - raise "User with username #{args[:old_username]} doesn't exist!" unless user + user = User.find(username: args[:old_username]) + raise "User with username #{args[:old_username]} doesn't exist!" unless user - # Update username and database_schema - user.username = args[:new_username] - user.database_schema = args[:new_username] - user.save + # Update username and database_schema + user.username = args[:new_username] + user.database_schema = args[:new_username] + user.save - # Update Redis metadata - user.save_metadata + # Update Redis metadata + user.save_metadata - # Rename user and database schema - user.in_database({as: :superuser}) do |db| - db.run("ALTER SCHEMA \"#{args[:old_username]}\" RENAME TO \"#{args[:new_username]}\";") - end + # Rename user and database schema + user.in_database(as: :superuser) { |db| + db.run("ALTER SCHEMA \"#{args[:old_username]}\" RENAME TO \"#{args[:new_username]}\";") + } - # Regenerate API Keys - user.carto_user.api_keys.each { |api_key| - if api_key.master? - api_key.regenerate_token! - end - } + # Regenerate API Keys + user.carto_user.api_keys.find(&:master?).try(:regenerate_token!) - # Fix map analysis - user.carto_user.tables.each do |table| - table.dependent_visualizations.each do |visualization| - visualization.analyses.each do |analysis| - analysis.update_table_name( - "#{args[:old_username]}.#{table.name}", - "\"#{args[:new_username]}\".#{table.name}" - ) - end + # Fix map analysis + user.carto_user.tables.each do |table| + table.dependent_visualizations.each do |visualization| + visualization.analyses.each do |analysis| + analysis.update_table_name( + "#{args[:old_username]}.#{table.name}", + "\"#{args[:new_username]}\".#{table.name}" + ) end end - - # Fix public maps - Carto::Visualization.where(type: 'derived', user: user.carto_user).each { |visualization| - if visualization.published? - visualization.create_mapcap! - end - } end + + # Fix public maps + Carto::Visualization.where(type: 'derived', user: user.carto_user).select(&:published?).each { |visualization| visualization.create_mapcap! } + end end end