diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 183b951d6..e51f32e01 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -1,6 +1,29 @@ class ApplicationRecord < ActiveRecord::Base self.abstract_class = true + concerning :SearchMethods do + class_methods do + # range: "5", ">5", "<5", ">=5", "<=5", "5..10", "5,6,7" + def attribute_matches(attribute, range) + return all if range.blank? + + column = column_for_attribute(attribute) + qualified_column = "#{table_name}.#{column.name}" + parsed_range = Tag.parse_helper(range, :integer) + + PostQueryBuilder.new(nil).add_range_relation(parsed_range, qualified_column, self) + end + + def search(params = {}) + params ||= {} + + q = all + q = q.attribute_matches(:id, params[:id]) + q + end + end + end + module ApiMethods extend ActiveSupport::Concern diff --git a/app/models/artist.rb b/app/models/artist.rb index 142dc99dc..2aa4361c9 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -426,7 +426,7 @@ class Artist < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? case params[:name] @@ -496,10 +496,6 @@ class Artist < ApplicationRecord q = q.unbanned end - if params[:id].present? - q = q.where("artists.id in (?)", params[:id].split(",").map(&:to_i)) - end - if params[:creator_name].present? q = q.where("artists.creator_id = (select _.id from users _ where lower(_.name) = ?)", params[:creator_name].tr(" ", "_").mb_chars.downcase) end diff --git a/app/models/artist_commentary.rb b/app/models/artist_commentary.rb index 9a8d6c691..1f7e436bf 100644 --- a/app/models/artist_commentary.rb +++ b/app/models/artist_commentary.rb @@ -32,7 +32,7 @@ class ArtistCommentary < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:text_matches].present? diff --git a/app/models/artist_version.rb b/app/models/artist_version.rb index 86e4998a7..6bdc5acf9 100644 --- a/app/models/artist_version.rb +++ b/app/models/artist_version.rb @@ -14,7 +14,7 @@ class ArtistVersion < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:name].present? diff --git a/app/models/bulk_update_request.rb b/app/models/bulk_update_request.rb index 3378fa148..7649185f3 100644 --- a/app/models/bulk_update_request.rb +++ b/app/models/bulk_update_request.rb @@ -23,11 +23,7 @@ class BulkUpdateRequest < ApplicationRecord module SearchMethods def search(params = {}) - q = where("true") - - if params[:id].present? - q = q.where("id in (?)", params[:id].split(",").map(&:to_i)) - end + q = super if params[:user_name].present? q = q.where(user_id: User.name_to_id(params[:user_name])) diff --git a/app/models/comment.rb b/app/models/comment.rb index 7f71dcd72..04abff0f0 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -92,16 +92,12 @@ class Comment < ApplicationRecord end def search(params) - q = where("true") + q = super if params[:body_matches].present? q = q.body_matches(params[:body_matches]) end - if params[:id].present? - q = q.where("id in (?)", params[:id].split(",").map(&:to_i)) - end - if params[:post_id].present? q = q.where("post_id in (?)", params[:post_id].split(",").map(&:to_i)) end diff --git a/app/models/dmail.rb b/app/models/dmail.rb index 0bfcb7eb0..80abbb54a 100644 --- a/app/models/dmail.rb +++ b/app/models/dmail.rb @@ -186,7 +186,7 @@ class Dmail < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:title_matches].present? diff --git a/app/models/favorite_group.rb b/app/models/favorite_group.rb index 2d87845f3..6b0e405dc 100644 --- a/app/models/favorite_group.rb +++ b/app/models/favorite_group.rb @@ -34,7 +34,7 @@ class FavoriteGroup < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:creator_id].present? diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index 38c4fffe8..2160aeb65 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -65,7 +65,8 @@ class ForumPost < ApplicationRecord end def search(params) - q = permitted + q = super + q = q.permitted return q if params.blank? if params[:creator_id].present? diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index 30fa4ef2d..061714589 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -73,11 +73,8 @@ class ForumTopic < ApplicationRecord end def search(params) - q = permitted - - if params[:id].present? - q = q.where(id: params[:id].split(",").map(&:to_i)) - end + q = super + q = q.permitted if params[:mod_only].present? q = q.where("min_level >= ?", MIN_LEVELS[:Moderator]) diff --git a/app/models/note.rb b/app/models/note.rb index a20371366..6c24490df 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -42,7 +42,7 @@ class Note < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:body_matches].present? diff --git a/app/models/pool.rb b/app/models/pool.rb index d712d282f..d0f461d82 100644 --- a/app/models/pool.rb +++ b/app/models/pool.rb @@ -50,17 +50,13 @@ class Pool < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:name_matches].present? q = q.name_matches(params[:name_matches]) end - if params[:id].present? - q = q.where("pools.id in (?)", params[:id].split(",")) - end - if params[:description_matches].present? q = q.where("lower(pools.description) like ? escape E'\\\\'", "%" + params[:description_matches].mb_chars.downcase.to_escaped_for_sql_like + "%") end diff --git a/app/models/pool_archive.rb b/app/models/pool_archive.rb index 35ef110f4..c2d89635f 100644 --- a/app/models/pool_archive.rb +++ b/app/models/pool_archive.rb @@ -15,7 +15,7 @@ class PoolArchive < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:updater_id].present? diff --git a/app/models/pool_version.rb b/app/models/pool_version.rb index f0fa7a596..3e0dcf669 100644 --- a/app/models/pool_version.rb +++ b/app/models/pool_version.rb @@ -13,7 +13,7 @@ class PoolVersion < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:updater_id].present? diff --git a/app/models/post_appeal.rb b/app/models/post_appeal.rb index c8c465052..d6d5ad676 100644 --- a/app/models/post_appeal.rb +++ b/app/models/post_appeal.rb @@ -44,7 +44,8 @@ class PostAppeal < ApplicationRecord end def search(params) - q = order("post_appeals.id desc") + q = super + q = q.order("post_appeals.id desc") return q if params.blank? if params[:reason_matches].present? diff --git a/app/models/post_archive.rb b/app/models/post_archive.rb index abdc7f98f..f37f4ffb3 100644 --- a/app/models/post_archive.rb +++ b/app/models/post_archive.rb @@ -26,7 +26,7 @@ class PostArchive < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:updater_name].present? diff --git a/app/models/post_flag.rb b/app/models/post_flag.rb index d573d399d..1ace32654 100644 --- a/app/models/post_flag.rb +++ b/app/models/post_flag.rb @@ -66,7 +66,8 @@ class PostFlag < ApplicationRecord end def search(params) - q = order("post_flags.id desc") + q = super + q = q.order("post_flags.id desc") return q if params.blank? if params[:reason_matches].present? diff --git a/app/models/post_replacement.rb b/app/models/post_replacement.rb index 347fd6eb2..e92cac981 100644 --- a/app/models/post_replacement.rb +++ b/app/models/post_replacement.rb @@ -89,7 +89,7 @@ class PostReplacement < ApplicationRecord end def search(params = {}) - q = all + q = super if params[:creator_id].present? q = q.where(creator_id: params[:creator_id].split(",").map(&:to_i)) @@ -99,10 +99,6 @@ class PostReplacement < ApplicationRecord q = q.where(creator_id: User.name_to_id(params[:creator_name])) end - if params[:id].present? - q = q.where(id: params[:id].split(",").map(&:to_i)) - end - if params[:post_id].present? q = q.where(post_id: params[:post_id].split(",").map(&:to_i)) end diff --git a/app/models/post_version.rb b/app/models/post_version.rb index 2f952768e..be1427c1d 100644 --- a/app/models/post_version.rb +++ b/app/models/post_version.rb @@ -14,7 +14,7 @@ class PostVersion < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:updater_name].present? diff --git a/app/models/tag.rb b/app/models/tag.rb index cf97530ef..d9e36a686 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -838,7 +838,7 @@ class Tag < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:fuzzy_name_matches].present? diff --git a/app/models/tag_relationship.rb b/app/models/tag_relationship.rb index 8a9be2780..99251ae69 100644 --- a/app/models/tag_relationship.rb +++ b/app/models/tag_relationship.rb @@ -73,11 +73,7 @@ class TagRelationship < ApplicationRecord end def search(params) - q = all - - if params[:id].present? - q = q.where(id: params[:id].split(",").map(&:to_i)) - end + q = super if params[:name_matches].present? q = q.name_matches(params[:name_matches]) diff --git a/app/models/tag_subscription.rb b/app/models/tag_subscription.rb index a9e25d72f..4cedc831e 100644 --- a/app/models/tag_subscription.rb +++ b/app/models/tag_subscription.rb @@ -39,7 +39,7 @@ class TagSubscription < ApplicationRecord end def search(params) - q = where("true") + q = super params = {} if params.blank? if params[:creator_id] diff --git a/app/models/upload.rb b/app/models/upload.rb index 0115f4c46..08f020f5b 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -495,7 +495,7 @@ class Upload < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:uploader_id].present? diff --git a/app/models/user.rb b/app/models/user.rb index be950b7f8..43ae19288 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -813,7 +813,7 @@ class User < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:name].present? @@ -836,10 +836,6 @@ class User < ApplicationRecord q = q.where("level = ?", params[:level].to_i) end - if params[:id].present? - q = q.where("id in (?)", params[:id].split(",").map(&:to_i)) - end - bitprefs_length = BOOLEAN_ATTRIBUTES.length bitprefs_include = nil bitprefs_exclude = nil diff --git a/app/models/user_feedback.rb b/app/models/user_feedback.rb index c8d8c787b..71c6da2d2 100644 --- a/app/models/user_feedback.rb +++ b/app/models/user_feedback.rb @@ -44,7 +44,7 @@ class UserFeedback < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:user_id].present? diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 7b1c742ba..5e9943b9a 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -60,7 +60,7 @@ class WikiPage < ApplicationRecord end def search(params = {}) - q = where("true") + q = super params = {} if params.blank? if params[:title].present? diff --git a/app/models/wiki_page_version.rb b/app/models/wiki_page_version.rb index 65fb70f56..52c02928d 100644 --- a/app/models/wiki_page_version.rb +++ b/app/models/wiki_page_version.rb @@ -11,7 +11,7 @@ class WikiPageVersion < ApplicationRecord end def search(params) - q = where("true") + q = super return q if params.blank? if params[:updater_id].present? diff --git a/test/unit/application_record.rb b/test/unit/application_record.rb new file mode 100644 index 000000000..350c4e30c --- /dev/null +++ b/test/unit/application_record.rb @@ -0,0 +1,19 @@ +require 'test_helper' + +class ApplicationRecordTest < ActiveSupport::TestCase + setup do + @tags = FactoryGirl.create_list(:tag, 3, post_count: 1) + end + + context "ApplicationRecord#search" do + should "support the id param" do + assert_equal([@tags.first], Tag.search(id: @tags.first.id)) + end + + should "support ranges in the id param" do + assert_equal(@tags.reverse, Tag.search(id: ">=1")) + assert_equal(@tags.reverse, Tag.search(id: "#{@tags[0].id}..#{@tags[2].id}")) + assert_equal(@tags.reverse, Tag.search(id: @tags.map(&:id).join(","))) + end + end +end