refactor code once again to fix IID issues

This commit is contained in:
James Lopez 2018-06-20 15:45:15 +02:00
parent cc061cd1c6
commit 8522173e0a
No known key found for this signature in database
GPG key ID: 756BF8E9D7C0CF39
3 changed files with 47 additions and 42 deletions

View file

@ -31,7 +31,9 @@ module Gitlab
private
def where_clause
@attributes.except(:group, :project).map do |key, value|
return { project_id: @project.id } unless milestone? || label?
@attributes.slice(:title).map do |key, value|
project_clause = table[key].eq(value).and(table[:project_id].eq(@project.id))
if @group
@ -48,13 +50,36 @@ module Gitlab
def project_attributes
@attributes.except(:group).tap do |atts|
atts['type'] = 'ProjectLabel' if label?
if label?
atts['type'] = 'ProjectLabel'
elsif milestone?
if atts['group_id']
atts['iid'] = nil
atts.delete('group_id')
else
claim_iid
end
end
end
end
def label?
@klass == Label || @klass < Label
end
def milestone?
@klass == Milestone
end
def claim_iid
group_milestone = @project.milestones.find_by(iid: @attributes['iid'])
group_milestone.update!(iid: max_milestone_iid + 1) if group_milestone
end
def max_milestone_iid
[@attributes['iid'], @project.milestones.maximum(:iid)].compact.max
end
end
end
end

View file

@ -257,15 +257,7 @@ module Gitlab
end
def existing_object
@existing_object ||=
begin
existing_object = find_or_create_object!
# Done in two steps, as MySQL behaves differently than PostgreSQL using
# the +find_or_create_by+ method and does not return the ID the second time.
existing_object.update!(parsed_relation_hash)
existing_object
end
@existing_object ||= find_or_create_object!
end
def unknown_service?
@ -275,29 +267,17 @@ module Gitlab
def find_or_create_object!
# Can't use IDs as validation exists calilng `.group` or `.project`
finder_hash = { project: @project }.tap do |hash|
finder_hash = parsed_relation_hash.tap do |hash|
hash[:group] = @project.group if relation_class.attribute_method?('group_id')
hash[:project] = @project
hash[:title] = parsed_relation_hash['title'] if parsed_relation_hash['title']
hash.delete('project_id')
end
if label?
label = GroupProjectFinder.find_or_new(Label, finder_hash)
parsed_relation_hash.delete('priorities') if label.persisted?
parsed_relation_hash.delete('type')
label.save!
label
GroupProjectFinder.find_or_new(Label, finder_hash)
else
object = GroupProjectFinder.find_or_create(relation_class, finder_hash)
if milestone?
parsed_relation_hash.delete('group_id') if object.project
parsed_relation_hash.delete('project_id') if object.group
parsed_relation_hash.delete('iid')
parsed_relation_hash.delete('id')
end
object
GroupProjectFinder.find_or_create(relation_class, finder_hash)
end
end

View file

@ -16,15 +16,15 @@ describe Gitlab::ImportExport::GroupProjectFinder do
expect(described_class.find_or_new(Label,
title: 'group label',
'project_id' => project.id,
'group_id' => project.group.id)).to eq(group_label)
project: project,
group: project.group)).to eq(group_label)
end
it 'initializes a new label' do
label = described_class.find_or_new(Label,
title: 'group label',
'project_id' => project.id,
'group_id' => project.group.id)
project: project,
group: project.group)
expect(label.persisted?).to be false
end
@ -32,8 +32,8 @@ describe Gitlab::ImportExport::GroupProjectFinder do
it 'creates a new label' do
label = described_class.find_or_create(Label,
title: 'group label',
'project_id' => project.id,
'group_id' => project.group.id)
project: project,
group: project.group)
expect(label.persisted?).to be true
end
@ -45,24 +45,24 @@ describe Gitlab::ImportExport::GroupProjectFinder do
expect(described_class.find_or_new(Milestone,
title: 'group milestone',
'project_id' => project.id,
'group_id' => project.group.id)).to eq(milestone)
project: project,
group: project.group)).to eq(milestone)
end
it 'initializes a new milestone' do
milestone = described_class.find_or_new(Milestone,
title: 'group milestone',
'project_id' => project.id,
'group_id' => project.group.id)
title: 'group milestone',
project: project,
group: project.group)
expect(milestone.persisted?).to be false
end
it 'creates a new milestone' do
milestone = described_class.find_or_create(Milestone,
title: 'group milestone',
'project_id' => project.id,
'group_id' => project.group.id)
title: 'group milestone',
project: project,
group: project.group)
expect(milestone.persisted?).to be true
end