From 930817d077d181b860fc82386683fbc7017f5fa6 Mon Sep 17 00:00:00 2001 From: Codex Night Worker Date: Thu, 12 Nov 2026 19:13:32 +0900 Subject: [PATCH] AI: address issue #450 --- backend/app/controllers/posts_controller.rb | 35 ++----------------- .../tag_descriptions_controller.rb | 1 - .../app/controllers/tag_groups_controller.rb | 2 +- .../app/controllers/wiki_pages_controller.rb | 11 +++--- backend/app/models/history_access.rb | 23 ------------ backend/app/representations/tag_group_repr.rb | 1 - backend/app/representations/wiki_page_repr.rb | 1 - 7 files changed, 9 insertions(+), 65 deletions(-) diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index ba15e99..3929863 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -37,8 +37,6 @@ class PostsController < ApplicationController offset = (page - 1) * limit - needs_history_join = order[0] == 'updated_at' || updated_between.any?(&:present?) - q = filtered_posts(locale) .preload(:external_tags, :uploaded_user, :parents, :children, @@ -56,25 +54,9 @@ class PostsController < ApplicationController end q = q.where('posts.created_at >= ?', created_between[0]) if created_between[0] q = q.where('posts.created_at <= ?', created_between[1]) if created_between[1] + q = q.where('posts.updated_at >= ?', updated_between[0]) if updated_between[0] + q = q.where('posts.updated_at <= ?', updated_between[1]) if updated_between[1] count_scope = q - if needs_history_join - history_times = HistoryAccess.visible(PostVersion.all) - .select('post_id, MAX(created_at) AS latest_at').group(:post_id) - q = q.joins("LEFT JOIN (#{ history_times.to_sql }) history_times " + - 'ON history_times.post_id = posts.id') - updated_at_all_sql = 'GREATEST(posts.updated_at, ' + - 'COALESCE(history_times.latest_at, posts.updated_at))' - end - if updated_between[0] - q = q.where("#{ updated_at_all_sql } >= ?", updated_between[0]) - end - if updated_between[1] - q = q.where("#{ updated_at_all_sql } <= ?", updated_between[1]) - end - count_scope = q if updated_between.any?(&:present?) - if needs_history_join - q = q.select('posts.*', "#{ updated_at_all_sql } AS updated_at") - end sort_sql = case order[0] @@ -82,8 +64,6 @@ class PostsController < ApplicationController 'COALESCE(posts.original_created_before - INTERVAL 1 MINUTE,' + 'posts.original_created_from,' + 'posts.created_at) ' - when 'updated_at' - updated_at_all_sql else "posts.#{ order[0] }" end @@ -91,20 +71,11 @@ class PostsController < ApplicationController .limit(limit) .offset(offset) .to_a - latest_version_times = - if needs_history_join - { } - else - HistoryAccess.visible(PostVersion.where(post_id: posts.map(&:id))) - .group(:post_id).maximum(:created_at) - end count_scope = count_scope.except(:select, :order) render json: { posts: posts.map { |post| - updated_at = [post.updated_at, latest_version_times[post.id]].compact.max - PostRepr.base(post, language_code: locale.language_code) - .merge('updated_at' => updated_at).tap do |json| + PostRepr.base(post, language_code: locale.language_code).tap do |json| json['thumbnail'] = if post.thumbnail.attached? rails_storage_proxy_url(post.thumbnail, only_path: false) diff --git a/backend/app/controllers/tag_descriptions_controller.rb b/backend/app/controllers/tag_descriptions_controller.rb index 5c59226..dfbaa4f 100644 --- a/backend/app/controllers/tag_descriptions_controller.rb +++ b/backend/app/controllers/tag_descriptions_controller.rb @@ -49,7 +49,6 @@ class TagDescriptionsController < ApplicationController private def representation description - HistoryAccess.require_current!(description, TagDescriptionVersion) description.as_json(only: [ :tag_id, :language_code, diff --git a/backend/app/controllers/tag_groups_controller.rb b/backend/app/controllers/tag_groups_controller.rb index fc3ec26..1872f40 100644 --- a/backend/app/controllers/tag_groups_controller.rb +++ b/backend/app/controllers/tag_groups_controller.rb @@ -1,7 +1,7 @@ class TagGroupsController < ApplicationController def index locale = resolve_locale! - groups = HistoryAccess.current(TagGroup.all, TagGroupVersion).includes(:created_by_user, :updated_by_user).order(:id) + groups = TagGroup.includes(:created_by_user, :updated_by_user).order(:id) render json: TagGroupRepr.many(locale, groups.to_a) end diff --git a/backend/app/controllers/wiki_pages_controller.rb b/backend/app/controllers/wiki_pages_controller.rb index 9ac9992..4ce4402 100644 --- a/backend/app/controllers/wiki_pages_controller.rb +++ b/backend/app/controllers/wiki_pages_controller.rb @@ -8,12 +8,11 @@ class WikiPagesController < ApplicationController title = params[:title].to_s.strip descriptions = - HistoryAccess.current(TagDescription.all, TagDescriptionVersion) - .where(language_code: locale.language_code) + TagDescription.where(language_code: locale.language_code) .includes(tag: :tag_names) descriptions = descriptions.order(updated_at: :desc, id: :asc) - tag_groups = HistoryAccess.current(TagGroup.all, TagGroupVersion).order(updated_at: :desc, id: :asc) + tag_groups = TagGroup.order(updated_at: :desc, id: :asc) if title.present? pattern = "%#{ ApplicationRecord.sanitize_sql_like(title) }%" descriptions = @@ -41,13 +40,13 @@ class WikiPagesController < ApplicationController return head :not_found unless language.is_a?(String) return head :not_found unless Language.exists?(code: language) - names = HistoryAccess.current(TagDescription.all, TagDescriptionVersion).joins(tag: :tag_names) + names = TagDescription.joins(tag: :tag_names) .where(language_code: locale.language_code, tag_names: { language_code: language }) .pluck('tag_descriptions.tag_id', 'tag_descriptions.id', 'tag_names.name') candidates = names.map do |tag_id, description_id, name| WikiPageRepr.autolink_tag(locale, tag_id:, description_id:, name:, language:) end - candidates.concat(HistoryAccess.current(TagGroup.all, TagGroupVersion).order(:id).pluck(:id, :name).map do |id, name| + candidates.concat(TagGroup.order(:id).pluck(:id, :name).map do |id, name| WikiPageRepr.autolink_group(locale, id:, name:, language:) end) render json: candidates @@ -411,7 +410,7 @@ class WikiPagesController < ApplicationController end def tag_description_by_title locale, title - HistoryAccess.current(TagDescription.all, TagDescriptionVersion).joins(tag: :tag_names) + TagDescription.joins(tag: :tag_names) .find_by(language_code: locale.language_code, tag_names: { language_code: locale.language_code, name: title }) end diff --git a/backend/app/models/history_access.rb b/backend/app/models/history_access.rb index 96203da..6e6ae3c 100644 --- a/backend/app/models/history_access.rb +++ b/backend/app/models/history_access.rb @@ -147,29 +147,6 @@ class HistoryAccess < ActiveSupport::CurrentAttributes scope.where(Arel.sql(sql(scope.klass, row))) end - def self.current(scope, version_model) - return scope if admin? - - table = scope.klass.table_name - keys = KEYS.fetch(version_model.table_name) - matches = keys.map do |key| - column = scope.klass.column_names.include?(key) ? key : 'id' - "current_snapshot.#{ key } = #{ table }.#{ column }" - end.join(' AND ') - boundary = "#{ matches } AND current_snapshot.version_no >= #{ table }.version_no " + - "AND current_snapshot.event_type = 'discard'" - scope = scope.where(Arel.sql("NOT EXISTS (SELECT 1 FROM #{ version_model.table_name } " + - "current_snapshot WHERE #{ boundary })")) - condition = "#{ matches } AND current_snapshot.version_no = #{ table }.version_no" - scope.where(Arel.sql("NOT EXISTS (SELECT 1 FROM #{ version_model.table_name } " + - "current_snapshot WHERE #{ condition } AND NOT (#{ sql(version_model, 'current_snapshot') }))")) - end - - def self.require_current!(record, version_model) - return if admin? - raise Forbidden unless current(record.class.where(id: record.id), version_model).exists? - end - def self.blob_visible?(blob, seen = []) return true if admin? return false if seen.include?(blob.id) diff --git a/backend/app/representations/tag_group_repr.rb b/backend/app/representations/tag_group_repr.rb index 94c9181..9e30d8b 100644 --- a/backend/app/representations/tag_group_repr.rb +++ b/backend/app/representations/tag_group_repr.rb @@ -44,7 +44,6 @@ module TagGroupRepr end def one locale, group - HistoryAccess.require_current!(group, TagGroupVersion) many(locale, [group]).first end diff --git a/backend/app/representations/wiki_page_repr.rb b/backend/app/representations/wiki_page_repr.rb index 5e8abb1..3a4aa21 100644 --- a/backend/app/representations/wiki_page_repr.rb +++ b/backend/app/representations/wiki_page_repr.rb @@ -5,7 +5,6 @@ module WikiPageRepr module_function def tag_description locale, description - HistoryAccess.require_current!(description, TagDescriptionVersion) tag = description.tag { 'id' => description.id,