このコミットが含まれているのは:
@@ -85,4 +85,11 @@ class ApplicationController < ActionController::API
|
|||||||
base_errors: },
|
base_errors: },
|
||||||
status:
|
status:
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def normalise_json value
|
||||||
|
return nil if value.nil?
|
||||||
|
return JSON.parse(value) if value.is_a?(String)
|
||||||
|
|
||||||
|
value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
class PostVersionsController < ApplicationController
|
class PostVersionsController < ApplicationController
|
||||||
def index
|
def index
|
||||||
post_id = params[:post].presence
|
post_id = params[:post].presence
|
||||||
tag_id = params[:tag].presence
|
tag_id = params[:tag].presence&.to_i
|
||||||
page = (params[:page].presence || 1).to_i
|
page = (params[:page].presence || 1).to_i
|
||||||
limit = (params[:limit].presence || 20).to_i
|
limit = (params[:limit].presence || 20).to_i
|
||||||
|
|
||||||
@@ -10,12 +10,6 @@ class PostVersionsController < ApplicationController
|
|||||||
|
|
||||||
offset = (page - 1) * limit
|
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)
|
q = PostVersion.joins(<<~SQL.squish)
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
post_versions prev
|
post_versions prev
|
||||||
@@ -32,10 +26,10 @@ class PostVersionsController < ApplicationController
|
|||||||
'prev.original_created_from AS prev_original_created_from',
|
'prev.original_created_from AS prev_original_created_from',
|
||||||
'prev.original_created_before AS prev_original_created_before')
|
'prev.original_created_before AS prev_original_created_before')
|
||||||
q = q.where('post_versions.post_id = ?', post_id) if post_id
|
q = q.where('post_versions.post_id = ?', post_id) if post_id
|
||||||
if tag_name
|
if tag_id
|
||||||
escaped = ActiveRecord::Base.sanitize_sql_like(tag_name.name)
|
q = q.where(("JSON_CONTAINS(post_versions.tags_json, JSON_OBJECT('id', :tag_id)) " +
|
||||||
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))"),
|
||||||
"OR JSON_CONTAINS(prev.tags_json, JSON_OBJECT('id', :tag_id))"), tag_id:)
|
tag_id:)
|
||||||
end
|
end
|
||||||
|
|
||||||
count = q.except(:select, :order, :limit, :offset).count
|
count = q.except(:select, :order, :limit, :offset).count
|
||||||
@@ -49,24 +43,17 @@ class PostVersionsController < ApplicationController
|
|||||||
|
|
||||||
private
|
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
|
def serialise_versions rows
|
||||||
user_ids = rows.map(&:created_by_user_id).compact.uniq
|
user_ids = rows.map(&:created_by_user_id).compact.uniq
|
||||||
users_by_id = User.where(id: user_ids).pluck(:id, :name).to_h
|
users_by_id = User.where(id: user_ids).pluck(:id, :name).to_h
|
||||||
|
|
||||||
rows.map do |row|
|
rows.map do |row|
|
||||||
cur_tags = split_tags(row.tags_json.map { tag_literal(_1) })
|
cur_tags =
|
||||||
prev_tags = split_tags(row.attributes['prev_tags_json'].map { tag_literal(_1) })
|
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,
|
{ post_id: row.post_id,
|
||||||
version_no: row.version_no,
|
version_no: row.version_no,
|
||||||
@@ -110,8 +97,4 @@ class PostVersionsController < ApplicationController
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def split_tags(tags)
|
|
||||||
tags.to_s.split(/\s+/).reject(&:blank?)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -700,8 +700,8 @@ class PostsController < ApplicationController
|
|||||||
|
|
||||||
def editable_tag_names_from_version version
|
def editable_tag_names_from_version version
|
||||||
version.tags_json
|
version.tags_json
|
||||||
.reject { _1[:name].downcase.start_with?('nico:') }
|
.reject { _1.fetch('category') == 'nico' }
|
||||||
.map { tag_literal(_1) }
|
.map { Post.tag_snapshot_literal(_1) }
|
||||||
.sort
|
.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -137,18 +137,31 @@ class Post < ApplicationRecord
|
|||||||
end
|
end
|
||||||
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
|
def snapshot_tags_json
|
||||||
post_tags
|
post_tags
|
||||||
.kept
|
.kept
|
||||||
.joins(tag: :tag_name)
|
.joins(tag: :tag_name)
|
||||||
.includes(:sections, tag: :tag_name)
|
.includes(:sections, tag: :tag_name)
|
||||||
.order('tag_names.name')
|
.order('tags.id')
|
||||||
.map do |pt|
|
.map do |pt|
|
||||||
{ id: pt.tag.id,
|
{ 'id' => pt.tag.id,
|
||||||
version_no: pt.tag.version_no,
|
'version_no' => pt.tag.version_no,
|
||||||
name: pt.tag.name,
|
'name' => pt.tag.name,
|
||||||
category: pt.tag.category,
|
'category' => pt.tag.category,
|
||||||
sections: pt.sections.map { { begin_ms: _1.begin_ms, end_ms: _1.end_ms } } }
|
'sections' => pt.sections.sort_by(&:begin_ms).map {
|
||||||
|
{ 'begin_ms' => _1.begin_ms, 'end_ms' => _1.end_ms }
|
||||||
|
} }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする