commit: da77f65c4684a8a9ee25c3e18f6f09824c765c2d
parent: 9e2ff3ef71e917ba88a9062814f3e828f9199009
Author: nullkal <nullkal@nil.nu>
Date: Wed, 13 Sep 2017 19:30:07 +0900
Add instance search feature (#4925)
Diffstat:
4 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
@@ -14,8 +14,12 @@ module Admin
private
+ def filtered_instances
+ InstanceFilter.new(filter_params).results
+ end
+
def paginated_instances
- Account.remote.by_domain_accounts.page(params[:page])
+ filtered_instances.page(params[:page])
end
helper_method :paginated_instances
@@ -27,5 +31,11 @@ module Admin
def subscribeable_accounts
Account.with_followers.remote.where(domain: params[:by_domain])
end
+
+ def filter_params
+ params.permit(
+ :domain_name
+ )
+ end
end
end
diff --git a/app/models/account.rb b/app/models/account.rb
@@ -104,6 +104,7 @@ class Account < ApplicationRecord
scope :by_domain_accounts, -> { group(:domain).select(:domain, 'COUNT(*) AS accounts_count').order('accounts_count desc') }
scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) }
scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
+ scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
delegate :email,
:current_sign_in_ip,
diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class InstanceFilter
+ attr_reader :params
+
+ def initialize(params)
+ @params = params
+ end
+
+ def results
+ scope = Account.remote.by_domain_accounts
+ params.each do |key, value|
+ scope.merge!(scope_for(key, value)) if value.present?
+ end
+ scope
+ end
+
+ private
+
+ def scope_for(key, value)
+ case key.to_s
+ when 'domain_name'
+ Account.matches_domain(value)
+ else
+ raise "Unknown filter: #{key}"
+ end
+ end
+end
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
@@ -1,6 +1,16 @@
- content_for :page_title do
= t('admin.instances.title')
+= form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
+ .fields-group
+ - %i(domain_name).each do |key|
+ .input.string.optional
+ = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}")
+
+ .actions
+ %button= t('admin.instances.search')
+ = link_to t('admin.instances.reset'), admin_instances_path, class: 'button negative'
+
.table-wrapper
%table.table
%thead