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 :system_access
%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
|