diff --git a/app/controllers/admin/accounts/avatars_controller.rb b/app/controllers/admin/accounts/avatars_controller.rb new file mode 100644 index 00000000000..5b18c4296fc --- /dev/null +++ b/app/controllers/admin/accounts/avatars_controller.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Admin + class Accounts::AvatarsController < BaseController + before_action :set_account + + def destroy + authorize @account, :remove_avatar? + + @account.avatar = nil + @account.save! + + log_action :remove_avatar, @account.user + + redirect_to admin_account_path(@account.id), notice: t('admin.accounts.removed_avatar_msg', username: @account.acct) + end + + private + + def set_account + @account = Account.find(params[:account_id]) + end + end +end diff --git a/app/controllers/admin/accounts/headers_controller.rb b/app/controllers/admin/accounts/headers_controller.rb new file mode 100644 index 00000000000..26b3e97c190 --- /dev/null +++ b/app/controllers/admin/accounts/headers_controller.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Admin + class Accounts::HeadersController < BaseController + before_action :set_account + + def destroy + authorize @account, :remove_header? + + @account.header = nil + @account.save! + + log_action :remove_header, @account.user + + redirect_to admin_account_path(@account.id), notice: t('admin.accounts.removed_header_msg', username: @account.acct) + end + + private + + def set_account + @account = Account.find(params[:account_id]) + end + end +end diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index e1406930147..321282ab295 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -106,28 +106,6 @@ module Admin redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.redownloaded_msg', username: @account.acct) end - def remove_avatar - authorize @account, :remove_avatar? - - @account.avatar = nil - @account.save! - - log_action :remove_avatar, @account.user - - redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.removed_avatar_msg', username: @account.acct) - end - - def remove_header - authorize @account, :remove_header? - - @account.header = nil - @account.save! - - log_action :remove_header, @account.user - - redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.removed_header_msg', username: @account.acct) - end - def unblock_email authorize @account, :unblock_email? diff --git a/app/views/admin/accounts/_local_account.html.haml b/app/views/admin/accounts/_local_account.html.haml index bff752332c6..973609904d9 100644 --- a/app/views/admin/accounts/_local_account.html.haml +++ b/app/views/admin/accounts/_local_account.html.haml @@ -1,12 +1,12 @@ - if account.avatar? %tr %th= t('admin.accounts.avatar') - %td= table_link_to 'delete', t('admin.accounts.remove_avatar'), remove_avatar_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_avatar, account) + %td= table_link_to 'delete', t('admin.accounts.remove_avatar'), admin_account_avatar_path(account.id), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_avatar, account) %td - if account.header? %tr %th= t('admin.accounts.header') - %td= table_link_to 'delete', t('admin.accounts.remove_header'), remove_header_admin_account_path(account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_header, account) + %td= table_link_to 'delete', t('admin.accounts.remove_header'), admin_account_header_path(account.id), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:remove_header, account) %td %tr %th= t('admin.accounts.role') diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 97f84da44e7..52879271f74 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -131,14 +131,17 @@ namespace :admin do resources :report_notes, only: [:create, :destroy] resources :accounts, only: [:index, :show, :destroy] do + scope module: :accounts do + resource :header, only: :destroy + resource :avatar, only: :destroy + end + member do post :enable post :unsensitive post :unsilence post :unsuspend post :redownload - post :remove_avatar - post :remove_header post :memorialize post :approve post :reject diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index 2ec3bca746c..b1405891967 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -280,29 +280,6 @@ RSpec.describe Admin::AccountsController do end end - describe 'POST #remove_avatar' do - subject { post :remove_avatar, params: { id: account.id } } - - let(:current_user) { Fabricate(:user, role: role) } - let(:account) { Fabricate(:account) } - - context 'when user is admin' do - let(:role) { UserRole.find_by(name: 'Admin') } - - it 'succeeds in removing avatar' do - expect(subject).to redirect_to admin_account_path(account.id) - end - end - - context 'when user is not admin' do - let(:role) { UserRole.everyone } - - it 'fails to remove avatar' do - expect(subject).to have_http_status 403 - end - end - end - describe 'POST #unblock_email' do subject { post :unblock_email, params: { id: account.id } } diff --git a/spec/requests/admin/accounts/avatar_spec.rb b/spec/requests/admin/accounts/avatar_spec.rb new file mode 100644 index 00000000000..95292fdd04e --- /dev/null +++ b/spec/requests/admin/accounts/avatar_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Accounts Avatar' do + before { sign_in user } + + describe 'DELETE #destroy' do + let(:user) { Fabricate(:user, role: role) } + let(:account) { Fabricate(:account, avatar: fixture_file_upload('avatar.gif', 'image/gif')) } + + context 'when user is not admin' do + let(:role) { UserRole.everyone } + + it 'fails to remove avatar' do + delete "/admin/accounts/#{account.id}/avatar" + + expect(response) + .to have_http_status 403 + end + end + end +end diff --git a/spec/requests/admin/accounts/header_spec.rb b/spec/requests/admin/accounts/header_spec.rb new file mode 100644 index 00000000000..5582e8c28dd --- /dev/null +++ b/spec/requests/admin/accounts/header_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Accounts Header' do + before { sign_in user } + + describe 'DELETE #destroy' do + let(:user) { Fabricate(:user, role: role) } + let(:account) { Fabricate(:account, header: fixture_file_upload('attachment.jpg', 'image/jpeg')) } + + context 'when user is not admin' do + let(:role) { UserRole.everyone } + + it 'fails to remove header' do + delete "/admin/accounts/#{account.id}/header" + + expect(response) + .to have_http_status 403 + end + end + end +end diff --git a/spec/system/admin/accounts/avatar_spec.rb b/spec/system/admin/accounts/avatar_spec.rb new file mode 100644 index 00000000000..933dbc6b71a --- /dev/null +++ b/spec/system/admin/accounts/avatar_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Accounts Avatar' do + before { sign_in user } + + let(:user) { Fabricate(:admin_user) } + + describe 'Deleting an account avatar' do + let(:account) { Fabricate(:account, avatar: fixture_file_upload('avatar.gif', 'image/gif')) } + + it 'succeeds in removing avatar' do + visit admin_account_path(account.id) + + expect { submit_delete } + .to change { account.reload.avatar_file_name }.to(be_blank) + .and change(Admin::ActionLog, :count).by(1) + expect(page) + .to have_content I18n.t('admin.accounts.removed_avatar_msg', username: account.acct) + end + + def submit_delete + click_on I18n.t('admin.accounts.remove_avatar') + end + end +end diff --git a/spec/system/admin/accounts/header_spec.rb b/spec/system/admin/accounts/header_spec.rb new file mode 100644 index 00000000000..cc9d4d4c068 --- /dev/null +++ b/spec/system/admin/accounts/header_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Accounts Header' do + before { sign_in user } + + let(:user) { Fabricate(:admin_user) } + + describe 'Deleting an account header' do + let(:account) { Fabricate(:account, header: fixture_file_upload('attachment.jpg', 'image/jpeg')) } + + it 'succeeds in removing header' do + visit admin_account_path(account.id) + + expect { submit_delete } + .to change { account.reload.header_file_name }.to(be_blank) + .and change(Admin::ActionLog, :count).by(1) + expect(page) + .to have_content I18n.t('admin.accounts.removed_header_msg', username: account.acct) + end + + def submit_delete + click_on I18n.t('admin.accounts.remove_header') + end + end +end