このコミットが含まれているのは:
2026-10-26 12:19:43 +09:00
コミット 3e8f209542
31個のファイルの変更、1676行の追加、394行の削除
+7 -54
ファイルの表示
@@ -449,24 +449,8 @@ class PostsController < ApplicationController
private
def tag_filter_references literals
raw = params[:tag_refs]
return nil if raw.blank?
references = JSON.parse(raw)
valid = references.is_a?(Array) && references.all? do |reference|
next false unless reference.is_a?(Hash) && reference['name'].is_a?(String)
ids = [reference['tag_id'], reference['external_tag_id']].compact
((ids.any? || reference['missing'] == true) &&
ids.all? { _1.is_a?(Integer) && _1.positive? } &&
(!reference.key?('missing') || (reference['missing'] == true && ids.empty?)) &&
(!reference.key?('negative') || [true, false].include?(reference['negative'])))
end
raise ActionController::BadRequest unless valid
return nil unless references.map { _1['name'] } == literals
references
rescue JSON::ParserError, TypeError
PostTagSearch.parse_references(params[:tag_refs], literals)
rescue ArgumentError, JSON::ParserError, TypeError
raise ActionController::BadRequest
end
@@ -482,17 +466,7 @@ class PostsController < ApplicationController
def filter_posts_by_tags locale, tag_names, match_type
references = tag_filter_references(tag_names)
literals = tag_names.each_with_index.map do |raw_name, index|
name = raw_name.sub(/\Anot:/i, '')
name = TagName.canonicalise(locale, name).first unless references
reference = references&.[](index)
negative = if reference&.key?('negative')
reference['negative']
else
raw_name.downcase.start_with?('not:')
end
{ name:, negative:, reference: }
end
literals = PostTagSearch.literals(locale, tag_names.join(' '), references:)
return Post.all if literals.empty?
@@ -523,31 +497,10 @@ class PostsController < ApplicationController
end
def tagged_post_ids_for locale, name, reference: nil
if reference
matches = Post.none
if reference['tag_id']
matches = matches.or(Post.where(id: PostTag.where(
tag_id: reference['tag_id']).select(:post_id)))
end
if reference['external_tag_id']
matches = matches.or(Post.where(id: PostExternalTag.where(
external_tag_id: reference['external_tag_id']).select(:post_id)))
end
return matches.select(:id)
end
posts_by_internal_tags =
Post
.joins(tags: :tag_names)
.where(tag_names: { language_code: locale.language_code, name: })
.select(:id)
posts_by_external_tags =
Post
.joins(:external_tags)
.where("CONCAT(external_tags.platform, ':', external_tags.name) = ?", name)
(posts_by_internal_tags + posts_by_external_tags).uniq(&:id)
internal, external = PostTagSearch.references(locale, { name:, reference: })
Post.where(id: PostTag.where(tag_id: Array(internal)).select(:post_id))
.or(Post.where(id: PostExternalTag.where(external_tag_id: Array(external))
.select(:post_id))).select(:id)
end
def sync_post_tags! post, desired_tags, sections