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:
		
							parent
							
								
									0e39cc6a35
								
							
						
					
					
						commit
						3a9eb81a80
					
				
					 9 changed files with 182 additions and 44 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										23
									
								
								app/controllers/admin/silences_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/controllers/admin/silences_controller.rb
									
										
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										23
									
								
								app/controllers/admin/suspensions_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/controllers/admin/suspensions_controller.rb
									
										
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										36
									
								
								app/models/account_filter.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								app/models/account_filter.rb
									
										
									
									
									
										Normal 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
 | 
			
		||||
| 
						 | 
				
			
			@ -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'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										24
									
								
								spec/controllers/admin/silences_controller_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								spec/controllers/admin/silences_controller_spec.rb
									
										
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										24
									
								
								spec/controllers/admin/suspensions_controller_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								spec/controllers/admin/suspensions_controller_spec.rb
									
										
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										31
									
								
								spec/models/account_filter_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								spec/models/account_filter_spec.rb
									
										
									
									
									
										Normal 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
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue