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
|