favgroups: unify find by name methods.

Unify the `name_to_id`, `named`, and `find_by_name` methods into a
single `find_by_name_or_id` method that has consistent behavior in how
names are normalized.
This commit is contained in:
evazion
2020-01-17 13:25:15 -06:00
parent d461bb2ad0
commit e6ffdfdf81
4 changed files with 19 additions and 47 deletions

View File

@@ -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?

View File

@@ -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

View File

@@ -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

View File

@@ -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