Admin accounts controller cleanup (#1664)

* Remove unused account_params method in admin/accounts controller

* Introduce AccountFilter to find accounts

* Use AccountFilter in admin/accounts controller

* Use more restful routes admin silence and suspension area

* Add admin/silences and admin/suspensions controllers
This commit is contained in:
Matt Jankowski 2017-04-13 07:04:23 -04:00 committed by Eugen
parent 0e39cc6a35
commit 3a9eb81a80
9 changed files with 182 additions and 44 deletions

View File

@ -2,49 +2,29 @@
module Admin
class AccountsController < BaseController
before_action :set_account, except: :index
def index
@accounts = Account.alphabetic.page(params[:page])
@accounts = @accounts.local if params[:local].present?
@accounts = @accounts.remote if params[:remote].present?
@accounts = @accounts.where(domain: params[:by_domain]) if params[:by_domain].present?
@accounts = @accounts.silenced if params[:silenced].present?
@accounts = @accounts.recent if params[:recent].present?
@accounts = @accounts.suspended if params[:suspended].present?
@accounts = filtered_accounts.page(params[:page])
end
def show; end
def suspend
Admin::SuspensionWorker.perform_async(@account.id)
redirect_to admin_accounts_path
end
def unsuspend
@account.update(suspended: false)
redirect_to admin_accounts_path
end
def silence
@account.update(silenced: true)
redirect_to admin_accounts_path
end
def unsilence
@account.update(silenced: false)
redirect_to admin_accounts_path
def show
@account = Account.find(params[:id])
end
private
def set_account
@account = Account.find(params[:id])
def filtered_accounts
AccountFilter.new(filter_params).results
end
def account_params
params.require(:account).permit(:silenced, :suspended)
def filter_params
params.permit(
:local,
:remote,
:by_domain,
:silenced,
:recent,
:suspended
)
end
end
end

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
module Admin
class SilencesController < BaseController
before_action :set_account
def create
@account.update(silenced: true)
redirect_to admin_accounts_path
end
def destroy
@account.update(silenced: false)
redirect_to admin_accounts_path
end
private
def set_account
@account = Account.find(params[:account_id])
end
end
end

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
module Admin
class SuspensionsController < BaseController
before_action :set_account
def create
Admin::SuspensionWorker.perform_async(@account.id)
redirect_to admin_accounts_path
end
def destroy
@account.update(suspended: false)
redirect_to admin_accounts_path
end
private
def set_account
@account = Account.find(params[:account_id])
end
end
end

View File

@ -0,0 +1,36 @@
# frozen_string_literal: true
class AccountFilter
attr_reader :params
def initialize(params)
@params = params
end
def results
scope = Account.alphabetic
params.each do |key, value|
scope = scope.merge scope_for(key, value)
end
scope
end
def scope_for(key, value)
case key
when /local/
Account.local
when /remote/
Account.remote
when /by_domain/
Account.where(domain: value)
when /silenced/
Account.silenced
when /recent/
Account.recent
when /suspended/
Account.suspended
else
raise "Unknown filter: #{key}"
end
end
end

View File

@ -62,11 +62,11 @@
= number_to_human_size @account.media_attachments.sum('file_file_size')
- if @account.silenced?
= link_to 'Undo silence', unsilence_admin_account_path(@account.id), method: :post, class: 'button'
= link_to 'Undo silence', admin_account_silence_path(@account.id), method: :delete, class: 'button'
- else
= link_to 'Silence', silence_admin_account_path(@account.id), method: :post, class: 'button'
= link_to 'Silence', admin_account_silence_path(@account.id), method: :post, class: 'button'
- if @account.suspended?
= link_to 'Undo suspension', unsuspend_admin_account_path(@account.id), method: :post, class: 'button'
= link_to 'Undo suspension', admin_account_suspension_path(@account.id), method: :delete, class: 'button'
- else
= link_to 'Perform full suspension', suspend_admin_account_path(@account.id), method: :post, data: { confirm: 'Are you sure?' }, class: 'button'
= link_to 'Perform full suspension', admin_account_suspension_path(@account.id), method: :post, data: { confirm: 'Are you sure?' }, class: 'button'

View File

@ -1,3 +1,4 @@
# frozen_string_literal: true
require 'sidekiq/web'
@ -89,12 +90,8 @@ Rails.application.routes.draw do
end
resources :accounts, only: [:index, :show] do
member do
post :silence
post :unsilence
post :suspend
post :unsuspend
end
resource :silence, only: [:create, :destroy]
resource :suspension, only: [:create, :destroy]
end
end

View File

@ -0,0 +1,24 @@
require 'rails_helper'
describe Admin::SilencesController do
let(:account) { Fabricate(:account) }
before do
sign_in Fabricate(:user, admin: true), scope: :user
end
describe 'POST #create' do
it 'redirects to admin accounts page' do
post :create, params: { account_id: account.id }
expect(response).to redirect_to(admin_accounts_path)
end
end
describe 'DELETE #destroy' do
it 'redirects to admin accounts page' do
delete :destroy, params: { account_id: account.id }
expect(response).to redirect_to(admin_accounts_path)
end
end
end

View File

@ -0,0 +1,24 @@
require 'rails_helper'
describe Admin::SuspensionsController do
let(:account) { Fabricate(:account) }
before do
sign_in Fabricate(:user, admin: true), scope: :user
end
describe 'POST #create' do
it 'redirects to admin accounts page' do
post :create, params: { account_id: account.id }
expect(response).to redirect_to(admin_accounts_path)
end
end
describe 'DELETE #destroy' do
it 'redirects to admin accounts page' do
delete :destroy, params: { account_id: account.id }
expect(response).to redirect_to(admin_accounts_path)
end
end
end

View File

@ -0,0 +1,31 @@
require 'rails_helper'
describe AccountFilter do
describe 'with empty params' do
it 'defaults to alphabetic account list' do
filter = AccountFilter.new({})
expect(filter.results).to eq Account.alphabetic
end
end
describe 'with invalid params' do
it 'raises with key error' do
filter = AccountFilter.new(wrong: true)
expect { filter.results }.to raise_error(/wrong/)
end
end
describe 'with valid params' do
it 'combines filters on Account' do
filter = AccountFilter.new(by_domain: 'test.com', silenced: true)
allow(Account).to receive(:where).and_return(Account.none)
allow(Account).to receive(:silenced).and_return(Account.none)
filter.results
expect(Account).to have_received(:where).with(domain: 'test.com')
expect(Account).to have_received(:silenced)
end
end
end