Merge branch 'make-namespaces-api-available-to-all-users' into 'master'
Make namespace API available to all users ### What does this MR do? This MR makes it possible for a user to query namespaces to which he/she has access. Also, it adds documentation for the existing API. ### Why was this MR needed? Even though the `groups` API exists, it might still be useful to have an endpoint that tells the namespace type (e.g. `user` vs. `group`), especially if a user has access to a number of different projects. ### What are the relevant issue numbers? Closes https://github.com/gitlabhq/gitlabhq/issues/9328 See merge request !708
This commit is contained in:
commit
b9219469f7
7 changed files with 88 additions and 6 deletions
|
@ -14,6 +14,7 @@ v 7.12.0 (unreleased)
|
|||
- Add file attachment support in Milestone description (Stan Hu)
|
||||
- Fix milestone "Browse Issues" button.
|
||||
- Set milestone on new issue when creating issue from index with milestone filter active.
|
||||
- Make namespace API available to all users (Stan Hu)
|
||||
- Add web hook support for note events (Stan Hu)
|
||||
- Disable "New Issue" and "New Merge Request" buttons when features are disabled in project settings (Stan Hu)
|
||||
- Remove Rack Attack monkey patches and bump to version 4.3.0 (Stan Hu)
|
||||
|
|
|
@ -655,6 +655,12 @@ class User < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
def namespaces
|
||||
namespace_ids = groups.pluck(:id)
|
||||
namespace_ids.push(namespace.id)
|
||||
Namespace.where(id: namespace_ids)
|
||||
end
|
||||
|
||||
def oauth_authorized_tokens
|
||||
Doorkeeper::AccessToken.where(resource_owner_id: self.id, revoked_at: nil)
|
||||
end
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
- [Deploy Keys](deploy_keys.md)
|
||||
- [System Hooks](system_hooks.md)
|
||||
- [Groups](groups.md)
|
||||
- [Namespaces](namespaces.md)
|
||||
|
||||
## Clients
|
||||
|
||||
|
|
44
doc/api/namespaces.md
Normal file
44
doc/api/namespaces.md
Normal file
|
@ -0,0 +1,44 @@
|
|||
# Namespaces
|
||||
|
||||
## List namespaces
|
||||
|
||||
Get a list of namespaces. (As user: my namespaces, as admin: all namespaces)
|
||||
|
||||
```
|
||||
GET /namespaces
|
||||
```
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"path": "user1",
|
||||
"kind": "user"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"path": "group1",
|
||||
"kind": "group"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
You can search for namespaces by name or path, see below.
|
||||
|
||||
## Search for namespace
|
||||
|
||||
Get all namespaces that match your string in their name or path.
|
||||
|
||||
```
|
||||
GET /namespaces?search=foobar
|
||||
```
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"path": "user1",
|
||||
"kind": "user"
|
||||
}
|
||||
]
|
||||
```
|
|
@ -1,10 +1,7 @@
|
|||
module API
|
||||
# namespaces API
|
||||
class Namespaces < Grape::API
|
||||
before do
|
||||
authenticate!
|
||||
authenticated_as_admin!
|
||||
end
|
||||
before { authenticate! }
|
||||
|
||||
resource :namespaces do
|
||||
# Get a namespaces list
|
||||
|
@ -12,7 +9,11 @@ module API
|
|||
# Example Request:
|
||||
# GET /namespaces
|
||||
get do
|
||||
@namespaces = Namespace.all
|
||||
@namespaces = if current_user.admin
|
||||
Namespace.all
|
||||
else
|
||||
current_user.namespaces
|
||||
end
|
||||
@namespaces = @namespaces.search(params[:search]) if params[:search].present?
|
||||
@namespaces = paginate @namespaces
|
||||
|
||||
|
|
|
@ -248,6 +248,7 @@ describe User do
|
|||
it { expect(@user.several_namespaces?).to be_truthy }
|
||||
it { expect(@user.authorized_groups).to eq([@group]) }
|
||||
it { expect(@user.owned_groups).to eq([@group]) }
|
||||
it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
|
||||
end
|
||||
|
||||
describe 'group multiple owners' do
|
||||
|
@ -270,6 +271,7 @@ describe User do
|
|||
end
|
||||
|
||||
it { expect(@user.several_namespaces?).to be_falsey }
|
||||
it { expect(@user.namespaces).to eq([@user.namespace]) }
|
||||
end
|
||||
|
||||
describe 'blocking user' do
|
||||
|
|
|
@ -3,6 +3,7 @@ require 'spec_helper'
|
|||
describe API::API, api: true do
|
||||
include ApiHelpers
|
||||
let(:admin) { create(:admin) }
|
||||
let(:user) { create(:user) }
|
||||
let!(:group1) { create(:group) }
|
||||
let!(:group2) { create(:group) }
|
||||
|
||||
|
@ -14,7 +15,7 @@ describe API::API, api: true do
|
|||
end
|
||||
end
|
||||
|
||||
context "when authenticated as admin" do
|
||||
context "when authenticated as admin" do
|
||||
it "admin: should return an array of all namespaces" do
|
||||
get api("/namespaces", admin)
|
||||
expect(response.status).to eq(200)
|
||||
|
@ -22,6 +23,32 @@ describe API::API, api: true do
|
|||
|
||||
expect(json_response.length).to eq(Namespace.count)
|
||||
end
|
||||
|
||||
it "admin: should return an array of matched namespaces" do
|
||||
get api("/namespaces?search=#{group1.name}", admin)
|
||||
expect(response.status).to eq(200)
|
||||
expect(json_response).to be_an Array
|
||||
|
||||
expect(json_response.length).to eq(1)
|
||||
end
|
||||
end
|
||||
|
||||
context "when authenticated as a regular user" do
|
||||
it "user: should return an array of namespaces" do
|
||||
get api("/namespaces", user)
|
||||
expect(response.status).to eq(200)
|
||||
expect(json_response).to be_an Array
|
||||
|
||||
expect(json_response.length).to eq(1)
|
||||
end
|
||||
|
||||
it "admin: should return an array of matched namespaces" do
|
||||
get api("/namespaces?search=#{user.username}", user)
|
||||
expect(response.status).to eq(200)
|
||||
expect(json_response).to be_an Array
|
||||
|
||||
expect(json_response.length).to eq(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue