このコミットが含まれているのは:
2026-10-15 23:49:38 +09:00
コミット 6ba87beef6
8個のファイルの変更、176行の追加、134行の削除
+74 -53
ファイルの表示
@@ -4,9 +4,12 @@ class WikiPagesController < ApplicationController
rescue_from TagDescriptionOperation::Conflict, with: :render_wiki_conflict
def index
locale = resolve_locale!
title = params[:title].to_s.strip
descriptions =
TagDescription.where(language_code: 'ja')
TagDescription
.where(language_code: locale.language_code)
.includes(tag: :tag_names)
descriptions = descriptions.order(updated_at: :desc, id: :asc)
@@ -15,13 +18,14 @@ class WikiPagesController < ApplicationController
pattern = "%#{ ApplicationRecord.sanitize_sql_like(title) }%"
descriptions =
descriptions.joins(tag: :tag_names)
.where(tag_names: { language_code: 'ja', primary_flg: true })
.where(tag_names: { language_code: locale.language_code, primary_flg: true })
.where('tag_names.name LIKE ?', pattern).limit(20)
tag_groups = tag_groups.where(
'CONCAT(?, name) LIKE ?', TagGroupRepr::PREFIX, pattern).limit(20)
'CONCAT(?, name) LIKE ? OR CONCAT(?, name) LIKE ?',
TagGroupRepr::PREFIX, pattern, 'tag_group:', pattern).limit(20)
end
json = descriptions.map { |description| WikiPageRepr.tag_description(description) }
json = descriptions.map { |description| WikiPageRepr.tag_description(locale, description) }
json.concat(tag_groups.map { WikiPageRepr.tag_group(_1) })
json.sort_by! do |row|
[-row['updated_at'].to_f, row.fetch('resource_type'), row.fetch('id')]
@@ -31,47 +35,53 @@ class WikiPagesController < ApplicationController
end
def show
tag_description = TagDescription.find_by(id: params[:id])
locale = resolve_locale!
tag_description = TagDescription.find_by(id: params[:id], language_code: locale.language_code)
return render_wiki_page_by_tag_description tag_description if tag_description
return render_wiki_page_by_tag_description locale, tag_description if tag_description
tag_group = TagGroup.find_by(id: params[:id])
return render_tag_group tag_group if tag_group
return render_tag_group locale, tag_group if tag_group
head :not_found
end
def show_by_title
locale = resolve_locale!
title = params[:title].to_s.strip
if title.start_with?(TagGroupRepr::PREFIX)
name = title.delete_prefix(TagGroupRepr::PREFIX)
if (name = TagGroupRepr.name_from_title(title))
tag_group = TagGroup.find_by(name:)
return render_tag_group tag_group if tag_group
return render_tag_group locale, tag_group if tag_group
return head :not_found
end
tag_description = tag_description_by_title(title)
tag_description = tag_description_by_title(locale, title)
return render_wiki_page_by_tag_description tag_description if tag_description
return render_wiki_page_by_tag_description locale, tag_description if tag_description
head :not_found
end
def exists
return head :no_content if TagDescription.exists?(id: params[:id])
locale = resolve_locale!
if TagDescription.exists?(id: params[:id], language_code: locale.language_code)
return head :no_content
end
return head :no_content if TagGroup.exists?(id: params[:id])
head :not_found
end
def exists_by_title
locale = resolve_locale!
title = params[:title].to_s.strip
if title.start_with?(TagGroupRepr::PREFIX)
exists = TagGroup.exists?(name: title.delete_prefix(TagGroupRepr::PREFIX))
if (name = TagGroupRepr.name_from_title(title))
exists = TagGroup.exists?(name:)
return head exists ? :no_content : :not_found
end
return head :no_content if tag_description_by_title(title)
return head :no_content if tag_description_by_title(locale, title)
head :not_found
end
@@ -80,15 +90,17 @@ class WikiPagesController < ApplicationController
id = params[:id]
return render_bad_request('id は必須です.') if id.blank?
locale = resolve_locale!
from = params[:from].presence
to = params[:to].presence
description = TagDescription.find_by(id:)
description = TagDescription.find_by(id:, language_code: locale.language_code)
if description
versions = description_versions(description)
from_rev = from && versions.find(from)
to_rev = to ? versions.find(to) : versions.find_by!(version_no: description.version_no)
resource = WikiPageRepr.tag_description(description)
resource = WikiPageRepr.tag_description(locale, description)
else
tag_group = TagGroup.find_by(id:)
if tag_group
@@ -96,8 +108,8 @@ class WikiPagesController < ApplicationController
to_rev = to ? group_version(tag_group, to) : current_group_version(tag_group)
return head :not_found if (from && !from_rev) || !to_rev
from_body = from_rev && render_group_version(from_rev)
to_body = render_group_version(to_rev)
from_body = from_rev && render_group_version(locale, from_rev)
to_body = render_group_version(locale, to_rev)
resource = { 'id' => tag_group.id,
'title' => "#{ TagGroupRepr::PREFIX }#{ tag_group.name }",
'deprecated_at' => nil }
@@ -131,14 +143,15 @@ class WikiPagesController < ApplicationController
return render_unprocessable_entity('タイトルは必須です.', field: :title) if title.blank?
return render_unprocessable_entity('本文は必須です.', field: :body) if body.blank?
if title.start_with?(TagGroupRepr::PREFIX)
name = title.delete_prefix(TagGroupRepr::PREFIX)
parsed = TagGroupMarkdownParser.parse(body:, group: nil)
locale = resolve_locale!
if (name = TagGroupRepr.name_from_title(title))
parsed = TagGroupMarkdownParser.parse(locale, body:, group: nil)
group = TagGroupOperation.create!(
name:, **parsed.except(:compatibility_body), actor: current_user,
locale, name:, **parsed.except(:compatibility_body), actor: current_user,
require_compatibility: true)
version = current_group_version(group)
return render_group_representation(TagGroupRepr.one(group), version,
return render_group_representation(TagGroupRepr.one(locale, group), version,
status: :created)
end
@@ -146,14 +159,15 @@ class WikiPagesController < ApplicationController
if title.include?(':')
return render_unprocessable_entity field: :title
else
tag_name = TagName.find_by(language_code: 'ja', name: title)
tag_name = TagName.find_by(language_code: locale.language_code, name: title)
return render_unprocessable_entity field: :title unless tag_name&.tag
TagDescriptionOperation.create!(
locale,
tag: tag_name.tag, body:, created_by_user: current_user, message:)
end
render json: WikiPageRepr.tag_description(description), status: :created
render json: WikiPageRepr.tag_description(locale, description), status: :created
rescue ActiveRecord::RecordInvalid => e
render_validation_error e.record
rescue ActiveRecord::RecordNotUnique
@@ -172,26 +186,28 @@ class WikiPagesController < ApplicationController
return render_unprocessable_entity('タイトルは必須です.', field: :title) if title.blank?
return render_unprocessable_entity('本文は必須です.', field: :body) if body.blank?
locale = resolve_locale!
group = TagGroup.find_by(id: params[:id])
if title.start_with?(TagGroupRepr::PREFIX)
if (name = TagGroupRepr.name_from_title(title))
return head :not_found unless group
name = title.delete_prefix(TagGroupRepr::PREFIX)
parsed = TagGroupMarkdownParser.parse(body:, group:)
parsed = TagGroupMarkdownParser.parse(locale, body:, group:)
TagGroupOperation.update!(
group:, name:, **parsed.except(:compatibility_body), actor: current_user,
locale, group:, name:, **parsed.except(:compatibility_body), actor: current_user,
require_compatibility: true)
return head :ok
end
return render_unprocessable_entity field: :title if title.include?(':')
description = TagDescription.find_by(id: params[:id])
description = TagDescription.find_by(id: params[:id], language_code: locale.language_code)
unless description
return render_unprocessable_entity field: :title if group
return head :not_found
end
tag = description.tag
tag_name = tag.tag_name('ja')
tag_name = tag.tag_name(locale.language_code)
return render_unprocessable_entity field: :title unless tag_name
return render_unprocessable_entity field: :title if tag_name.name.include?(':')
@@ -207,7 +223,7 @@ class WikiPagesController < ApplicationController
tag_name.update!(name: title) if title != old_title
message = params[:message].presence
TagDescriptionOperation.update!(tag:, body:, updated_by_user: current_user,
TagDescriptionOperation.update!(locale, tag:, body:, updated_by_user: current_user,
message:, base_revision_id:)
if title != old_title
@@ -226,10 +242,12 @@ class WikiPagesController < ApplicationController
end
def changes
locale = resolve_locale!
id = params[:id].presence
description = id && TagDescription.find_by(id:)
description = id && TagDescription.find_by(id:, language_code: locale.language_code)
if description
return render json: description_changes(TagDescription.where(id: description.id))
return render json: description_changes(locale, TagDescription.where(id: description.id))
end
tag_group = id && TagGroup.find_by(id:)
@@ -240,7 +258,8 @@ class WikiPagesController < ApplicationController
json = []
unless id
json.concat(tag_group_changes(TagGroupVersion.all))
json.concat(description_changes(TagDescription.where(language_code: 'ja')))
json.concat(description_changes(locale,
TagDescription.where(language_code: locale.language_code)))
json = json.each_with_index.sort_by do |row, index|
[-row.fetch(:timestamp).to_f, index]
end.map(&:first)
@@ -250,7 +269,7 @@ class WikiPagesController < ApplicationController
private
def render_tag_group group
def render_tag_group locale, group
version = if params[:version].present?
group_version(group, params[:version])
else
@@ -258,16 +277,17 @@ class WikiPagesController < ApplicationController
end
return head :not_found unless version
representation = if params[:version].present?
TagGroupRepr.historical(version)
else
TagGroupRepr.one(group)
end
representation =
if params[:version].present?
TagGroupRepr.historical(locale, version)
else
TagGroupRepr.one(locale, group)
end
render_group_representation(representation, version)
end
def render_group_version version
representation = TagGroupRepr.historical(version)
def render_group_version locale, version
representation = TagGroupRepr.historical(locale, version)
TagGroupMarkdownRenderer.render(representation)
end
@@ -336,7 +356,7 @@ class WikiPagesController < ApplicationController
end
end
def render_wiki_page_by_tag_description description
def render_wiki_page_by_tag_description locale, description
versions = description_versions(description)
historical = params[:version].present?
rev = historical ? versions.find_by(id: params[:version]) :
@@ -347,7 +367,7 @@ class WikiPagesController < ApplicationController
succ = versions.find_by(version_no: rev.version_no + 1)&.id
body = historical ? rev.body : description.body
updated_at = historical ? rev.created_at : description.updated_at
render json: WikiPageRepr.tag_description(description).merge(
render json: WikiPageRepr.tag_description(locale, description).merge(
body:, revision_id: rev.id, pred:, succ:, updated_at:)
end
@@ -356,13 +376,14 @@ class WikiPagesController < ApplicationController
language_code: description.language_code)
end
def tag_description_by_title title
def tag_description_by_title locale, title
TagDescription.joins(tag: :tag_names)
.find_by(language_code: 'ja', tag_names: { language_code: 'ja', name: title })
.find_by(language_code: locale.language_code,
tag_names: { language_code: locale.language_code, name: title })
end
def description_changes descriptions
versions = TagDescriptionVersion.where(language_code: 'ja',
def description_changes locale, descriptions
versions = TagDescriptionVersion.where(language_code: locale.language_code,
tag_id: descriptions.select(:tag_id))
.order(id: :desc).limit(200).to_a
return [] if versions.empty?
@@ -371,7 +392,7 @@ class WikiPagesController < ApplicationController
.includes(tag: :tag_names).index_by(&:tag_id)
users = User.where(id: versions.map(&:created_by_user_id)).index_by(&:id)
predecessors = TagDescriptionVersion.where(
language_code: 'ja', tag_id: by_tag.keys,
language_code: locale.language_code, tag_id: by_tag.keys,
version_no: versions.map { |version| version.version_no - 1 })
.pluck(:tag_id, :version_no, :id)
.to_h { |tag_id, version_no, id| [[tag_id, version_no], id] }
@@ -381,7 +402,7 @@ class WikiPagesController < ApplicationController
{ revision_id: version.id,
pred: predecessors[[version.tag_id, version.version_no - 1]],
succ: nil,
wiki_page: { id: description.id, title: description.tag.name('ja'),
wiki_page: { id: description.id, title: description.tag.name(locale.language_code),
deprecated_at: description.tag.deprecated_at },
user: user && { id: user.id, name: user.name },
kind: 'content',