From 83a0cb0a7185055283a686b42163d76cfe2b8c51 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 17 Feb 2020 02:10:08 -0600 Subject: [PATCH] models: refactor class methods into scopes. --- app/models/comment.rb | 11 +++-------- app/models/forum_post.rb | 6 ++---- app/models/forum_topic.rb | 6 ++---- app/models/note.rb | 6 ++---- app/models/pool.rb | 21 +++++---------------- app/models/post.rb | 38 ++++++++++---------------------------- app/models/post_appeal.rb | 16 ++++------------ app/models/post_flag.rb | 20 ++++---------------- app/models/tag.rb | 11 +++-------- app/models/upload.rb | 10 ++-------- app/models/user.rb | 20 ++++++-------------- app/models/wiki_page.rb | 6 ++---- 12 files changed, 45 insertions(+), 126 deletions(-) diff --git a/app/models/comment.rb b/app/models/comment.rb index ea9cd037f..16a4689f8 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -24,15 +24,10 @@ class Comment < ApplicationRecord :body => ->(user_name) {"@#{creator.name} mentioned you in a \"comment\":/posts/#{post_id}#comment-#{id} on post ##{post_id}:\n\n[quote]\n#{DText.extract_mention(body, "@" + user_name)}\n[/quote]\n"} ) + scope :deleted, -> { where(is_deleted: true) } + scope :undeleted, -> { where(is_deleted: false) } + module SearchMethods - def deleted - where("comments.is_deleted = true") - end - - def undeleted - where("comments.is_deleted = false") - end - def search(params) q = super diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index 5ba970f5e..2a03e1586 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -35,15 +35,13 @@ class ForumPost < ApplicationRecord :body => ->(user_name) {%{@#{creator.name} mentioned you in topic ##{topic_id} ("#{topic.title}":[/forum_topics/#{topic_id}?page=#{forum_topic_page}]):\n\n[quote]\n#{DText.extract_mention(body, "@" + user_name)}\n[/quote]\n}} ) + scope :active, -> { where(is_deleted: false) } + module SearchMethods def topic_title_matches(title) where(topic_id: ForumTopic.search(title_matches: title).select(:id)) end - def active - where("forum_posts.is_deleted = false") - end - def permitted where(topic_id: ForumTopic.permitted) end diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index 720d5a7c8..70f0e6fb7 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -31,6 +31,8 @@ class ForumTopic < ApplicationRecord ModAction.log("locked forum topic ##{id} (title: #{title})", :forum_topic_lock) end + scope :active, -> { where(is_deleted: false) } + module CategoryMethods extend ActiveSupport::Concern @@ -50,10 +52,6 @@ class ForumTopic < ApplicationRecord end module SearchMethods - def active - where(is_deleted: false) - end - def permitted where("min_level <= ?", CurrentUser.level) end diff --git a/app/models/note.rb b/app/models/note.rb index e8348312e..9dd89362e 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -10,11 +10,9 @@ class Note < ApplicationRecord after_save :create_version validate :validate_post_is_not_locked - module SearchMethods - def active - where("is_active = TRUE") - end + scope :active, -> { where(is_active: true) } + module SearchMethods def search(params) q = super diff --git a/app/models/pool.rb b/app/models/pool.rb index 5c84db978..e9d0e97dc 100644 --- a/app/models/pool.rb +++ b/app/models/pool.rb @@ -16,23 +16,12 @@ class Pool < ApplicationRecord api_attributes including: [:post_count] + scope :deleted, -> { where(is_deleted: true) } + scope :undeleted, -> { where(is_deleted: false) } + scope :series, -> { where(category: "series") } + scope :collection, -> { where(category: "collection") } + module SearchMethods - def deleted - where("pools.is_deleted = true") - end - - def undeleted - where("pools.is_deleted = false") - end - - def series - where("pools.category = ?", "series") - end - - def collection - where("pools.category = ?", "collection") - end - def name_matches(name) name = normalize_name_for_search(name) name = "*#{name}*" unless name =~ /\*/ diff --git a/app/models/post.rb b/app/models/post.rb index 15fac0b94..e0e7d87b4 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -59,6 +59,16 @@ class Post < ApplicationRecord attr_accessor :old_tag_string, :old_parent_id, :old_source, :old_rating, :has_constraints, :disable_versioning, :view_count + scope :pending, -> { where(is_pending: true) } + scope :flagged, -> { where(is_flagged: true) } + scope :pending_or_flagged, -> { pending.or(flagged) } + + scope :undeleted, -> { where(is_deleted: false) } + scope :unflagged, -> { where(is_flagged: false) } + scope :deleted, -> { where(is_deleted: true) } + scope :has_notes, -> { where.not(last_noted_at: nil) } + scope :for_user, ->(user_id) { where(uploader_id: user_id) } + if PostVersion.enabled? has_many :versions, -> { Rails.env.test? ? order("post_versions.updated_at ASC, post_versions.id ASC") : order("post_versions.updated_at ASC") }, class_name: "PostVersion", dependent: :destroy end @@ -1520,34 +1530,6 @@ class Post < ApplicationRecord from(relation.arel.as("posts")) end - def pending - where(is_pending: true) - end - - def flagged - where(is_flagged: true) - end - - def pending_or_flagged - pending.or(flagged) - end - - def undeleted - where("is_deleted = ?", false) - end - - def deleted - where("is_deleted = ?", true) - end - - def has_notes - where("last_noted_at is not null") - end - - def for_user(user_id) - where("uploader_id = ?", user_id) - end - def available_for_moderation(hidden = false, user = CurrentUser.user) return none if user.is_anonymous? diff --git a/app/models/post_appeal.rb b/app/models/post_appeal.rb index 5241a3dbd..c799bc9a8 100644 --- a/app/models/post_appeal.rb +++ b/app/models/post_appeal.rb @@ -10,19 +10,11 @@ class PostAppeal < ApplicationRecord validate :validate_creator_is_not_limited validates_uniqueness_of :creator_id, :scope => :post_id, :message => "have already appealed this post" + scope :resolved, -> { where(post: Post.undeleted.unflagged) } + scope :unresolved, -> { where(post: Post.deleted.or(Post.flagged)) } + scope :recent, -> { where("post_appeals.created_at >= ?", 1.day.ago) } + module SearchMethods - def resolved - joins(:post).where("posts.is_deleted = false and posts.is_flagged = false") - end - - def unresolved - joins(:post).where("posts.is_deleted = true or posts.is_flagged = true") - end - - def recent - where("created_at >= ?", 1.day.ago) - end - def search(params) q = super q = q.search_attributes(params, :creator, :post, :reason) diff --git a/app/models/post_flag.rb b/app/models/post_flag.rb index 6930bf316..291b4fcee 100644 --- a/app/models/post_flag.rb +++ b/app/models/post_flag.rb @@ -21,6 +21,10 @@ class PostFlag < ApplicationRecord scope :by_users, -> { where.not(creator: User.system) } scope :by_system, -> { where(creator: User.system) } scope :in_cooldown, -> { by_users.where("created_at >= ?", COOLDOWN_PERIOD.ago) } + scope :resolved, -> { where(is_resolved: true) } + scope :unresolved, -> { where(is_resolved: false) } + scope :recent, -> { where("post_flags.created_at >= ?", 1.day.ago) } + scope :old, -> { where("post_flags.created_at <= ?", 3.days.ago) } module SearchMethods def duplicate @@ -31,22 +35,6 @@ class PostFlag < ApplicationRecord where("to_tsvector('english', post_flags.reason) @@ to_tsquery('!dup & !duplicate & !sample & !smaller')") end - def resolved - where("is_resolved = ?", true) - end - - def unresolved - where("is_resolved = ?", false) - end - - def recent - where("created_at >= ?", 1.day.ago) - end - - def old - where("created_at <= ?", 3.days.ago) - end - def search(params) q = super diff --git a/app/models/tag.rb b/app/models/tag.rb index 79214498e..f8ea67f69 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -58,6 +58,9 @@ class Tag < ApplicationRecord before_save :update_category_cache, if: :category_changed? before_save :update_category_post_counts, if: :category_changed? + scope :empty, -> { where("tags.post_count <= 0") } + scope :nonempty, -> { where("tags.post_count > 0") } + module ApiMethods def to_legacy_json return { @@ -797,14 +800,6 @@ class Tag < ApplicationRecord end module SearchMethods - def empty - where("tags.post_count <= 0") - end - - def nonempty - where("tags.post_count > 0") - end - # ref: https://www.postgresql.org/docs/current/static/pgtrgm.html#idm46428634524336 def order_similarity(name) # trunc(3 * sim) reduces the similarity score from a range of 0.0 -> 1.0 to just 0, 1, or 2. diff --git a/app/models/upload.rb b/app/models/upload.rb index ed19470a8..33c540aae 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -68,7 +68,9 @@ class Upload < ApplicationRecord after_destroy_commit :delete_files + scope :pending, -> { where(status: "pending") } scope :preprocessed, -> { where(status: "preprocessed") } + scope :uploaded_by, ->(user_id) { where(uploader_id: user_id) } def initialize_attributes self.uploader_id = CurrentUser.id @@ -180,14 +182,6 @@ class Upload < ApplicationRecord end module SearchMethods - def uploaded_by(user_id) - where("uploader_id = ?", user_id) - end - - def pending - where(:status => "pending") - end - def search(params) q = super diff --git a/app/models/user.rb b/app/models/user.rb index 48b3b7b9e..b8abd4d94 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -129,6 +129,12 @@ class User < ApplicationRecord enum theme: { light: 0, dark: 100 }, _suffix: true + # UserDeletion#rename renames deleted users to `user_<1234>~`. Tildes + # are appended if the username is taken. + scope :deleted, -> { where("name ~ 'user_[0-9]+~*'") } + scope :undeleted, -> { where("name !~ 'user_[0-9]+~*'") } + scope :admins, -> { where(level: Levels::ADMIN) } + module BanMethods def validate_ip_addr_is_not_banned if IpBan.is_banned?(CurrentUser.ip_addr) @@ -635,20 +641,6 @@ class User < ApplicationRecord end module SearchMethods - def admins - where("level = ?", Levels::ADMIN) - end - - # UserDeletion#rename renames deleted users to `user_<1234>~`. Tildes - # are appended if the username is taken. - def deleted - where("name ~ 'user_[0-9]+~*'") - end - - def undeleted - where("name !~ 'user_[0-9]+~*'") - end - def with_email(email) if email.blank? where("FALSE") diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 4f8e25b44..1f7d45021 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -21,6 +21,8 @@ class WikiPage < ApplicationRecord api_attributes including: [:category_name] + scope :active, -> { where(is_deleted: false) } + module SearchMethods def find_by_id_or_title(id) if id =~ /\A\d+\z/ @@ -34,10 +36,6 @@ class WikiPage < ApplicationRecord where(title: normalize_title(title)) end - def active - where("is_deleted = false") - end - def other_names_include(name) name = normalize_other_name(name) subquery = WikiPage.from("unnest(other_names) AS other_name").where_iequals("other_name", name)