Commit 6376f784 authored by Douwe Maan's avatar Douwe Maan

Merge branch '39858-add-group-owned-info-to-projects-api' into 'master'

Return group information on Project endpoint

Closes #39858

See merge request gitlab-org/gitlab-ce!27427
parents 604cfb17 1dd4a007
...@@ -51,6 +51,7 @@ class Namespace < ApplicationRecord ...@@ -51,6 +51,7 @@ class Namespace < ApplicationRecord
validate :nesting_level_allowed validate :nesting_level_allowed
delegate :name, to: :owner, allow_nil: true, prefix: true delegate :name, to: :owner, allow_nil: true, prefix: true
delegate :avatar_url, to: :owner, allow_nil: true
after_commit :refresh_access_of_projects_invited_groups, on: :update, if: -> { previous_changes.key?('share_with_group_lock') } after_commit :refresh_access_of_projects_invited_groups, on: :update, if: -> { previous_changes.key?('share_with_group_lock') }
...@@ -149,6 +150,10 @@ class Namespace < ApplicationRecord ...@@ -149,6 +150,10 @@ class Namespace < ApplicationRecord
type == 'Group' ? 'group' : 'user' type == 'Group' ? 'group' : 'user'
end end
def user?
kind == 'user'
end
def find_fork_of(project) def find_fork_of(project)
return unless project.fork_network return unless project.fork_network
......
...@@ -494,7 +494,9 @@ GET /projects/:id ...@@ -494,7 +494,9 @@ GET /projects/:id
"name": "Diaspora", "name": "Diaspora",
"path": "diaspora", "path": "diaspora",
"kind": "group", "kind": "group",
"full_path": "diaspora" "full_path": "diaspora",
"avatar_url": "http://localhost:3000/uploads/group/avatar/3/foo.jpg",
"web_url": "http://localhost:3000/groups/diaspora"
}, },
"import_status": "none", "import_status": "none",
"import_error": null, "import_error": null,
...@@ -561,6 +563,8 @@ GET /projects/:id ...@@ -561,6 +563,8 @@ GET /projects/:id
} }
``` ```
**Note**: The `web_url` and `avatar_url` attributes on `namespace` were [introduced][ce-27427] in GitLab 11.11.
If the project is a fork, and you provide a valid token to authenticate, the If the project is a fork, and you provide a valid token to authenticate, the
`forked_from_project` field will appear in the response. `forked_from_project` field will appear in the response.
...@@ -1587,3 +1591,4 @@ GET /projects/:id/snapshot ...@@ -1587,3 +1591,4 @@ GET /projects/:id/snapshot
[eep]: https://about.gitlab.com/pricing/ "Available only in GitLab Premium" [eep]: https://about.gitlab.com/pricing/ "Available only in GitLab Premium"
[ee-6137]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/6137 [ee-6137]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/6137
[ce-27427]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/27427
...@@ -922,7 +922,15 @@ module API ...@@ -922,7 +922,15 @@ module API
end end
class NamespaceBasic < Grape::Entity class NamespaceBasic < Grape::Entity
expose :id, :name, :path, :kind, :full_path, :parent_id expose :id, :name, :path, :kind, :full_path, :parent_id, :avatar_url
expose :web_url do |namespace|
if namespace.user?
Gitlab::Routing.url_helpers.user_url(namespace.owner)
else
namespace.web_url
end
end
end end
class Namespace < NamespaceBasic class Namespace < NamespaceBasic
......
...@@ -63,6 +63,11 @@ describe Namespace do ...@@ -63,6 +63,11 @@ describe Namespace do
end end
end end
describe 'delegate' do
it { is_expected.to delegate_method(:name).to(:owner).with_prefix.with_arguments(allow_nil: true) }
it { is_expected.to delegate_method(:avatar_url).to(:owner).with_arguments(allow_nil: true) }
end
describe "Respond to" do describe "Respond to" do
it { is_expected.to respond_to(:human_name) } it { is_expected.to respond_to(:human_name) }
it { is_expected.to respond_to(:to_param) } it { is_expected.to respond_to(:to_param) }
...@@ -801,4 +806,21 @@ describe Namespace do ...@@ -801,4 +806,21 @@ describe Namespace do
end end
end end
end end
describe '#user?' do
subject { namespace.user? }
context 'when type is a user' do
let(:user) { create(:user) }
let(:namespace) { user.namespace }
it { is_expected.to be_truthy }
end
context 'when type is a group' do
let(:namespace) { create(:group) }
it { is_expected.to be_falsy }
end
end
end end
...@@ -1047,7 +1047,6 @@ describe API::Projects do ...@@ -1047,7 +1047,6 @@ describe API::Projects do
expect(json_response['http_url_to_repo']).to be_present expect(json_response['http_url_to_repo']).to be_present
expect(json_response['web_url']).to be_present expect(json_response['web_url']).to be_present
expect(json_response['owner']).to be_a Hash expect(json_response['owner']).to be_a Hash
expect(json_response['owner']).to be_a Hash
expect(json_response['name']).to eq(project.name) expect(json_response['name']).to eq(project.name)
expect(json_response['path']).to be_present expect(json_response['path']).to be_present
expect(json_response['issues_enabled']).to be_present expect(json_response['issues_enabled']).to be_present
...@@ -1135,7 +1134,9 @@ describe API::Projects do ...@@ -1135,7 +1134,9 @@ describe API::Projects do
'path' => user.namespace.path, 'path' => user.namespace.path,
'kind' => user.namespace.kind, 'kind' => user.namespace.kind,
'full_path' => user.namespace.full_path, 'full_path' => user.namespace.full_path,
'parent_id' => nil 'parent_id' => nil,
'avatar_url' => user.avatar_url,
'web_url' => Gitlab::Routing.url_helpers.user_url(user)
}) })
end end
...@@ -1337,6 +1338,37 @@ describe API::Projects do ...@@ -1337,6 +1338,37 @@ describe API::Projects do
end end
end end
end end
context 'when project belongs to a group namespace' do
let(:group) { create(:group, :with_avatar) }
let(:project) { create(:project, namespace: group) }
let!(:project_member) { create(:project_member, :developer, user: user, project: project) }
it 'returns group web_url and avatar_url' do
get api("/projects/#{project.id}", user)
expect(response).to have_gitlab_http_status(200)
group_data = json_response['namespace']
expect(group_data['web_url']).to eq(group.web_url)
expect(group_data['avatar_url']).to eq(group.avatar_url)
end
end
context 'when project belongs to a user namespace' do
let(:user) { create(:user) }
let(:project) { create(:project, namespace: user.namespace) }
it 'returns user web_url and avatar_url' do
get api("/projects/#{project.id}", user)
expect(response).to have_gitlab_http_status(200)
user_data = json_response['namespace']
expect(user_data['web_url']).to eq("http://localhost/#{user.username}")
expect(user_data['avatar_url']).to eq(user.avatar_url)
end
end
end end
context 'with external authorization' do context 'with external authorization' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment