diff options
Diffstat (limited to 'app/services/members/create_service.rb')
-rw-r--r-- | app/services/members/create_service.rb | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/app/services/members/create_service.rb b/app/services/members/create_service.rb index b453098e27a..ec9a4f9f4a6 100644 --- a/app/services/members/create_service.rb +++ b/app/services/members/create_service.rb @@ -8,18 +8,19 @@ module Members DEFAULT_INVITE_LIMIT = 100 - attr_reader :membership_locked + attr_reader :membership_locked, :http_status def initialize(*args) super @errors = [] + @http_status = nil @invites = invites_from_params @source = params[:source] end def execute - raise Gitlab::Access::AccessDeniedError unless can?(current_user, create_member_permission(source), source) + validate_source_type! if adding_at_least_one_owner && cannot_assign_owner_responsibilities_to_member_in_project? raise Gitlab::Access::AccessDeniedError @@ -65,6 +66,10 @@ module Members params[:user_id].to_s.split(',').uniq end + def validate_source_type! + raise "Unknown source type: #{source.class}!" unless source.is_a?(Group) || source.is_a?(Project) + end + def validate_invite_source! raise ArgumentError, s_('AddMember|No invite source provided.') unless invite_source.present? end @@ -102,6 +107,7 @@ module Members end def process_result(member) + @http_status = :unauthorized if member.errors.added? :base, :unauthorized existing_errors = member.errors.full_messages # calling invalid? clears any errors that were added outside of the @@ -174,7 +180,7 @@ module Members def result if errors.any? - error(formatted_errors) + error(formatted_errors, http_status) else success end @@ -194,17 +200,6 @@ module Members }) ) end - - def create_member_permission(source) - case source - when Group - :admin_group_member - when Project - :admin_project_member - else - raise "Unknown source type: #{source.class}!" - end - end end end |