diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index 2c476bc2d..a0bc74479 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -52,7 +52,7 @@ module PostSets name = Tag.has_metatag?(tag_array, :favgroup) return nil unless is_single_tag? && name.present? - @favgroup ||= FavoriteGroup.find_by_name(name) + @favgroup ||= FavoriteGroup.find_by_name_or_id(name, CurrentUser.user) end def has_explicit? diff --git a/app/models/favorite_group.rb b/app/models/favorite_group.rb index 53dfc0521..38188e4db 100644 --- a/app/models/favorite_group.rb +++ b/app/models/favorite_group.rb @@ -11,22 +11,14 @@ class FavoriteGroup < ApplicationRecord array_attribute :post_ids, parse: /\d+/, cast: :to_i module SearchMethods - def for_creator(user_id) - where("favorite_groups.creator_id = ?", user_id) - end - def for_post(post_id) where_array_includes_any(:post_ids, [post_id]) end - def named(name) - where("lower(name) = ?", name.to_s.mb_chars.downcase.strip) - end - def name_matches(name) - name = name.tr(" ", "_") + name = normalize_name(name) name = "*#{name}*" unless name =~ /\*/ - where("name ilike ? escape E'\\\\'", name.to_escaped_for_sql_like) + where_ilike(:name, name) end def hide_private(user, params) @@ -70,14 +62,6 @@ class FavoriteGroup < ApplicationRecord extend SearchMethods - def self.name_to_id(name) - if name =~ /^\d+$/ - name.to_i - else - select_value_sql("SELECT id FROM favorite_groups WHERE lower(name) = ? AND creator_id = ?", name.to_s.mb_chars.downcase.tr(" ", "_"), CurrentUser.user.id).to_i - end - end - def creator_can_create_favorite_groups if creator.favorite_group_count >= creator.favorite_group_limit error = "You can only keep up to #{creator.favorite_group_limit} favorite groups." @@ -117,16 +101,18 @@ class FavoriteGroup < ApplicationRecord self.name = FavoriteGroup.normalize_name(name) end - def self.find_by_name(name) - if name =~ /^\d+$/ - where("id = ?", name.to_i).first - elsif name - where("lower(name) = ?", normalize_name(name).mb_chars.downcase).first + def self.find_by_name_or_id(name, user) + if name =~ /\A\d+\z/ + find_by(id: name) else - nil + user.favorite_groups.where_iequals(:name, normalize_name(name)).first end end + def self.find_by_name_or_id!(name, user) + find_by_name_or_id(name, user) or raise ActiveRecord::RecordNotFound + end + def strip_name self.name = name.to_s.strip end diff --git a/app/models/post.rb b/app/models/post.rb index 0704236b4..6b7326079 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -820,20 +820,14 @@ class Post < ApplicationRecord post.update!(parent_id: id) end - when /^-favgroup:(\d+)$/i - favgroup = FavoriteGroup.where("id = ?", $1.to_i).for_creator(CurrentUser.user.id).first - favgroup&.remove!(self) - when /^-favgroup:(.+)$/i - favgroup = FavoriteGroup.named($1).for_creator(CurrentUser.user.id).first + favgroup = FavoriteGroup.find_by_name_or_id!($1, CurrentUser.user) + raise User::PrivilegeError unless favgroup.editable_by?(CurrentUser.user) favgroup&.remove!(self) - when /^favgroup:(\d+)$/i - favgroup = FavoriteGroup.where("id = ?", $1.to_i).for_creator(CurrentUser.user.id).first - favgroup&.add!(self) - when /^favgroup:(.+)$/i - favgroup = FavoriteGroup.named($1).for_creator(CurrentUser.user.id).first + favgroup = FavoriteGroup.find_by_name_or_id!($1, CurrentUser.user) + raise User::PrivilegeError unless favgroup.editable_by?(CurrentUser.user) favgroup&.add!(self) end diff --git a/app/models/tag.rb b/app/models/tag.rb index 4c47daad2..1d42753bd 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -594,23 +594,15 @@ class Tag < ApplicationRecord q[:ordpool] = pool_id when "-favgroup" - favgroup_id = FavoriteGroup.name_to_id(g2) - favgroup = FavoriteGroup.find(favgroup_id) - - if !favgroup.viewable_by?(CurrentUser.user) - raise User::PrivilegeError.new - end + favgroup = FavoriteGroup.find_by_name_or_id!(g2, CurrentUser.user) + raise User::PrivilegeError unless favgroup.viewable_by?(CurrentUser.user) q[:favgroups_neg] ||= [] q[:favgroups_neg] << favgroup when "favgroup" - favgroup_id = FavoriteGroup.name_to_id(g2) - favgroup = FavoriteGroup.find(favgroup_id) - - if !favgroup.viewable_by?(CurrentUser.user) - raise User::PrivilegeError.new - end + favgroup = FavoriteGroup.find_by_name_or_id!(g2, CurrentUser.user) + raise User::PrivilegeError unless favgroup.viewable_by?(CurrentUser.user) q[:favgroups] ||= [] q[:favgroups] << favgroup