Wiki 依存の排除 (#431) (#432)

Reviewed-on: #432
Co-authored-by: miteruzo <miteruzo@naver.com>
このコミットはプルリクエスト #432 でマージされました。
このコミットが含まれているのは:
2026-10-16 00:26:53 +09:00
committed by みてるぞ
コミット 75d7dac999
75個のファイルの変更、1474行の追加、3000行の削除
+32 -21
ファイルの表示
@@ -3,7 +3,12 @@ module TagGroupRepr
module_function
def many groups
def name_from_title title
prefix = [PREFIX, 'tag_group:'].find { title.downcase.start_with?(_1) }
title[prefix.length..] if prefix
end
def many locale, groups
ids = groups.map(&:id)
return [] if ids.empty?
@@ -14,14 +19,20 @@ module TagGroupRepr
placements = TagGroupPlacement.where(tag_group_id: ids).order(:position)
.group_by(&:tag_group_id)
target_ids = tag_members.values.flatten.map(&:tag_id) +
group_members.values.flatten.map(&:child_tag_group_id) +
target_ids =
tag_members.values.flatten.map(&:tag_id) +
placements.values.flatten.filter_map(&:tag_id)
child_ids = group_members.values.flatten.map(&:child_tag_group_id) +
child_ids =
group_members.values.flatten.map(&:child_tag_group_id) +
placements.values.flatten.filter_map(&:child_tag_group_id)
tags = Tag.select(:id, :category).where(id: target_ids.uniq).index_by(&:id)
names = TagName.where(tag_id: target_ids.uniq, language_code: 'ja', primary_flg: true)
.pluck(:tag_id, :name).to_h
names =
TagName
.where(tag_id: target_ids.uniq,
language_code: locale.language_code,
primary_flg: true)
.pluck(:tag_id, :name)
.to_h
child_groups = TagGroup.where(id: child_ids.uniq).index_by(&:id)
groups.map do |group|
@@ -32,8 +43,8 @@ module TagGroupRepr
end
end
def one group
many([group]).first
def one locale, group
many(locale, [group]).first
end
def tag_group wiki_page
@@ -48,7 +59,7 @@ module TagGroupRepr
TagGroupVersion.find_by(tag_group_id: group.id, version_no: group.version_no)
end
def historical version
def historical locale, version
members = Array(version.members)
placements = Array(version.placements)
tag_references = members.filter_map { |member| member['tag_id'] } +
@@ -68,10 +79,10 @@ module TagGroupRepr
[member.fetch('tag_group_id'), member.fetch('version_no')]
end.to_h
historical_members = members.map do |member|
historical_member(member, tag_versions, group_versions)
historical_member(locale, member, tag_versions, group_versions)
end
historical_placements = placements.map do |node|
historical_placement(node, tag_versions, group_versions,
historical_placement(locale, node, tag_versions, group_versions,
tag_version_numbers, group_version_numbers)
end
{ 'id' => version.tag_group_id,
@@ -89,7 +100,7 @@ module TagGroupRepr
def group_json group, tag_members, group_members, rows, tags, names, child_groups
tree = placement_tree(rows, tags, names, child_groups)
members = tag_members.sort_by(&:tag_id).map do |member|
{ 'tag' => tag_json(tags.fetch(member.tag_id), names.fetch(member.tag_id)) }
{ 'tag' => tag_json(tags.fetch(member.tag_id), names[member.tag_id]) }
end
members.concat(group_members.sort_by(&:child_tag_group_id).map do |member|
{ 'tag_group' => group_json_reference(child_groups.fetch(member.child_tag_group_id)) }
@@ -115,7 +126,7 @@ module TagGroupRepr
build = lambda do |parent|
by_parent.fetch(parent, []).sort_by(&:position).map do |row|
node = if row.tag_id
{ 'tag' => tag_json(tags.fetch(row.tag_id), names.fetch(row.tag_id)) }
{ 'tag' => tag_json(tags.fetch(row.tag_id), names[row.tag_id]) }
elsif row.child_tag_group_id
{ 'tag_group' => group_json_reference(child_groups.fetch(row.child_tag_group_id)) }
else
@@ -153,11 +164,11 @@ module TagGroupRepr
end
end
def historical_member member, tag_versions, group_versions
def historical_member locale, member, tag_versions, group_versions
if member['tag_id']
id = member.fetch('tag_id')
version = tag_versions.fetch([id, member.fetch('version_no')])
{ 'tag' => { 'id' => id, 'name' => japanese_version_name(version),
{ 'tag' => { 'id' => id, 'name' => version_name(locale, version),
'category' => version.category } }
else
id = member.fetch('tag_group_id')
@@ -166,13 +177,13 @@ module TagGroupRepr
end
end
def historical_placement(node, tag_versions, group_versions,
tag_version_numbers, group_version_numbers)
def historical_placement locale, node, tag_versions, group_versions,
tag_version_numbers, group_version_numbers
result = if node['tag_id']
id = node.fetch('tag_id')
version_no = tag_version_numbers.fetch(id)
version = tag_versions.fetch([id, version_no])
{ 'tag' => { 'id' => id, 'name' => japanese_version_name(version),
{ 'tag' => { 'id' => id, 'name' => version_name(locale, version),
'category' => version.category } }
elsif node['tag_group_id']
id = node.fetch('tag_group_id')
@@ -183,12 +194,12 @@ module TagGroupRepr
{ 'section_name' => node.fetch('section_name'), 'description' => node['description'] }
end
result.merge('children' => Array(node['children']).map do |child|
historical_placement(child, tag_versions, group_versions,
historical_placement(locale, child, tag_versions, group_versions,
tag_version_numbers, group_version_numbers)
end)
end
def japanese_version_name version
version.names.fetch('ja').fetch('name')
def version_name locale, version
version.names[locale.language_code]&.fetch('name')
end
end
+4 -13
ファイルの表示
@@ -2,19 +2,14 @@
module WikiPageRepr
BASE = { methods: [:title, :deprecated_at] }.freeze
module_function
def base wiki_page
wiki_page.as_json(BASE)
end
def tag_description description
def tag_description locale, description
tag = description.tag
{ 'id' => description.id,
'resource_type' => 'tag_description',
'tag_name_id' => tag.tag_name('ja')&.id,
'tag_name_id' => tag.tag_name(locale.language_code)&.id,
'body' => description.body,
'created_user_id' => description.created_by_user_id,
'updated_user_id' => description.updated_by_user_id,
@@ -22,15 +17,11 @@ module WikiPageRepr
'updated_at' => description.updated_at,
'discarded_at' => nil,
'version_no' => description.version_no,
'title' => tag.name('ja'),
'title' => tag.name(locale.language_code),
'deprecated_at' => tag.deprecated_at }
end
def tag_group tag_group
TagGroupRepr.tag_group(tag_group).merge('resource_type' => 'tag_group')
end
def many wiki_pages
wiki_pages.map { |p| base(p) }
end
end