Merge "Add REST endpoints to retrieve group members and included groups"
This commit is contained in:
@@ -315,6 +315,53 @@ and accepts the same options as query parameters.
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
|
[[group-members]]
|
||||||
|
/groups/*/members/ (List Group Members)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Lists the members of a group.
|
||||||
|
|
||||||
|
----
|
||||||
|
)]}'
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"kind": "gerritcodereview#member",
|
||||||
|
"full_name": "Jane Roe",
|
||||||
|
"id": "1000097",
|
||||||
|
"account_id": 1000097,
|
||||||
|
"preferred_email": "jane.roe@example.com",
|
||||||
|
"user_name": "jane"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"kind": "gerritcodereview#member",
|
||||||
|
"full_name": "John Doe",
|
||||||
|
"id": "1000096",
|
||||||
|
"account_id": 1000096,
|
||||||
|
"preferred_email": "john.doe@example.com",
|
||||||
|
"user_name": "doe"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
----
|
||||||
|
|
||||||
|
[[included-groups]]
|
||||||
|
/groups/*/groups/ (List Included Groups)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Lists the included groups of a group.
|
||||||
|
|
||||||
|
----
|
||||||
|
)]}'
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"kind": "gerritcodereview#group",
|
||||||
|
"id": "uuid-7ca042f4d5847936fcb90ca91057673157fd06fc",
|
||||||
|
"name": "MyProject-Verifiers",
|
||||||
|
"uuid": "7ca042f4d5847936fcb90ca91057673157fd06fc",
|
||||||
|
"group_id": 38,
|
||||||
|
"is_visible_to_all": false,
|
||||||
|
"owner_uuid": "7ca042f4d5847936fcb90ca91057673157fd06fc"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
----
|
||||||
|
|
||||||
[[changes]]
|
[[changes]]
|
||||||
/changes/ (Query Changes)
|
/changes/ (Query Changes)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class AccountResource implements RestResource {
|
|||||||
|
|
||||||
private final IdentifiedUser user;
|
private final IdentifiedUser user;
|
||||||
|
|
||||||
AccountResource(IdentifiedUser user) {
|
public AccountResource(IdentifiedUser user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,15 @@ public class GroupControl {
|
|||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GroupControl validateFor(final AccountGroup.UUID groupUUID)
|
||||||
|
throws NoSuchGroupException {
|
||||||
|
final GroupControl c = controlFor(groupUUID);
|
||||||
|
if (!c.isVisible()) {
|
||||||
|
throw new NoSuchGroupException(groupUUID);
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final CurrentUser user;
|
private final CurrentUser user;
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import com.google.gerrit.server.account.EmailExpander;
|
|||||||
import com.google.gerrit.server.account.GroupBackend;
|
import com.google.gerrit.server.account.GroupBackend;
|
||||||
import com.google.gerrit.server.account.GroupCacheImpl;
|
import com.google.gerrit.server.account.GroupCacheImpl;
|
||||||
import com.google.gerrit.server.account.GroupControl;
|
import com.google.gerrit.server.account.GroupControl;
|
||||||
|
import com.google.gerrit.server.account.GroupDetailFactory;
|
||||||
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
|
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
|
||||||
import com.google.gerrit.server.account.GroupInfoCacheFactory;
|
import com.google.gerrit.server.account.GroupInfoCacheFactory;
|
||||||
import com.google.gerrit.server.account.IncludingGroupMembership;
|
import com.google.gerrit.server.account.IncludingGroupMembership;
|
||||||
@@ -154,6 +155,7 @@ public class GerritGlobalModule extends FactoryModule {
|
|||||||
factory(ChangeQueryBuilder.Factory.class);
|
factory(ChangeQueryBuilder.Factory.class);
|
||||||
factory(GroupInfoCacheFactory.Factory.class);
|
factory(GroupInfoCacheFactory.Factory.class);
|
||||||
factory(VisibleGroups.Factory.class);
|
factory(VisibleGroups.Factory.class);
|
||||||
|
factory(GroupDetailFactory.Factory.class);
|
||||||
factory(InternalUser.Factory.class);
|
factory(InternalUser.Factory.class);
|
||||||
factory(ProjectNode.Factory.class);
|
factory(ProjectNode.Factory.class);
|
||||||
factory(ProjectState.Factory.class);
|
factory(ProjectState.Factory.class);
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import com.google.gerrit.server.ApprovalsUtil;
|
|||||||
import com.google.gerrit.server.IdentifiedUser;
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
import com.google.gerrit.server.RequestCleanup;
|
import com.google.gerrit.server.RequestCleanup;
|
||||||
import com.google.gerrit.server.account.AccountControl;
|
import com.google.gerrit.server.account.AccountControl;
|
||||||
import com.google.gerrit.server.account.GroupDetailFactory;
|
|
||||||
import com.google.gerrit.server.account.GroupMembers;
|
import com.google.gerrit.server.account.GroupMembers;
|
||||||
import com.google.gerrit.server.account.PerformCreateGroup;
|
import com.google.gerrit.server.account.PerformCreateGroup;
|
||||||
import com.google.gerrit.server.account.PerformRenameGroup;
|
import com.google.gerrit.server.account.PerformRenameGroup;
|
||||||
@@ -84,7 +83,6 @@ public class GerritRequestModule extends FactoryModule {
|
|||||||
factory(MergeFailSender.Factory.class);
|
factory(MergeFailSender.Factory.class);
|
||||||
factory(PerformCreateGroup.Factory.class);
|
factory(PerformCreateGroup.Factory.class);
|
||||||
factory(PerformRenameGroup.Factory.class);
|
factory(PerformRenameGroup.Factory.class);
|
||||||
factory(GroupDetailFactory.Factory.class);
|
|
||||||
factory(GroupMembers.Factory.class);
|
factory(GroupMembers.Factory.class);
|
||||||
factory(CreateProject.Factory.class);
|
factory(CreateProject.Factory.class);
|
||||||
factory(SuggestParentCandidates.Factory.class);
|
factory(SuggestParentCandidates.Factory.class);
|
||||||
|
|||||||
@@ -28,14 +28,18 @@ class GetGroup implements RestReadView<GroupResource> {
|
|||||||
@Override
|
@Override
|
||||||
public Object apply(GroupResource resource) throws AuthException,
|
public Object apply(GroupResource resource) throws AuthException,
|
||||||
BadRequestException, ResourceConflictException, Exception {
|
BadRequestException, ResourceConflictException, Exception {
|
||||||
GroupDescription.Basic group = resource.getControl().getGroup();
|
return parse(resource.getControl().getGroup());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GroupInfo parse(final GroupDescription.Basic group) {
|
||||||
GroupInfo info = new GroupInfo();
|
GroupInfo info = new GroupInfo();
|
||||||
info.name = resource.getName();
|
info.name = group.getName();
|
||||||
info.uuid = resource.getGroupUUID().get();
|
info.uuid = group.getGroupUUID().get();
|
||||||
info.isVisibleToAll = group.isVisibleToAll();
|
info.isVisibleToAll = group.isVisibleToAll();
|
||||||
if (group instanceof GroupDescription.Internal) {
|
if (group instanceof GroupDescription.Internal) {
|
||||||
final AccountGroup internalGroup =
|
final AccountGroup internalGroup =
|
||||||
((GroupDescription.Internal) group).getAccountGroup();
|
((GroupDescription.Internal) group).getAccountGroup();
|
||||||
|
info.groupId = internalGroup.getId().get();
|
||||||
info.description = Strings.emptyToNull(internalGroup.getDescription());
|
info.description = Strings.emptyToNull(internalGroup.getDescription());
|
||||||
info.ownerUuid = internalGroup.getOwnerGroupUUID().get();
|
info.ownerUuid = internalGroup.getOwnerGroupUUID().get();
|
||||||
}
|
}
|
||||||
@@ -43,11 +47,12 @@ class GetGroup implements RestReadView<GroupResource> {
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class GroupInfo {
|
public static class GroupInfo {
|
||||||
final String kind = "gerritcodereview#group";
|
final String kind = "gerritcodereview#group";
|
||||||
String id;
|
String id;
|
||||||
String name;
|
String name;
|
||||||
String uuid;
|
String uuid;
|
||||||
|
int groupId;
|
||||||
String description;
|
String description;
|
||||||
boolean isVisibleToAll;
|
boolean isVisibleToAll;
|
||||||
String ownerUuid;
|
String ownerUuid;
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||||
|
import com.google.gerrit.server.group.GetGroup.GroupInfo;
|
||||||
|
|
||||||
|
public class GetIncludedGroup implements RestReadView<IncludedGroupResource> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GroupInfo apply(final IncludedGroupResource resource) throws AuthException,
|
||||||
|
BadRequestException, ResourceConflictException, Exception {
|
||||||
|
return GetGroup.parse(resource.getControl().getGroup());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||||
|
import com.google.gerrit.server.group.MembersCollection.MemberInfo;
|
||||||
|
|
||||||
|
public class GetMember implements RestReadView<MemberResource> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MemberInfo apply(final MemberResource resource) throws AuthException,
|
||||||
|
BadRequestException, ResourceConflictException, Exception {
|
||||||
|
return MembersCollection.parse(resource.getUser().getAccount());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -72,7 +72,12 @@ public class GroupsCollection implements
|
|||||||
} else if(!(user instanceof IdentifiedUser)) {
|
} else if(!(user instanceof IdentifiedUser)) {
|
||||||
throw new ResourceNotFoundException(id);
|
throw new ResourceNotFoundException(id);
|
||||||
}
|
}
|
||||||
|
return parse(id, groupControlFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GroupResource parse(final String id,
|
||||||
|
final GroupControl.Factory groupControlFactory)
|
||||||
|
throws ResourceNotFoundException {
|
||||||
final String decodedId = Url.decode(id);
|
final String decodedId = Url.decode(id);
|
||||||
final GroupControl ctl;
|
final GroupControl ctl;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.restapi.RestView;
|
||||||
|
import com.google.gerrit.server.account.GroupControl;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
|
public class IncludedGroupResource extends GroupResource {
|
||||||
|
public static final TypeLiteral<RestView<IncludedGroupResource>> INCLUDED_GROUP_KIND =
|
||||||
|
new TypeLiteral<RestView<IncludedGroupResource>>() {};
|
||||||
|
|
||||||
|
IncludedGroupResource(final GroupControl control) {
|
||||||
|
super(control);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.common.data.GroupDetail;
|
||||||
|
import com.google.gerrit.extensions.registration.DynamicMap;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ChildCollection;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestView;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroupInclude;
|
||||||
|
import com.google.gerrit.server.account.GroupCache;
|
||||||
|
import com.google.gerrit.server.account.GroupControl;
|
||||||
|
import com.google.gerrit.server.account.GroupDetailFactory;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Provider;
|
||||||
|
|
||||||
|
public class IncludedGroupsCollection implements
|
||||||
|
ChildCollection<GroupResource, IncludedGroupResource> {
|
||||||
|
|
||||||
|
private final DynamicMap<RestView<IncludedGroupResource>> views;
|
||||||
|
private final Provider<ListIncludedGroups> list;
|
||||||
|
private final GroupControl.Factory groupControlFactory;
|
||||||
|
private final GroupCache groupCache;
|
||||||
|
private final GroupDetailFactory.Factory groupDetailFactory;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
IncludedGroupsCollection(final DynamicMap<RestView<IncludedGroupResource>> views,
|
||||||
|
final Provider<ListIncludedGroups> list,
|
||||||
|
final GroupControl.Factory groupControlFactory,
|
||||||
|
final GroupCache groupCache,
|
||||||
|
final GroupDetailFactory.Factory groupDetailFactory) {
|
||||||
|
this.views = views;
|
||||||
|
this.list = list;
|
||||||
|
this.groupControlFactory = groupControlFactory;
|
||||||
|
this.groupCache = groupCache;
|
||||||
|
this.groupDetailFactory = groupDetailFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RestView<GroupResource> list() throws ResourceNotFoundException,
|
||||||
|
AuthException {
|
||||||
|
return list.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IncludedGroupResource parse(final GroupResource parent, final String id)
|
||||||
|
throws ResourceNotFoundException, Exception {
|
||||||
|
final GroupResource groupResource =
|
||||||
|
GroupsCollection.parse(id, groupControlFactory);
|
||||||
|
final AccountGroup group =
|
||||||
|
groupCache.get(parent.getControl().getGroup().getGroupUUID());
|
||||||
|
final GroupDetail groupDetail =
|
||||||
|
groupDetailFactory.create(group.getId()).call();
|
||||||
|
if (groupDetail.includes != null) {
|
||||||
|
for (final AccountGroupInclude groupInclude : groupDetail.includes) {
|
||||||
|
final AccountGroup includedGroup =
|
||||||
|
groupCache.get(groupInclude.getIncludeId());
|
||||||
|
if (includedGroup.getGroupUUID().equals(groupResource.getGroupUUID())) {
|
||||||
|
return new IncludedGroupResource(groupResource.getControl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new ResourceNotFoundException(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DynamicMap<RestView<IncludedGroupResource>> views() {
|
||||||
|
return views;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.gerrit.common.data.GroupDescriptions;
|
||||||
|
import com.google.gerrit.common.data.GroupDetail;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroupInclude;
|
||||||
|
import com.google.gerrit.server.account.GroupCache;
|
||||||
|
import com.google.gerrit.server.account.GroupControl;
|
||||||
|
import com.google.gerrit.server.account.GroupDetailFactory;
|
||||||
|
import com.google.gerrit.server.group.GetGroup.GroupInfo;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ListIncludedGroups implements RestReadView<GroupResource> {
|
||||||
|
private final GroupControl.Factory groupControlFactory;
|
||||||
|
private final GroupCache groupCache;
|
||||||
|
private final GroupDetailFactory.Factory groupDetailFactory;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ListIncludedGroups(final GroupControl.Factory groupControlFactory,
|
||||||
|
final GroupCache groupCache,
|
||||||
|
final GroupDetailFactory.Factory groupDetailFactory) {
|
||||||
|
this.groupControlFactory = groupControlFactory;
|
||||||
|
this.groupCache = groupCache;
|
||||||
|
this.groupDetailFactory = groupDetailFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<GroupInfo> apply(final GroupResource resource)
|
||||||
|
throws AuthException, BadRequestException, ResourceConflictException,
|
||||||
|
Exception {
|
||||||
|
final List<GroupInfo> includedGroups = Lists.newArrayList();
|
||||||
|
|
||||||
|
final GroupControl groupControl =
|
||||||
|
groupControlFactory.validateFor(resource.getGroupUUID());
|
||||||
|
final AccountGroup group =
|
||||||
|
groupCache.get(groupControl.getGroup().getGroupUUID());
|
||||||
|
final GroupDetail groupDetail =
|
||||||
|
groupDetailFactory.create(group.getId()).call();
|
||||||
|
|
||||||
|
if (groupDetail.includes != null) {
|
||||||
|
for (final AccountGroupInclude groupInclude : groupDetail.includes) {
|
||||||
|
final AccountGroup includedGroup =
|
||||||
|
groupCache.get(groupInclude.getIncludeId());
|
||||||
|
includedGroups.add(GetGroup.parse(GroupDescriptions
|
||||||
|
.forAccountGroup(includedGroup)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return includedGroups;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.gerrit.common.data.GroupDetail;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||||
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroupMember;
|
||||||
|
import com.google.gerrit.server.account.AccountCache;
|
||||||
|
import com.google.gerrit.server.account.GroupCache;
|
||||||
|
import com.google.gerrit.server.account.GroupControl;
|
||||||
|
import com.google.gerrit.server.account.GroupDetailFactory;
|
||||||
|
import com.google.gerrit.server.group.MembersCollection.MemberInfo;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ListMembers implements RestReadView<GroupResource> {
|
||||||
|
private final GroupControl.Factory groupControlFactory;
|
||||||
|
private final GroupCache groupCache;
|
||||||
|
private final GroupDetailFactory.Factory groupDetailFactory;
|
||||||
|
private final AccountCache accountCache;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ListMembers(final GroupControl.Factory groupControlFactory,
|
||||||
|
final GroupCache groupCache,
|
||||||
|
final GroupDetailFactory.Factory groupDetailFactory,
|
||||||
|
final AccountCache accountCache) {
|
||||||
|
this.groupControlFactory = groupControlFactory;
|
||||||
|
this.groupCache = groupCache;
|
||||||
|
this.groupDetailFactory = groupDetailFactory;
|
||||||
|
this.accountCache = accountCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<MemberInfo> apply(final GroupResource resource) throws AuthException,
|
||||||
|
BadRequestException, ResourceConflictException, Exception {
|
||||||
|
final List<MemberInfo> members = Lists.newArrayList();
|
||||||
|
|
||||||
|
final GroupControl groupControl =
|
||||||
|
groupControlFactory.validateFor(resource.getGroupUUID());
|
||||||
|
final AccountGroup group =
|
||||||
|
groupCache.get(groupControl.getGroup().getGroupUUID());
|
||||||
|
final GroupDetail groupDetail =
|
||||||
|
groupDetailFactory.create(group.getId()).call();
|
||||||
|
|
||||||
|
if (groupDetail.members != null) {
|
||||||
|
for (final AccountGroupMember member : groupDetail.members) {
|
||||||
|
final Account account = accountCache.get(member.getAccountId()).getAccount();
|
||||||
|
members.add(MembersCollection.parse(account));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return members;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.restapi.RestView;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
import com.google.gerrit.server.account.AccountResource;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
|
public class MemberResource extends AccountResource {
|
||||||
|
public static final TypeLiteral<RestView<MemberResource>> MEMBER_KIND =
|
||||||
|
new TypeLiteral<RestView<MemberResource>>() {};
|
||||||
|
|
||||||
|
public MemberResource(IdentifiedUser user) {
|
||||||
|
super(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
// Copyright (C) 2013 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.common.data.GroupDetail;
|
||||||
|
import com.google.gerrit.extensions.registration.DynamicMap;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.ChildCollection;
|
||||||
|
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestView;
|
||||||
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountGroupMember;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
import com.google.gerrit.server.account.GroupCache;
|
||||||
|
import com.google.gerrit.server.account.GroupDetailFactory;
|
||||||
|
import com.google.gerrit.server.util.Url;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Provider;
|
||||||
|
|
||||||
|
public class MembersCollection implements
|
||||||
|
ChildCollection<GroupResource, MemberResource> {
|
||||||
|
|
||||||
|
private final DynamicMap<RestView<MemberResource>> views;
|
||||||
|
private final Provider<ListMembers> list;
|
||||||
|
private final IdentifiedUser.GenericFactory userGenericFactory;
|
||||||
|
private final GroupCache groupCache;
|
||||||
|
private final GroupDetailFactory.Factory groupDetailFactory;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
MembersCollection(final DynamicMap<RestView<MemberResource>> views,
|
||||||
|
final Provider<ListMembers> list,
|
||||||
|
final IdentifiedUser.GenericFactory userGenericFactory,
|
||||||
|
final GroupCache groupCache,
|
||||||
|
final GroupDetailFactory.Factory groupDetailFactory) {
|
||||||
|
this.views = views;
|
||||||
|
this.list = list;
|
||||||
|
this.userGenericFactory = userGenericFactory;
|
||||||
|
this.groupCache = groupCache;
|
||||||
|
this.groupDetailFactory = groupDetailFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RestView<GroupResource> list() throws ResourceNotFoundException,
|
||||||
|
AuthException {
|
||||||
|
return list.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MemberResource parse(final GroupResource parent, final String id)
|
||||||
|
throws ResourceNotFoundException, Exception {
|
||||||
|
final Account.Id accountId;
|
||||||
|
try {
|
||||||
|
accountId = new Account.Id(Integer.parseInt(Url.decode(id)));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new ResourceNotFoundException(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
final AccountGroup group =
|
||||||
|
groupCache.get(parent.getControl().getGroup().getGroupUUID());
|
||||||
|
final GroupDetail groupDetail =
|
||||||
|
groupDetailFactory.create(group.getId()).call();
|
||||||
|
if (groupDetail.members != null) {
|
||||||
|
for (final AccountGroupMember member : groupDetail.members) {
|
||||||
|
if (member.getAccountId().equals(accountId)) {
|
||||||
|
return new MemberResource(
|
||||||
|
userGenericFactory.create(accountId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new ResourceNotFoundException(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DynamicMap<RestView<MemberResource>> views() {
|
||||||
|
return views;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MemberInfo parse(final Account account) {
|
||||||
|
final MemberInfo accountInfo = new MemberInfo();
|
||||||
|
accountInfo.setId(account.getId());
|
||||||
|
accountInfo.fullName = account.getFullName();
|
||||||
|
accountInfo.preferredEmail = account.getPreferredEmail();
|
||||||
|
accountInfo.userName = account.getUserName();
|
||||||
|
return accountInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class MemberInfo {
|
||||||
|
final String kind = "gerritcodereview#member";
|
||||||
|
|
||||||
|
String fullName;
|
||||||
|
String id;
|
||||||
|
int accountId;
|
||||||
|
String preferredEmail;
|
||||||
|
String userName;
|
||||||
|
|
||||||
|
void setId(Account.Id i) {
|
||||||
|
accountId = i.get();
|
||||||
|
id = Url.encode(Integer.toString(accountId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
package com.google.gerrit.server.group;
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
import static com.google.gerrit.server.group.GroupResource.GROUP_KIND;
|
import static com.google.gerrit.server.group.GroupResource.GROUP_KIND;
|
||||||
|
import static com.google.gerrit.server.group.IncludedGroupResource.INCLUDED_GROUP_KIND;
|
||||||
|
import static com.google.gerrit.server.group.MemberResource.MEMBER_KIND;
|
||||||
|
|
||||||
import com.google.gerrit.extensions.registration.DynamicMap;
|
import com.google.gerrit.extensions.registration.DynamicMap;
|
||||||
import com.google.gerrit.extensions.restapi.RestApiModule;
|
import com.google.gerrit.extensions.restapi.RestApiModule;
|
||||||
@@ -25,7 +27,15 @@ public class Module extends RestApiModule {
|
|||||||
bind(GroupsCollection.class);
|
bind(GroupsCollection.class);
|
||||||
|
|
||||||
DynamicMap.mapOf(binder(), GROUP_KIND);
|
DynamicMap.mapOf(binder(), GROUP_KIND);
|
||||||
|
DynamicMap.mapOf(binder(), MEMBER_KIND);
|
||||||
|
DynamicMap.mapOf(binder(), INCLUDED_GROUP_KIND);
|
||||||
|
|
||||||
get(GROUP_KIND).to(GetGroup.class);
|
get(GROUP_KIND).to(GetGroup.class);
|
||||||
|
|
||||||
|
child(GROUP_KIND, "members").to(MembersCollection.class);
|
||||||
|
get(MEMBER_KIND).to(GetMember.class);
|
||||||
|
|
||||||
|
child(GROUP_KIND, "groups").to(IncludedGroupsCollection.class);
|
||||||
|
get(INCLUDED_GROUP_KIND).to(GetIncludedGroup.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user