From b5b5391c8e455e283d75ababf44b91919a334219 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Wed, 5 Aug 2026 12:43:33 +0900 Subject: [PATCH] #354 --- .../app/controllers/application_controller.rb | 7 ++++ .../controllers/post_versions_controller.rb | 39 ++++++------------- backend/app/controllers/posts_controller.rb | 4 +- backend/app/models/post.rb | 25 +++++++++--- 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/backend/app/controllers/application_controller.rb b/backend/app/controllers/application_controller.rb index 42adc75..95ec17a 100644 --- a/backend/app/controllers/application_controller.rb +++ b/backend/app/controllers/application_controller.rb @@ -85,4 +85,11 @@ class ApplicationController < ActionController::API base_errors: }, status: end + + def normalise_json value + return nil if value.nil? + return JSON.parse(value) if value.is_a?(String) + + value + end end diff --git a/backend/app/controllers/post_versions_controller.rb b/backend/app/controllers/post_versions_controller.rb index a04abf2..0c6f632 100644 --- a/backend/app/controllers/post_versions_controller.rb +++ b/backend/app/controllers/post_versions_controller.rb @@ -1,7 +1,7 @@ class PostVersionsController < ApplicationController def index post_id = params[:post].presence - tag_id = params[:tag].presence + tag_id = params[:tag].presence&.to_i page = (params[:page].presence || 1).to_i limit = (params[:limit].presence || 20).to_i @@ -10,12 +10,6 @@ class PostVersionsController < ApplicationController offset = (page - 1) * limit - tag_name = - if tag_id - TagName.joins(:tag).find_by(tag: { id: tag_id }) - end - return render json: { versions: [], count: 0 } if tag_id && tag_name.blank? - q = PostVersion.joins(<<~SQL.squish) LEFT JOIN post_versions prev @@ -32,10 +26,10 @@ class PostVersionsController < ApplicationController 'prev.original_created_from AS prev_original_created_from', 'prev.original_created_before AS prev_original_created_before') q = q.where('post_versions.post_id = ?', post_id) if post_id - if tag_name - escaped = ActiveRecord::Base.sanitize_sql_like(tag_name.name) - q = q.where(("JSON_CONTAINTS(post_version.tags_json, JSON_OBJECT('id', :tag_id)) " + - "OR JSON_CONTAINS(prev.tags_json, JSON_OBJECT('id', :tag_id))"), tag_id:) + if tag_id + q = q.where(("JSON_CONTAINS(post_versions.tags_json, JSON_OBJECT('id', :tag_id)) " + + "OR JSON_CONTAINS(prev.tags_json, JSON_OBJECT('id', :tag_id))"), + tag_id:) end count = q.except(:select, :order, :limit, :offset).count @@ -49,24 +43,17 @@ class PostVersionsController < ApplicationController private - def tag_literal tag - sections = tag.fetch('sections', []).map do |sec| - begin_ms = sec.fetch('begin_ms') - end_ms = sec['end_ms'] - - "[#{ Post.ms_to_time(begin_ms) }-#{ end_ms ? Post.ms_to_time(end_ms) : '' }]" - end - - "#{ tag.fetch('name') }#{ sections.join }" - end - def serialise_versions rows user_ids = rows.map(&:created_by_user_id).compact.uniq users_by_id = User.where(id: user_ids).pluck(:id, :name).to_h rows.map do |row| - cur_tags = split_tags(row.tags_json.map { tag_literal(_1) }) - prev_tags = split_tags(row.attributes['prev_tags_json'].map { tag_literal(_1) }) + cur_tags = + Array(normalise_json(row.tags_json)) + .map { Post.tag_snapshot_literal(_1) } + prev_tags = + Array(normalise_json(row.attributes['prev_tags_json'])) + .map { Post.tag_snapshot_literal(_1) } { post_id: row.post_id, version_no: row.version_no, @@ -110,8 +97,4 @@ class PostVersionsController < ApplicationController } end end - - def split_tags(tags) - tags.to_s.split(/\s+/).reject(&:blank?) - end end diff --git a/backend/app/controllers/posts_controller.rb b/backend/app/controllers/posts_controller.rb index eec228b..3f5a92c 100644 --- a/backend/app/controllers/posts_controller.rb +++ b/backend/app/controllers/posts_controller.rb @@ -700,8 +700,8 @@ class PostsController < ApplicationController def editable_tag_names_from_version version version.tags_json - .reject { _1[:name].downcase.start_with?('nico:') } - .map { tag_literal(_1) } + .reject { _1.fetch('category') == 'nico' } + .map { Post.tag_snapshot_literal(_1) } .sort end diff --git a/backend/app/models/post.rb b/backend/app/models/post.rb index cde0929..08f8fec 100644 --- a/backend/app/models/post.rb +++ b/backend/app/models/post.rb @@ -137,18 +137,31 @@ class Post < ApplicationRecord end end + def self.tag_snapshot_literal tag + sections = tag.fetch('sections', []).map do |sec| + begin_ms = sec.fetch('begin_ms') + end_ms = sec['end_ms'] + + "[#{ Post.ms_to_time(begin_ms) }-#{ end_ms ? Post.ms_to_time(end_ms) : '' }]" + end + + "#{ tag.fetch('name') }#{ sections.join }" + end + def snapshot_tags_json post_tags .kept .joins(tag: :tag_name) .includes(:sections, tag: :tag_name) - .order('tag_names.name') + .order('tags.id') .map do |pt| - { id: pt.tag.id, - version_no: pt.tag.version_no, - name: pt.tag.name, - category: pt.tag.category, - sections: pt.sections.map { { begin_ms: _1.begin_ms, end_ms: _1.end_ms } } } + { 'id' => pt.tag.id, + 'version_no' => pt.tag.version_no, + 'name' => pt.tag.name, + 'category' => pt.tag.category, + 'sections' => pt.sections.sort_by(&:begin_ms).map { + { 'begin_ms' => _1.begin_ms, 'end_ms' => _1.end_ms } + } } end end