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

access_requests.rb « api « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 38a9856ca585dd53c4dd7a68546cd46e245f673a (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# frozen_string_literal: true

module API
  class AccessRequests < ::API::Base
    include PaginationParams

    before { authenticate! }

    helpers ::API::Helpers::MembersHelpers

    feature_category :authentication_and_authorization

    %w[group project].each do |source_type|
      params do
        requires :id, type: String,
                      desc: "The ID or URL-encoded path of the #{source_type} owned by the authenticated user"
      end
      resource source_type.pluralize, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
        desc "Gets a list of access requests for a #{source_type}." do
          detail 'This feature was introduced in GitLab 8.11.'
          success Entities::AccessRequester
          tags %w[access_requests]
        end
        params do
          use :pagination
        end
        # rubocop: disable CodeReuse/ActiveRecord
        get ":id/access_requests" do
          source = find_source(source_type, params[:id])

          access_requesters = AccessRequestsFinder.new(source).execute!(current_user)
          access_requesters = paginate(access_requesters.includes(:user))

          present access_requesters, with: Entities::AccessRequester
        end
        # rubocop: enable CodeReuse/ActiveRecord

        desc "Requests access for the authenticated user to a #{source_type}." do
          detail 'This feature was introduced in GitLab 8.11.'
          success Entities::AccessRequester
          success [
            {
              code: 200,
              model: Entities::AccessRequester,
              message: 'successful operation',
              examples: {
                successfull_response: {
                  "id" => 1,
                  "username" => "raymond_smith",
                  "name" => "Raymond Smith",
                  "state" => "active",
                  "created_at" => "2012-10-22T14:13:35Z",
                  "access_level" => 20
                }
              }
            }
          ]
          tags %w[access_requests]
        end
        post ":id/access_requests" do
          source = find_source(source_type, params[:id])
          access_requester = source.request_access(current_user)

          if access_requester.persisted?
            present access_requester, with: Entities::AccessRequester
          else
            render_validation_error!(access_requester)
          end
        end

        desc 'Approves an access request for the given user.' do
          detail 'This feature was introduced in GitLab 8.11.'
          success [
            {
              code: 200,
              model: Entities::AccessRequester,
              message: 'successful operation',
              examples: {
                successfull_response: {
                  "id" => 1,
                  "username" => "raymond_smith",
                  "name" => "Raymond Smith",
                  "state" => "active",
                  "created_at" => "2012-10-22T14:13:35Z",
                  "access_level" => 20
                }
              }
            }
          ]
          tags %w[access_requests]
        end
        params do
          requires :user_id, type: Integer, desc: 'The user ID of the access requester'
          optional :access_level, type: Integer, desc: 'A valid access level (defaults: `30`, the Developer role)',
                                  default: 30
        end
        # rubocop: disable CodeReuse/ActiveRecord
        put ':id/access_requests/:user_id/approve' do
          source = find_source(source_type, params[:id])

          access_requester = source.requesters.find_by!(user_id: params[:user_id])
          member = ::Members::ApproveAccessRequestService
            .new(current_user, declared_params)
            .execute(access_requester)

          status :created
          present member, with: Entities::Member
        end
        # rubocop: enable CodeReuse/ActiveRecord

        desc 'Denies an access request for the given user.' do
          detail 'This feature was introduced in GitLab 8.11.'
          tags %w[access_requests]
        end
        params do
          requires :user_id, type: Integer, desc: 'The user ID of the access requester'
        end
        # rubocop: disable CodeReuse/ActiveRecord
        delete ":id/access_requests/:user_id" do
          source = find_source(source_type, params[:id])
          member = source.requesters.find_by!(user_id: params[:user_id])

          destroy_conditionally!(member) do
            ::Members::DestroyService.new(current_user).execute(member)
          end
        end
        # rubocop: enable CodeReuse/ActiveRecord
      end
    end
  end
end