summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Maczukin <tomasz@maczukin.pl>2017-11-17 02:43:55 +0100
committerTomasz Maczukin <tomasz@maczukin.pl>2017-11-23 14:34:34 +0100
commit392cc887097bfd0c28b547700b9a67c32cf14e69 (patch)
treec63c9bb1b2420f0140371ccd90e91c173b1e274c
parentb8db9c8c8c406d4abc03ba7246bbfecbecfbc784 (diff)
downloadgitlab-ce-392cc887097bfd0c28b547700b9a67c32cf14e69.tar.gz
Add new API endpoint - get a namespace by ID
-rw-r--r--doc/api/namespaces.md32
-rw-r--r--lib/api/namespaces.rb24
-rw-r--r--spec/requests/api/namespaces_spec.rb69
3 files changed, 125 insertions, 0 deletions
diff --git a/doc/api/namespaces.md b/doc/api/namespaces.md
index 5c0bebbaeb0..d06b0d31c67 100644
--- a/doc/api/namespaces.md
+++ b/doc/api/namespaces.md
@@ -89,3 +89,35 @@ Example response:
}
]
```
+
+## Get namespace by ID
+
+Get a namespace by ID.
+
+```
+GET /namespaces/:id
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer | yes | ID of the namespace |
+
+Example request:
+
+```bash
+curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/namespaces/2
+```
+
+Example response:
+
+```json
+{
+ "id": 2,
+ "name": "group1",
+ "path": "group1",
+ "kind": "group",
+ "full_path": "group1",
+ "parent_id": "null",
+ "members_count_with_descendants": 2
+}
+```
diff --git a/lib/api/namespaces.rb b/lib/api/namespaces.rb
index f1eaff6b0eb..21dc5009d0e 100644
--- a/lib/api/namespaces.rb
+++ b/lib/api/namespaces.rb
@@ -19,6 +19,30 @@ module API
present paginate(namespaces), with: Entities::Namespace, current_user: current_user
end
+
+ desc 'Get a namespace by ID' do
+ success Entities::Namespace
+ end
+ params do
+ requires :id, type: Integer, desc: "Namespace's ID"
+ end
+ get ':id' do
+ namespace = Namespace.find(params[:id])
+ authenticate_get_namespace!(namespace)
+
+ present namespace, with: Entities::Namespace, current_user: current_user
+ end
+ end
+
+ helpers do
+ def authenticate_get_namespace!(namespace)
+ return if current_user.admin?
+ forbidden!('No access granted') unless user_can_access_namespace?(namespace)
+ end
+
+ def user_can_access_namespace?(namespace)
+ namespace.has_owner?(current_user)
+ end
end
end
end
diff --git a/spec/requests/api/namespaces_spec.rb b/spec/requests/api/namespaces_spec.rb
index e60716d46d7..80698e1ff74 100644
--- a/spec/requests/api/namespaces_spec.rb
+++ b/spec/requests/api/namespaces_spec.rb
@@ -91,4 +91,73 @@ describe API::Namespaces do
end
end
end
+
+ describe 'GET /namespaces/:id' do
+ let(:owned_group) { group1 }
+
+ shared_examples 'namespace reader' do
+ before do
+ owned_group.add_owner(request_actor)
+ end
+
+ context 'when namespace exists' do
+ it 'returns namespace details' do
+ get api("/namespaces/#{owned_group.id}", request_actor)
+
+ expect(response).to have_gitlab_http_status(200)
+
+ expect(json_response['id']).to eq(owned_group.id)
+ expect(json_response['name']).to eq(owned_group.name)
+ end
+ end
+
+ context "when namespace doesn't exist" do
+ it 'returns not-found' do
+ get api('/namespaces/9999', request_actor)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+
+ context 'when unauthenticated' do
+ it 'returns authentication error' do
+ get api("/namespaces/#{group1.id}")
+
+ expect(response).to have_gitlab_http_status(401)
+ end
+ end
+
+ context 'when authenticated as regular user' do
+ let(:request_actor) { user }
+
+ context 'when requested namespace is not owned by user' do
+ it 'returns authentication error' do
+ get api("/namespaces/#{group2.id}", request_actor)
+
+ expect(response).to have_gitlab_http_status(403)
+ end
+ end
+
+ context 'when requested namespace is owned by user' do
+ it_behaves_like 'namespace reader'
+ end
+ end
+
+ context 'when authenticated as admin' do
+ let(:request_actor) { admin }
+
+ context 'when requested namespace is not owned by user' do
+ it 'returns authentication error' do
+ get api("/namespaces/#{group2.id}", request_actor)
+
+ expect(response).to have_gitlab_http_status(200)
+ end
+ end
+
+ context 'when requested namespace is owned by user' do
+ it_behaves_like 'namespace reader'
+ end
+ end
+ end
end