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:
@@ -52,7 +52,7 @@ module PostSets
|
|||||||
name = Tag.has_metatag?(tag_array, :favgroup)
|
name = Tag.has_metatag?(tag_array, :favgroup)
|
||||||
return nil unless is_single_tag? && name.present?
|
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
|
end
|
||||||
|
|
||||||
def has_explicit?
|
def has_explicit?
|
||||||
|
|||||||
@@ -11,22 +11,14 @@ class FavoriteGroup < ApplicationRecord
|
|||||||
array_attribute :post_ids, parse: /\d+/, cast: :to_i
|
array_attribute :post_ids, parse: /\d+/, cast: :to_i
|
||||||
|
|
||||||
module SearchMethods
|
module SearchMethods
|
||||||
def for_creator(user_id)
|
|
||||||
where("favorite_groups.creator_id = ?", user_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def for_post(post_id)
|
def for_post(post_id)
|
||||||
where_array_includes_any(:post_ids, [post_id])
|
where_array_includes_any(:post_ids, [post_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def named(name)
|
|
||||||
where("lower(name) = ?", name.to_s.mb_chars.downcase.strip)
|
|
||||||
end
|
|
||||||
|
|
||||||
def name_matches(name)
|
def name_matches(name)
|
||||||
name = name.tr(" ", "_")
|
name = normalize_name(name)
|
||||||
name = "*#{name}*" unless name =~ /\*/
|
name = "*#{name}*" unless name =~ /\*/
|
||||||
where("name ilike ? escape E'\\\\'", name.to_escaped_for_sql_like)
|
where_ilike(:name, name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def hide_private(user, params)
|
def hide_private(user, params)
|
||||||
@@ -70,14 +62,6 @@ class FavoriteGroup < ApplicationRecord
|
|||||||
|
|
||||||
extend SearchMethods
|
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
|
def creator_can_create_favorite_groups
|
||||||
if creator.favorite_group_count >= creator.favorite_group_limit
|
if creator.favorite_group_count >= creator.favorite_group_limit
|
||||||
error = "You can only keep up to #{creator.favorite_group_limit} favorite groups."
|
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)
|
self.name = FavoriteGroup.normalize_name(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.find_by_name(name)
|
def self.find_by_name_or_id(name, user)
|
||||||
if name =~ /^\d+$/
|
if name =~ /\A\d+\z/
|
||||||
where("id = ?", name.to_i).first
|
find_by(id: name)
|
||||||
elsif name
|
|
||||||
where("lower(name) = ?", normalize_name(name).mb_chars.downcase).first
|
|
||||||
else
|
else
|
||||||
nil
|
user.favorite_groups.where_iequals(:name, normalize_name(name)).first
|
||||||
end
|
end
|
||||||
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
|
def strip_name
|
||||||
self.name = name.to_s.strip
|
self.name = name.to_s.strip
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -820,20 +820,14 @@ class Post < ApplicationRecord
|
|||||||
post.update!(parent_id: id)
|
post.update!(parent_id: id)
|
||||||
end
|
end
|
||||||
|
|
||||||
when /^-favgroup:(\d+)$/i
|
|
||||||
favgroup = FavoriteGroup.where("id = ?", $1.to_i).for_creator(CurrentUser.user.id).first
|
|
||||||
favgroup&.remove!(self)
|
|
||||||
|
|
||||||
when /^-favgroup:(.+)$/i
|
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)
|
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
|
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)
|
favgroup&.add!(self)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -594,23 +594,15 @@ class Tag < ApplicationRecord
|
|||||||
q[:ordpool] = pool_id
|
q[:ordpool] = pool_id
|
||||||
|
|
||||||
when "-favgroup"
|
when "-favgroup"
|
||||||
favgroup_id = FavoriteGroup.name_to_id(g2)
|
favgroup = FavoriteGroup.find_by_name_or_id!(g2, CurrentUser.user)
|
||||||
favgroup = FavoriteGroup.find(favgroup_id)
|
raise User::PrivilegeError unless favgroup.viewable_by?(CurrentUser.user)
|
||||||
|
|
||||||
if !favgroup.viewable_by?(CurrentUser.user)
|
|
||||||
raise User::PrivilegeError.new
|
|
||||||
end
|
|
||||||
|
|
||||||
q[:favgroups_neg] ||= []
|
q[:favgroups_neg] ||= []
|
||||||
q[:favgroups_neg] << favgroup
|
q[:favgroups_neg] << favgroup
|
||||||
|
|
||||||
when "favgroup"
|
when "favgroup"
|
||||||
favgroup_id = FavoriteGroup.name_to_id(g2)
|
favgroup = FavoriteGroup.find_by_name_or_id!(g2, CurrentUser.user)
|
||||||
favgroup = FavoriteGroup.find(favgroup_id)
|
raise User::PrivilegeError unless favgroup.viewable_by?(CurrentUser.user)
|
||||||
|
|
||||||
if !favgroup.viewable_by?(CurrentUser.user)
|
|
||||||
raise User::PrivilegeError.new
|
|
||||||
end
|
|
||||||
|
|
||||||
q[:favgroups] ||= []
|
q[:favgroups] ||= []
|
||||||
q[:favgroups] << favgroup
|
q[:favgroups] << favgroup
|
||||||
|
|||||||
Reference in New Issue
Block a user