gitlab-org--gitlab-foss/app/services/labels/find_or_create_service.rb

42 lines
1.1 KiB
Ruby
Raw Normal View History

2016-10-17 22:11:33 -04:00
module Labels
class FindOrCreateService
2016-10-17 22:11:33 -04:00
def initialize(current_user, project, params = {})
@current_user = current_user
@project = project
2017-03-29 07:45:15 -04:00
@params = params.dup.with_indifferent_access
2016-10-17 22:11:33 -04:00
end
def execute(skip_authorization: false)
@skip_authorization = skip_authorization
2016-10-17 22:11:33 -04:00
find_or_create_label
end
private
attr_reader :current_user, :project, :params, :skip_authorization
2016-10-17 22:11:33 -04:00
def available_labels
@available_labels ||= LabelsFinder.new(
current_user,
project_id: project.id
).execute(skip_authorization: skip_authorization)
2016-10-17 22:11:33 -04:00
end
# Only creates the label if current_user can do so, if the label does not exist
# and the user can not create the label, nil is returned
2016-10-17 22:11:33 -04:00
def find_or_create_label
new_label = available_labels.find_by(title: title)
if new_label.nil? && (skip_authorization || Ability.allowed?(current_user, :admin_label, project))
2017-03-29 07:45:15 -04:00
new_label = Labels::CreateService.new(params).execute(project: project)
end
2016-10-17 22:11:33 -04:00
new_label
end
def title
params[:title] || params[:name]
end
end
end