Skip to content
Snippets Groups Projects
Commit 9ed3767c authored by Sean Carroll's avatar Sean Carroll :rocket:
Browse files

Support Group Milestones to be associated with Project Releases in API

Closes #235391

See merge request !43385
parent b07ee32e
No related branches found
No related tags found
No related merge requests found
# Finders
This type of classes responsible for collection items based on different conditions.
To prevent lookup methods in models like this:
These types of classes are responsible for retrieving collection items based on different conditions.
They prevent lookup methods in models like this:
```ruby
class Project
class Project < ApplicationRecord
def issues_for_user_filtered_by(user, filter)
# A lot of logic not related to project model itself
end
......@@ -13,7 +13,7 @@ end
issues = project.issues_for_user_filtered_by(user, params)
```
Better use this:
The GitLab approach is to use a Finder:
```ruby
issues = IssuesFinder.new(project, user, filter).execute
......
......@@ -5,11 +5,22 @@ class MilestoneRelease < ApplicationRecord
belongs_to :release
validate :same_project_between_milestone_and_release
validate :same_project_between_milestone_and_group
private
def same_project_between_milestone_and_release
return if milestone&.project_id == release&.project_id
return unless milestone&.project_id
return if milestone.project_id == release&.project_id
errors.add(:base, _('Release does not have the same project as the milestone'))
end
def same_project_between_milestone_and_group
return unless milestone&.group_id
return if milestone.group.projects.map(&:id).include?(release&.project_id)
errors.add(:base, _('Release does not have the same project as the milestone'))
end
......
......@@ -56,6 +56,7 @@ def milestones
project: project,
current_user: current_user,
project_ids: Array(project.id),
group_ids: project_group_id,
state: 'all',
title: params[:milestones]
).execute
......@@ -72,6 +73,11 @@ def inexistent_milestones
def param_for_milestone_titles_provided?
params.key?(:milestones)
end
# overridden in EE
def project_group_id
project.group&.id
end
end
end
end
......@@ -116,5 +116,42 @@
expect(result[:milestones_updated]).to be_truthy
end
end
context 'group milestones' do
let(:project) { create(:project, :repository, group: group) }
let(:group) { create(:group) }
let(:service) { described_class.new(project, user, params_with_milestones) }
context 'when a group milestone is passed' do
let(:group_milestone) { create(:milestone, group: group, title: 'g1') }
let(:params_with_milestones) { params.merge!({ milestones: [group_milestone.title] }) }
context 'when there is no project milestone' do
it 'adds the group milestone' do
result = service.execute
release.reload
expect(release.milestones).to match_array([group_milestone])
expect(result[:milestones_updated]).to be_truthy
end
end
context 'when there is an existing project milestone' do
let(:project_milestone) { create(:milestone, project: project, title: 'p1') }
before do
release.milestones << project_milestone
end
it 'replaces the project milestone with the group milestone' do
result = service.execute
release.reload
expect(release.milestones).to match_array([group_milestone])
expect(result[:milestones_updated]).to be_truthy
end
end
end
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment