このコミットが含まれているのは:
@@ -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',
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする