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
This commit is contained in:
commit
6376f78445
5 changed files with 76 additions and 4 deletions
|
@ -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
|
||||||
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
|
||||||
"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
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**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
|
||||||
|
|
||||||
[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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
'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
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue