Feature: Allow staff to change user emails (#7074)
* Admin: Show unconfirmed email address on account page * Admin: Allow staff to change user email addresses * ActionLog: On change_email, log current email address and new unconfirmed email addressmaster
parent
e6e93ecd8a
commit
219a4423d8
@ -0,0 +1,49 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
module Admin |
||||
class ChangeEmailsController < BaseController |
||||
before_action :set_account |
||||
before_action :require_local_account! |
||||
|
||||
def show |
||||
authorize @user, :change_email? |
||||
end |
||||
|
||||
def update |
||||
authorize @user, :change_email? |
||||
|
||||
new_email = resource_params.fetch(:unconfirmed_email) |
||||
|
||||
if new_email != @user.email |
||||
@user.update!( |
||||
unconfirmed_email: new_email, |
||||
# Regenerate the confirmation token: |
||||
confirmation_token: nil |
||||
) |
||||
|
||||
log_action :change_email, @user |
||||
|
||||
@user.send_confirmation_instructions |
||||
end |
||||
|
||||
redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.change_email.changed_msg') |
||||
end |
||||
|
||||
private |
||||
|
||||
def set_account |
||||
@account = Account.find(params[:account_id]) |
||||
@user = @account.user |
||||
end |
||||
|
||||
def require_local_account! |
||||
redirect_to admin_account_path(@account.id) unless @account.local? && @account.user.present? |
||||
end |
||||
|
||||
def resource_params |
||||
params.require(:user).permit( |
||||
:unconfirmed_email |
||||
) |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,7 @@ |
||||
- content_for :page_title do |
||||
= t('admin.accounts.change_email.title', username: @account.acct) |
||||
|
||||
= simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f| |
||||
= f.input :email, wrapper: :with_label, disabled: true, label: t('admin.accounts.change_email.current_email') |
||||
= f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email') |
||||
= f.button :submit, class: "button", value: t('admin.accounts.change_email.submit') |
@ -0,0 +1,47 @@ |
||||
require 'rails_helper' |
||||
|
||||
RSpec.describe Admin::ChangeEmailsController, type: :controller do |
||||
render_views |
||||
|
||||
let(:admin) { Fabricate(:user, admin: true) } |
||||
|
||||
before do |
||||
sign_in admin |
||||
end |
||||
|
||||
describe "GET #show" do |
||||
it "returns http success" do |
||||
account = Fabricate(:account) |
||||
user = Fabricate(:user, account: account) |
||||
|
||||
get :show, params: { account_id: account.id } |
||||
|
||||
expect(response).to have_http_status(:success) |
||||
end |
||||
end |
||||
|
||||
describe "GET #update" do |
||||
before do |
||||
allow(UserMailer).to receive(:confirmation_instructions).and_return(double('email', deliver_later: nil)) |
||||
end |
||||
|
||||
it "returns http success" do |
||||
account = Fabricate(:account) |
||||
user = Fabricate(:user, account: account) |
||||
|
||||
previous_email = user.email |
||||
|
||||
post :update, params: { account_id: account.id, user: { unconfirmed_email: 'test@example.com' } } |
||||
|
||||
user.reload |
||||
|
||||
expect(user.email).to eq previous_email |
||||
expect(user.unconfirmed_email).to eq 'test@example.com' |
||||
expect(user.confirmation_token).not_to be_nil |
||||
|
||||
expect(UserMailer).to have_received(:confirmation_instructions).with(user, user.confirmation_token, { to: 'test@example.com' }) |
||||
|
||||
expect(response).to redirect_to(admin_account_path(account.id)) |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue