debian-mirror-gitlab/app/services/groups/group_links/create_service.rb

54 lines
1.5 KiB
Ruby
Raw Normal View History

2019-12-26 22:10:19 +05:30
# frozen_string_literal: true
module Groups
module GroupLinks
2021-04-29 21:17:54 +05:30
class CreateService < Groups::BaseService
2021-09-04 01:27:46 +05:30
def initialize(shared_group, shared_with_group, user, params)
@shared_group = shared_group
super(shared_with_group, user, params)
end
def execute
unless shared_with_group && shared_group &&
2020-06-23 00:09:42 +05:30
can?(current_user, :admin_group_member, shared_group) &&
2021-09-04 01:27:46 +05:30
can?(current_user, :read_group, shared_with_group) &&
sharing_allowed?
2019-12-26 22:10:19 +05:30
return error('Not Found', 404)
end
link = GroupGroupLink.new(
shared_group: shared_group,
2021-09-04 01:27:46 +05:30
shared_with_group: shared_with_group,
2019-12-26 22:10:19 +05:30
group_access: params[:shared_group_access],
expires_at: params[:expires_at]
)
if link.save
2021-09-30 23:02:18 +05:30
shared_with_group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
2019-12-26 22:10:19 +05:30
success(link: link)
else
error(link.errors.full_messages.to_sentence, 409)
end
end
2021-09-04 01:27:46 +05:30
private
attr_reader :shared_group
alias_method :shared_with_group, :group
def sharing_allowed?
sharing_outside_hierarchy_allowed? || within_hierarchy?
end
def sharing_outside_hierarchy_allowed?
!shared_group.root_ancestor.namespace_settings.prevent_sharing_groups_outside_hierarchy
end
def within_hierarchy?
shared_group.root_ancestor.self_and_descendants_ids.include?(shared_with_group.id)
end
2019-12-26 22:10:19 +05:30
end
end
end