From 6b839a0442f1b6be8f93c29af368f4f9992ed2c5 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Tue, 7 Feb 2023 00:30:08 +0530 Subject: [PATCH] feat: Ability for super admin to impersonate a user (#6382) --- .../platform/api/v1/users_controller.rb | 3 +-- app/models/concerns/sso_authenticatable.rb | 5 +++++ app/views/super_admin/users/_impersonate.erb | 8 ++++++++ app/views/super_admin/users/show.html.erb | 2 ++ lib/seeders/account_seeder.rb | 13 +++++++++++-- lib/seeders/seed_data.yml | 19 +++++++++++++++++++ 6 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 app/views/super_admin/users/_impersonate.erb diff --git a/app/controllers/platform/api/v1/users_controller.rb b/app/controllers/platform/api/v1/users_controller.rb index 2c8995f81..e0de74da1 100644 --- a/app/controllers/platform/api/v1/users_controller.rb +++ b/app/controllers/platform/api/v1/users_controller.rb @@ -13,8 +13,7 @@ class Platform::Api::V1::UsersController < PlatformController end def login - encoded_email = ERB::Util.url_encode(@resource.email) - render json: { url: "#{ENV.fetch('FRONTEND_URL', nil)}/app/login?email=#{encoded_email}&sso_auth_token=#{@resource.generate_sso_auth_token}" } + render json: { url: @resource.generate_sso_link } end def show; end diff --git a/app/models/concerns/sso_authenticatable.rb b/app/models/concerns/sso_authenticatable.rb index aca28b663..e228ca2c2 100644 --- a/app/models/concerns/sso_authenticatable.rb +++ b/app/models/concerns/sso_authenticatable.rb @@ -15,6 +15,11 @@ module SsoAuthenticatable ::Redis::Alfred.get(sso_token_key(token)).present? end + def generate_sso_link + encoded_email = ERB::Util.url_encode(email) + "#{ENV.fetch('FRONTEND_URL', nil)}/app/login?email=#{encoded_email}&sso_auth_token=#{generate_sso_auth_token}" + end + private def sso_token_key(token) diff --git a/app/views/super_admin/users/_impersonate.erb b/app/views/super_admin/users/_impersonate.erb new file mode 100644 index 000000000..dff1cda57 --- /dev/null +++ b/app/views/super_admin/users/_impersonate.erb @@ -0,0 +1,8 @@ +
+
+
+

Caution: Any actions executed after impersonate will appear as if performed by the impersonated user - [<%= page.resource.name %> ]

+ Impersonate user +
+
+ diff --git a/app/views/super_admin/users/show.html.erb b/app/views/super_admin/users/show.html.erb index a428d797e..15bdb0ca9 100644 --- a/app/views/super_admin/users/show.html.erb +++ b/app/views/super_admin/users/show.html.erb @@ -85,3 +85,5 @@ as well as a link to its edit page. <% end %> + +<%= render partial: "impersonate", locals: {page: page} %> diff --git a/lib/seeders/account_seeder.rb b/lib/seeders/account_seeder.rb index 1f665acc5..7af6110d2 100644 --- a/lib/seeders/account_seeder.rb +++ b/lib/seeders/account_seeder.rb @@ -3,7 +3,7 @@ ### Usage ##### # # # Seed an account with all data types in this class -# Seeders::AccountSeeder.new(account: @Account.find(1)).perform! +# Seeders::AccountSeeder.new(account: Account.find(1)).perform! # # ############################################################ @@ -89,16 +89,25 @@ class Seeders::AccountSeeder conversation = contact_inbox.conversations.create!(account: contact_inbox.inbox.account, contact: contact_inbox.contact, inbox: contact_inbox.inbox, assignee: assignee) create_messages(conversation: conversation, messages: conversation_data['messages']) + conversation.update_labels(conversation_data[:labels]) if conversation_data[:labels].present? end def create_messages(conversation:, messages:) messages.each do |message_data| - sender = User.find_by(email: message_data['sender']) if message_data['sender'].present? + sender = find_message_sender(conversation, message_data) conversation.messages.create!(message_data.slice('content', 'message_type').merge(account: conversation.inbox.account, sender: sender, inbox: conversation.inbox)) end end + def find_message_sender(conversation, message_data) + if message_data['message_type'] == 'incoming' + User.find_by(email: message_data['sender']) if message_data['sender'].present? + else + conversation.contact + end + end + def seed_inboxes Seeders::InboxSeeder.new(account: @account, company_data: @account_data[:company]).perform! end diff --git a/lib/seeders/seed_data.yml b/lib/seeders/seed_data.yml index 5e41e0131..5426f4c9a 100644 --- a/lib/seeders/seed_data.yml +++ b/lib/seeders/seed_data.yml @@ -222,6 +222,7 @@ contacts: gender: 'male' conversations: - channel: Channel::Whatsapp + source_id: "123456723" messages: - message_type: incoming content: hello world @@ -263,6 +264,7 @@ contacts: gender: 'male' conversations: - channel: Channel::Whatsapp + source_id: "12323432" messages: - message_type: incoming content: hello world @@ -271,6 +273,7 @@ contacts: gender: 'male' conversations: - channel: Channel::Whatsapp + source_id: "12342234324" messages: - message_type: incoming content: hello world @@ -330,6 +333,12 @@ contacts: gender: 'female' conversations: - channel: Channel::Whatsapp + source_id: "1223423567" + labels: + - billing + - delivery + - ops-handover + - premium-customer messages: - message_type: incoming content: "Hey \n I didn't get the product delivered, but it shows it is delivered to my address. Please check" @@ -338,6 +347,9 @@ contacts: gender: 'male' conversations: - channel: Channel::WebWidget + labels: + - software + - ops-handover messages: - message_type: incoming content: "Hey there, \n I need some help with the product, my button is not working on the website." @@ -347,6 +359,10 @@ contacts: conversations: - channel: Channel::WebWidget assignee: michael_scott@paperlayer.test + labels: + - billing + - software + - lead messages: - message_type: incoming content: "Hey, \n My card is not working on your website. Please help" @@ -357,6 +373,9 @@ contacts: - channel: Channel::Email source_id: "cmathersonj@va.test" assignee: michael_scott@paperlayer.test + labels: + - billing + - lead messages: - message_type: incoming content: "Hey, \n I'm looking for some help to figure out if it is the right product for me."