summaryrefslogtreecommitdiff
path: root/app/services/concerns
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-04-29 21:10:44 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-04-29 21:10:44 +0000
commitcb37aee9894007e60893693d5d48199ea0f0958f (patch)
tree49cfdd627a74b5f3f94b0a498a39e3be3b38af33 /app/services/concerns
parent888564d614552b19b44029f530a67592d66c06fd (diff)
downloadgitlab-ce-cb37aee9894007e60893693d5d48199ea0f0958f.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/concerns')
-rw-r--r--app/services/concerns/group_linkable.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/services/concerns/group_linkable.rb b/app/services/concerns/group_linkable.rb
new file mode 100644
index 00000000000..3e2e9cfd5eb
--- /dev/null
+++ b/app/services/concerns/group_linkable.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module GroupLinkable
+ extend ActiveSupport::Concern
+
+ def execute
+ return error('Not Found', 404) unless valid_to_create?
+
+ build_link
+
+ if link.save
+ after_successful_save
+ success(link: link)
+ else
+ error(link.errors.full_messages.to_sentence, 409)
+ end
+ end
+
+ private
+
+ attr_reader :shared_with_group, :link
+
+ def sharing_allowed?
+ sharing_outside_hierarchy_allowed? || within_hierarchy?
+ end
+
+ def sharing_outside_hierarchy_allowed?
+ !root_ancestor.namespace_settings.prevent_sharing_groups_outside_hierarchy
+ end
+
+ def within_hierarchy?
+ root_ancestor.self_and_descendants_ids.include?(shared_with_group.id)
+ end
+
+ def after_successful_save
+ setup_authorizations
+ end
+end