about summary refs log tree commit diff
path: root/app/models/tag_filter.rb
diff options
context:
space:
mode:
authormayaeh <mayaeh@marimo-net.org>2019-09-16 21:27:29 +0900
committerEugen Rochko <eugen@zeonfederated.com>2019-09-16 14:27:29 +0200
commitef0d22f232723be035e95bde13310d02bf1c127b (patch)
tree114a12ef4c032dda781ba112b44a0c8ab6de8afc /app/models/tag_filter.rb
parentb7420b8643b4028796d1bbd9443241f997957eb4 (diff)
Add search and sort functions to hashtag admin UI (#11829)
* Add search and sort functions to hashtag admin UI

* Move scope processing from tags_controller to tag_filter

* Fix based on method naming conventions

* Fixed not to get 500 errors for invalid requests
Diffstat (limited to 'app/models/tag_filter.rb')
-rw-r--r--app/models/tag_filter.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/app/models/tag_filter.rb b/app/models/tag_filter.rb
new file mode 100644
index 000000000..8921e186b
--- /dev/null
+++ b/app/models/tag_filter.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class TagFilter
+  attr_reader :params
+
+  def initialize(params)
+    @params = params
+  end
+
+  def results
+    scope = Tag.unscoped
+
+    params.each do |key, value|
+      next if key.to_s == 'page'
+
+      scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
+    end
+
+    scope.order(id: :desc)
+  end
+
+  private
+
+  def scope_for(key, value)
+    case key.to_s
+    when 'directory'
+      Tag.discoverable
+    when 'reviewed'
+      Tag.reviewed.order(reviewed_at: :desc)
+    when 'unreviewed'
+      Tag.unreviewed
+    when 'pending_review'
+      Tag.pending_review.order(requested_review_at: :desc)
+    when 'popular'
+      Tag.order('max_score DESC NULLS LAST')
+    when 'active'
+      Tag.order('last_status_at DESC NULLS LAST')
+    when 'name'
+      Tag.matches_name(value)
+    else
+      raise "Unknown filter: #{key}"
+    end
+  end
+end