Account deletion (#3728)
* Add form for account deletion * If avatar or header are gone from source, remove them * Add option to have SuspendAccountService remove user record, add tests * Exclude suspended accounts from searchmaster
parent
a208e7d655
commit
4a618908e8
@ -0,0 +1,27 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class Settings::DeletesController < ApplicationController |
||||
layout 'admin' |
||||
|
||||
before_action :authenticate_user! |
||||
|
||||
def show |
||||
@confirmation = Form::DeleteConfirmation.new |
||||
end |
||||
|
||||
def destroy |
||||
if current_user.valid_password?(delete_params[:password]) |
||||
Admin::SuspensionWorker.perform_async(current_user.account_id, true) |
||||
sign_out |
||||
redirect_to new_user_session_path, notice: I18n.t('deletes.success_msg') |
||||
else |
||||
redirect_to settings_delete_path, alert: I18n.t('deletes.bad_password_msg') |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def delete_params |
||||
params.permit(:password) |
||||
end |
||||
end |
@ -0,0 +1,7 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class Form::DeleteConfirmation |
||||
include ActiveModel::Model |
||||
|
||||
attr_accessor :password |
||||
end |
@ -0,0 +1,16 @@ |
||||
- content_for :page_title do |
||||
= t('settings.delete') |
||||
|
||||
= simple_form_for @confirmation, url: settings_delete_path, method: :delete do |f| |
||||
.warning |
||||
%strong |
||||
= fa_icon('warning') |
||||
= t('deletes.warning_title') |
||||
= t('deletes.warning_html') |
||||
|
||||
%p.hint= t('deletes.description_html') |
||||
|
||||
= f.input :password, autocomplete: 'off', placeholder: t('simple_form.labels.defaults.current_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password') }, hint: t('deletes.confirm_password') |
||||
|
||||
.actions |
||||
= f.button :button, t('deletes.proceed'), type: :submit, class: 'negative' |
@ -0,0 +1,72 @@ |
||||
require 'rails_helper' |
||||
|
||||
describe Settings::DeletesController do |
||||
render_views |
||||
|
||||
describe 'GET #show' do |
||||
context 'when signed in' do |
||||
let(:user) { Fabricate(:user) } |
||||
|
||||
before do |
||||
sign_in user, scope: :user |
||||
end |
||||
|
||||
it 'renders confirmation page' do |
||||
get :show |
||||
expect(response).to have_http_status(:success) |
||||
end |
||||
end |
||||
|
||||
context 'when not signed in' do |
||||
it 'redirects' do |
||||
get :show |
||||
expect(response).to redirect_to '/auth/sign_in' |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe 'DELETE #destroy' do |
||||
context 'when signed in' do |
||||
let(:user) { Fabricate(:user, password: 'petsmoldoggos') } |
||||
|
||||
before do |
||||
sign_in user, scope: :user |
||||
end |
||||
|
||||
context 'with correct password' do |
||||
before do |
||||
delete :destroy, params: { password: 'petsmoldoggos' } |
||||
end |
||||
|
||||
it 'redirects to sign in page' do |
||||
expect(response).to redirect_to '/auth/sign_in' |
||||
end |
||||
|
||||
it 'removes user record' do |
||||
expect(User.find_by(id: user.id)).to be_nil |
||||
end |
||||
|
||||
it 'marks account as suspended' do |
||||
expect(user.account.reload).to be_suspended |
||||
end |
||||
end |
||||
|
||||
context 'with incorrect password' do |
||||
before do |
||||
delete :destroy, params: { password: 'blaze420' } |
||||
end |
||||
|
||||
it 'redirects back to confirmation page' do |
||||
expect(response).to redirect_to settings_delete_path |
||||
end |
||||
end |
||||
end |
||||
|
||||
context 'when not signed in' do |
||||
it 'redirects' do |
||||
delete :destroy |
||||
expect(response).to redirect_to '/auth/sign_in' |
||||
end |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue