このコミットが含まれているのは:
@@ -23,17 +23,19 @@ class PostVersionsController < ApplicationController
|
|||||||
prev.post_id = post_versions.post_id
|
prev.post_id = post_versions.post_id
|
||||||
AND prev.version_no = post_versions.version_no - 1
|
AND prev.version_no = post_versions.version_no - 1
|
||||||
SQL
|
SQL
|
||||||
.select('post_versions.*', 'prev.title AS prev_title', 'prev.url AS prev_url',
|
.select('post_versions.*',
|
||||||
'prev.thumbnail_base AS prev_thumbnail_base', 'prev.tags AS prev_tags',
|
'prev.title AS prev_title',
|
||||||
|
'prev.url AS prev_url',
|
||||||
|
'prev.thumbnail_base AS prev_thumbnail_base',
|
||||||
|
'prev.tags_json AS prev_tags_json',
|
||||||
'prev.video_ms AS prev_video_ms',
|
'prev.video_ms AS prev_video_ms',
|
||||||
'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_name
|
||||||
escaped = ActiveRecord::Base.sanitize_sql_like(tag_name.name)
|
escaped = ActiveRecord::Base.sanitize_sql_like(tag_name.name)
|
||||||
q = q.where(("CONCAT(' ', post_versions.tags, ' ') LIKE :kw " +
|
q = q.where(("JSON_CONTAINTS(post_version.tags_json, JSON_OBJECT('id', :tag_id)) " +
|
||||||
"OR CONCAT(' ', prev.tags, ' ') LIKE :kw"),
|
"OR JSON_CONTAINS(prev.tags_json, JSON_OBJECT('id', :tag_id))"), tag_id:)
|
||||||
kw: "% #{ escaped } %")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
count = q.except(:select, :order, :limit, :offset).count
|
count = q.except(:select, :order, :limit, :offset).count
|
||||||
@@ -47,56 +49,47 @@ 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)
|
cur_tags = split_tags(row.tags_json.map { tag_literal(_1) })
|
||||||
prev_tags = split_tags(row.attributes['prev_tags'])
|
prev_tags = split_tags(row.attributes['prev_tags_json'].map { tag_literal(_1) })
|
||||||
|
|
||||||
{
|
{ post_id: row.post_id,
|
||||||
post_id: row.post_id,
|
|
||||||
version_no: row.version_no,
|
version_no: row.version_no,
|
||||||
event_type: row.event_type,
|
event_type: row.event_type,
|
||||||
title: {
|
title: { current: row.title, prev: row.attributes['prev_title'] },
|
||||||
current: row.title,
|
url: { current: row.url, prev: row.attributes['prev_url'] },
|
||||||
prev: row.attributes['prev_title']
|
thumbnail: { current: nil, prev: nil },
|
||||||
},
|
thumbnail_base: { current: row.thumbnail_base,
|
||||||
url: {
|
prev: row.attributes['prev_thumbnail_base'] },
|
||||||
current: row.url,
|
video_ms: { current: row.video_ms, prev: row.attributes['prev_video_ms'] },
|
||||||
prev: row.attributes['prev_url']
|
|
||||||
},
|
|
||||||
thumbnail: {
|
|
||||||
current: nil,
|
|
||||||
prev: nil
|
|
||||||
},
|
|
||||||
thumbnail_base: {
|
|
||||||
current: row.thumbnail_base,
|
|
||||||
prev: row.attributes['prev_thumbnail_base']
|
|
||||||
},
|
|
||||||
video_ms: {
|
|
||||||
current: row.video_ms,
|
|
||||||
prev: row.attributes['prev_video_ms']
|
|
||||||
},
|
|
||||||
tags: build_version_tags(cur_tags, prev_tags),
|
tags: build_version_tags(cur_tags, prev_tags),
|
||||||
original_created_from: {
|
original_created_from: {
|
||||||
current: row.original_created_from&.iso8601,
|
current: row.original_created_from&.iso8601,
|
||||||
prev: row.attributes['prev_original_created_from']&.iso8601
|
prev: row.attributes['prev_original_created_from']&.iso8601 },
|
||||||
},
|
|
||||||
original_created_before: {
|
original_created_before: {
|
||||||
current: row.original_created_before&.iso8601,
|
current: row.original_created_before&.iso8601,
|
||||||
prev: row.attributes['prev_original_created_before']&.iso8601
|
prev: row.attributes['prev_original_created_before']&.iso8601 },
|
||||||
},
|
|
||||||
created_at: row.created_at.iso8601,
|
created_at: row.created_at.iso8601,
|
||||||
created_by_user:
|
created_by_user:
|
||||||
if row.created_by_user_id
|
if row.created_by_user_id
|
||||||
{
|
{ id: row.created_by_user_id,
|
||||||
id: row.created_by_user_id,
|
name: users_by_id[row.created_by_user_id] }
|
||||||
name: users_by_id[row.created_by_user_id]
|
end }
|
||||||
}
|
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -699,7 +699,10 @@ class PostsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def editable_tag_names_from_version version
|
def editable_tag_names_from_version version
|
||||||
version.tags.to_s.split.reject { |name| name.downcase.start_with?('nico:') }.sort
|
version.tags_json
|
||||||
|
.reject { _1[:name].downcase.start_with?('nico:') }
|
||||||
|
.map { tag_literal(_1) }
|
||||||
|
.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
def post_snapshot_from_record post
|
def post_snapshot_from_record post
|
||||||
|
|||||||
@@ -137,6 +137,21 @@ class Post < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def snapshot_tags_json
|
||||||
|
post_tags
|
||||||
|
.kept
|
||||||
|
.joins(tag: :tag_name)
|
||||||
|
.includes(:sections, tag: :tag_name)
|
||||||
|
.order('tag_names.name')
|
||||||
|
.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 } } }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.section_literal section
|
def self.section_literal section
|
||||||
end_ms =
|
end_ms =
|
||||||
section.end_ms ? Post.ms_to_time(section.end_ms) : ''
|
section.end_ms ? Post.ms_to_time(section.end_ms) : ''
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class PostVersionRecorder < VersionRecorder
|
|||||||
thumbnail_base: @record.thumbnail_base,
|
thumbnail_base: @record.thumbnail_base,
|
||||||
video_ms: @record.video_ms,
|
video_ms: @record.video_ms,
|
||||||
tags: @record.snapshot_tag_names.join(' '),
|
tags: @record.snapshot_tag_names.join(' '),
|
||||||
|
tags_json: @record.snapshot_tags_json,
|
||||||
parent_post_ids: @record.snapshot_parent_post_ids.join(' '),
|
parent_post_ids: @record.snapshot_parent_post_ids.join(' '),
|
||||||
original_created_from: @record.original_created_from,
|
original_created_from: @record.original_created_from,
|
||||||
original_created_before: @record.original_created_before }
|
original_created_before: @record.original_created_before }
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする