Welcome to mirror list, hosted at ThFree Co, Russian Federation.

approve_access_request_service.rb « members « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 2a2bb0cae5b011d5c69eb3ccd2259de902c8649c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
module Members
  class ApproveAccessRequestService < BaseService
    include MembersHelper

    attr_accessor :source

    # source - The source object that respond to `#requesters` (i.g. project or group)
    # current_user - The user that performs the access request approval
    # params - A hash of parameters
    #   :user_id - User ID used to retrieve the access requester
    #   :id - Member ID used to retrieve the access requester
    #   :access_level - Optional access level set when the request is accepted
    def initialize(source, current_user, params = {})
      @source = source
      @current_user = current_user
      @params = params.slice(:user_id, :id, :access_level)
    end

    # opts - A hash of options
    #   :force - Bypass permission check: current_user can be nil in that case
    def execute(opts = {})
      condition = params[:user_id] ? { user_id: params[:user_id] } : { id: params[:id] }
      access_requester = source.requesters.find_by!(condition)

      raise Gitlab::Access::AccessDeniedError unless can_update_access_requester?(access_requester, opts)

      access_requester.access_level = params[:access_level] if params[:access_level]
      access_requester.accept_request

      access_requester
    end

    private

    def can_update_access_requester?(access_requester, opts = {})
      access_requester && (
        opts[:force] ||
        can?(current_user, update_member_permission(access_requester), access_requester)
      )
    end

    def update_member_permission(member)
      case member
      when GroupMember
        :update_group_member
      when ProjectMember
        :update_project_member
      end
    end
  end
end