Reviewed-on: #429 Co-authored-by: miteruzo <miteruzo@naver.com>
このコミットはプルリクエスト #429 でマージされました。
このコミットが含まれているのは:
@@ -0,0 +1,194 @@
|
||||
module TagGroupRepr
|
||||
PREFIX = 'タググループ:'
|
||||
|
||||
module_function
|
||||
|
||||
def many groups
|
||||
ids = groups.map(&:id)
|
||||
return [] if ids.empty?
|
||||
|
||||
tag_members = TagGroupTag.where(tag_group_id: ids)
|
||||
.group_by(&:tag_group_id)
|
||||
group_members = TagGroupGroup.where(tag_group_id: ids)
|
||||
.group_by(&:tag_group_id)
|
||||
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) +
|
||||
placements.values.flatten.filter_map(&:tag_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
|
||||
child_groups = TagGroup.where(id: child_ids.uniq).index_by(&:id)
|
||||
|
||||
groups.map do |group|
|
||||
group_json(group,
|
||||
tag_members.fetch(group.id, []),
|
||||
group_members.fetch(group.id, []),
|
||||
placements.fetch(group.id, []), tags, names, child_groups)
|
||||
end
|
||||
end
|
||||
|
||||
def one group
|
||||
many([group]).first
|
||||
end
|
||||
|
||||
def tag_group wiki_page
|
||||
{ 'id' => wiki_page.id,
|
||||
'title' => "#{ PREFIX }#{ wiki_page.name }",
|
||||
'deprecated_at' => nil,
|
||||
'created_at' => wiki_page.created_at,
|
||||
'updated_at' => wiki_page.updated_at }
|
||||
end
|
||||
|
||||
def current_version group
|
||||
TagGroupVersion.find_by(tag_group_id: group.id, version_no: group.version_no)
|
||||
end
|
||||
|
||||
def historical version
|
||||
members = Array(version.members)
|
||||
placements = Array(version.placements)
|
||||
tag_references = members.filter_map { |member| member['tag_id'] } +
|
||||
collect_ids(placements, 'tag_id')
|
||||
group_references = members.filter_map { |member| member['tag_group_id'] } +
|
||||
collect_ids(placements, 'tag_group_id')
|
||||
tag_versions = historical_tag_versions(tag_references)
|
||||
group_versions = historical_group_versions(group_references)
|
||||
tag_version_numbers = members.filter_map do |member|
|
||||
next unless member['tag_id']
|
||||
|
||||
[member.fetch('tag_id'), member.fetch('version_no')]
|
||||
end.to_h
|
||||
group_version_numbers = members.filter_map do |member|
|
||||
next unless member['tag_group_id']
|
||||
|
||||
[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)
|
||||
end
|
||||
historical_placements = placements.map do |node|
|
||||
historical_placement(node, tag_versions, group_versions,
|
||||
tag_version_numbers, group_version_numbers)
|
||||
end
|
||||
{ 'id' => version.tag_group_id,
|
||||
'name' => version.name,
|
||||
'description' => version.description,
|
||||
'version_no' => version.version_no,
|
||||
'members' => historical_members,
|
||||
'placements' => historical_placements,
|
||||
'created_at' => version.created_at,
|
||||
'updated_at' => version.created_at,
|
||||
'created_by_user' => user_json(version.created_by_user),
|
||||
'updated_by_user' => user_json(version.created_by_user) }
|
||||
end
|
||||
|
||||
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)) }
|
||||
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)) }
|
||||
end)
|
||||
{ 'id' => group.id,
|
||||
'name' => group.name,
|
||||
'description' => group.description,
|
||||
'version_no' => group.version_no,
|
||||
'members' => members,
|
||||
'placements' => tree,
|
||||
'created_at' => group.created_at,
|
||||
'updated_at' => group.updated_at,
|
||||
'created_by_user' => user_json(group.created_by_user),
|
||||
'updated_by_user' => user_json(group.updated_by_user) }
|
||||
end
|
||||
|
||||
def user_json user
|
||||
UserRepr.base(user) if user
|
||||
end
|
||||
|
||||
def placement_tree rows, tags, names, child_groups
|
||||
by_parent = rows.group_by(&:parent_position)
|
||||
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)) }
|
||||
elsif row.child_tag_group_id
|
||||
{ 'tag_group' => group_json_reference(child_groups.fetch(row.child_tag_group_id)) }
|
||||
else
|
||||
{ 'section_name' => row.section_name, 'description' => row.description }
|
||||
end
|
||||
node.merge('children' => build.call(row.position))
|
||||
end
|
||||
end
|
||||
build.call(nil)
|
||||
end
|
||||
|
||||
def tag_json tag, name
|
||||
{ 'id' => tag.id, 'name' => name, 'category' => tag.category }
|
||||
end
|
||||
|
||||
def group_json_reference group
|
||||
{ 'id' => group.id, 'name' => group.name }
|
||||
end
|
||||
|
||||
def collect_ids nodes, key
|
||||
nodes.flat_map do |node|
|
||||
[node[key], *collect_ids(Array(node['children']), key)].compact
|
||||
end
|
||||
end
|
||||
|
||||
def historical_tag_versions ids
|
||||
TagVersion.where(tag_id: ids.uniq).to_a.index_by do |version|
|
||||
[version.tag_id, version.version_no]
|
||||
end
|
||||
end
|
||||
|
||||
def historical_group_versions ids
|
||||
TagGroupVersion.where(tag_group_id: ids.uniq).to_a.index_by do |version|
|
||||
[version.tag_group_id, version.version_no]
|
||||
end
|
||||
end
|
||||
|
||||
def historical_member 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),
|
||||
'category' => version.category } }
|
||||
else
|
||||
id = member.fetch('tag_group_id')
|
||||
version = group_versions.fetch([id, member.fetch('version_no')])
|
||||
{ 'tag_group' => { 'id' => id, 'name' => version.name } }
|
||||
end
|
||||
end
|
||||
|
||||
def historical_placement(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),
|
||||
'category' => version.category } }
|
||||
elsif node['tag_group_id']
|
||||
id = node.fetch('tag_group_id')
|
||||
version_no = group_version_numbers.fetch(id)
|
||||
version = group_versions.fetch([id, version_no])
|
||||
{ 'tag_group' => { 'id' => id, 'name' => version.name } }
|
||||
else
|
||||
{ '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,
|
||||
tag_version_numbers, group_version_numbers)
|
||||
end)
|
||||
end
|
||||
|
||||
def japanese_version_name version
|
||||
version.names.fetch('ja').fetch('name')
|
||||
end
|
||||
end
|
||||
@@ -25,6 +25,10 @@ module WikiPageRepr
|
||||
'deprecated_at' => tag.deprecated_at }
|
||||
end
|
||||
|
||||
def tag_group tag_group
|
||||
TagGroupRepr.tag_group(tag_group)
|
||||
end
|
||||
|
||||
def many wiki_pages
|
||||
wiki_pages.map { |p| base(p) }
|
||||
end
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする