update code based on feedback

This commit is contained in:
James Lopez 2018-06-27 11:53:51 +02:00
parent 792082948c
commit 4eebd231b8
No known key found for this signature in database
GPG Key ID: 756BF8E9D7C0CF39
3 changed files with 33 additions and 50 deletions

View File

@ -19,46 +19,35 @@ module Gitlab
def initialize(klass, attributes) def initialize(klass, attributes)
@klass = klass < Label ? Label : klass @klass = klass < Label ? Label : klass
@attributes = attributes @attributes = attributes
@group = @attributes[:group] @group = @attributes['group']
@project = @attributes[:project] @project = @attributes['project']
end end
def find def find
find_or_action do find_object || @klass.create(project_attributes)
label? ? @klass.new(project_attributes) : @klass.create(project_attributes)
end
end end
private private
def find_or_action(&block) def find_object
@klass.where(where_clause).first || yield @klass.where(where_clause).first
end end
def where_clause def where_clause
@attributes.slice('title').map do |key, value| @attributes.slice('title').map do |key, value|
if @group scope_clause = table[:project_id].eq(@project.id)
project_group_clause(key, value) scope_clause = scope_clause.or(table[:group_id].eq(@group.id)) if @group
else
project_clause(key, value) table[key].eq(value).and(scope_clause)
end
end.reduce(:or) end.reduce(:or)
end end
def project_group_clause(key, value)
table[key].eq(value).and(table[:project_id].eq(@project.id).or(table[:group_id].eq(@group.id)))
end
def project_clause(key, value)
table[key].eq(value).and(table[:project_id].eq(@project.id))
end
def table def table
@table ||= @klass.arel_table @table ||= @klass.arel_table
end end
def project_attributes def project_attributes
@attributes.except(:group).tap do |atts| @attributes.except('group').tap do |atts|
if label? if label?
atts['type'] = 'ProjectLabel' # Always create project labels atts['type'] = 'ProjectLabel' # Always create project labels
elsif milestone? elsif milestone?
@ -80,27 +69,21 @@ module Gitlab
@klass == Milestone @klass == Milestone
end end
# If an existing group milesone used the IID # If an existing group milestone used the IID
# claim the IID back and set the group milestone to use one available # claim the IID back and set the group milestone to use one available
# This is neccessary to fix situations like the following: # This is necessary to fix situations like the following:
# - Importing into a user namespace project with exported group milestones # - Importing into a user namespace project with exported group milestones
# where the IID of the Group milestone could conflict with a project one. # where the IID of the Group milestone could conflict with a project one.
def claim_iid def claim_iid
# The milestone has to be a group milestone, as it's the only case where # The milestone has to be a group milestone, as it's the only case where
# we set the IID as the maximum. The rest of them are fixed. # we set the IID as the maximum. The rest of them are fixed.
group_milestone = @project.milestones.find_by(iid: @attributes['iid']) milestone = @project.milestones.find_by(iid: @attributes['iid'])
group_milestone.update!(iid: max_milestone_iid(group_milestone)) if group_milestone return unless milestone
end
def max_milestone_iid(group_milestone) milestone.iid = nil
init_iid = [@attributes['iid'], @project.milestones.maximum(:iid)].compact.max + 1 milestone.ensure_project_iid!
milestone.save!
InternalId::InternalIdGenerator.new(group_milestone,
{ project: @project },
:milestones,
init_iid
).generate
end end
end end
end end

View File

@ -267,8 +267,8 @@ module Gitlab
# Can't use IDs as validation exists calling `group` or `project` attributes # Can't use IDs as validation exists calling `group` or `project` attributes
finder_hash = parsed_relation_hash.tap do |hash| finder_hash = parsed_relation_hash.tap do |hash|
hash[:group] = @project.group if relation_class.attribute_method?('group_id') hash['group'] = @project.group if relation_class.attribute_method?('group_id')
hash[:project] = @project hash['project'] = @project
hash.delete('project_id') hash.delete('project_id')
end end

View File

@ -15,18 +15,18 @@ describe Gitlab::ImportExport::GroupProjectObjectBuilder do
group_label = create(:group_label, 'name': 'group label', 'group': project.group) group_label = create(:group_label, 'name': 'group label', 'group': project.group)
expect(described_class.build(Label, expect(described_class.build(Label,
title: 'group label', 'title' => 'group label',
project: project, 'project' => project,
group: project.group)).to eq(group_label) 'group' => project.group)).to eq(group_label)
end end
it 'initializes a new label' do it 'creates a new label' do
label = described_class.build(Label, label = described_class.build(Label,
title: 'group label', 'title' => 'group label',
project: project, 'project' => project,
group: project.group) 'group' => project.group)
expect(label.persisted?).to be false expect(label.persisted?).to be true
end end
end end
@ -35,16 +35,16 @@ describe Gitlab::ImportExport::GroupProjectObjectBuilder do
milestone = create(:milestone, 'name' => 'group milestone', 'group' => project.group) milestone = create(:milestone, 'name' => 'group milestone', 'group' => project.group)
expect(described_class.build(Milestone, expect(described_class.build(Milestone,
title: 'group milestone', 'title' => 'group milestone',
project: project, 'project' => project,
group: project.group)).to eq(milestone) 'group' => project.group)).to eq(milestone)
end end
it 'creates a new milestone' do it 'creates a new milestone' do
milestone = described_class.build(Milestone, milestone = described_class.build(Milestone,
title: 'group milestone', 'title' => 'group milestone',
project: project, 'project' => project,
group: project.group) 'group' => project.group)
expect(milestone.persisted?).to be true expect(milestone.persisted?).to be true
end end