このコミットが含まれているのは:
@@ -27,6 +27,8 @@ class TagGroupOperation
|
||||
group.lock!
|
||||
old_name = group.name
|
||||
attributes = prepare!(group:, name:, description:, members:, placements:)
|
||||
next [group, nil] if unchanged?(group, attributes)
|
||||
|
||||
group.update!(name: attributes.fetch(:name),
|
||||
description: attributes.fetch(:description),
|
||||
version_no: group.version_no + 1,
|
||||
@@ -66,6 +68,49 @@ class TagGroupOperation
|
||||
end
|
||||
private_class_method :prepare!
|
||||
|
||||
def self.unchanged?(group, attributes)
|
||||
unless (group.name_in_database == attributes.fetch(:name) &&
|
||||
group.description_in_database == attributes.fetch(:description))
|
||||
return false
|
||||
end
|
||||
|
||||
members = TagGroupTag.where(tag_group_id: group.id).pluck(:tag_id)
|
||||
.map { { 'tag_id' => _1 } }
|
||||
members.concat(TagGroupGroup.where(tag_group_id: group.id)
|
||||
.pluck(:child_tag_group_id).map { { 'tag_group_id' => _1 } })
|
||||
requested_members = attributes.fetch(:members).map do |member|
|
||||
member.except('version_no')
|
||||
end
|
||||
return false unless members.to_set == requested_members.to_set
|
||||
|
||||
rows = TagGroupPlacement.where(tag_group_id: group.id).order(:position)
|
||||
.group_by(&:parent_position)
|
||||
build = lambda do |parent_position|
|
||||
rows.fetch(parent_position, []).map do |row|
|
||||
node = if row.tag_id
|
||||
{ 'tag_id' => row.tag_id }
|
||||
elsif row.child_tag_group_id
|
||||
{ 'tag_group_id' => 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) == comparable_placements(attributes.fetch(:placements))
|
||||
end
|
||||
private_class_method :unchanged?
|
||||
|
||||
def self.comparable_placements(nodes)
|
||||
nodes.map do |node|
|
||||
result = node.dup
|
||||
result['description'] = node['description'] if node.key?('section_name')
|
||||
result['children'] = comparable_placements(node.fetch('children'))
|
||||
result
|
||||
end
|
||||
end
|
||||
private_class_method :comparable_placements
|
||||
|
||||
def self.normalize_members(record, members)
|
||||
invalid!(record, :members, 'members は配列で指定してください.') unless members.is_a?(Array)
|
||||
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする