import org.sonar.api.utils.Paging;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.MyBatis;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.GroupMembershipQuery;
import org.sonar.db.user.UserMembershipDto;
import org.sonar.db.user.UserMembershipQuery;
-import org.sonar.server.db.DbClient;
-import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.user.UserSession;
import static org.sonar.api.utils.Paging.forPageIndex;
+import static org.sonar.server.usergroups.ws.UserGroupsWsParameters.createGroupParameters;
public class UsersAction implements UserGroupsWsAction {
private static final String FIELD_LOGIN = "login";
private final DbClient dbClient;
+ private final UserGroupFinder userGroupFinder;
private final UserSession userSession;
- public UsersAction(DbClient dbClient, UserSession userSession) {
+ public UsersAction(DbClient dbClient, UserGroupFinder userGroupFinder, UserSession userSession) {
this.dbClient = dbClient;
+ this.userGroupFinder = userGroupFinder;
this.userSession = userSession;
}
NewAction action = context.createAction("users")
.setDescription("Search for users with membership information with respect to a group.")
.setHandler(this)
+ .setSince("5.2")
.setResponseExample(getClass().getResource("example-users.json"))
- .setSince("5.2");
+ .addSelectionModeParam()
+ .addSearchQuery("freddy", "names", "logins")
+ .addPagingParams(25);
- action.createParam(PARAM_ID)
- .setDescription("A group ID")
- .setExampleValue("42")
- .setRequired(true);
-
- action.addSelectionModeParam();
-
- action.addSearchQuery("freddy", "names", "logins");
-
- action.addPagingParams(25);
+ createGroupParameters(action);
}
@Override
public void handle(Request request, Response response) throws Exception {
userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
- Long groupId = request.mandatoryParamAsLong(PARAM_ID);
+ WsGroupRef wsGroupRef = WsGroupRef.fromUserGroupsRequest(request);
int pageSize = request.mandatoryParamAsInt(Param.PAGE_SIZE);
int page = request.mandatoryParamAsInt(Param.PAGE);
String queryString = request.param(Param.TEXT_QUERY);
String selected = request.mandatoryParam(Param.SELECTED);
- UserMembershipQuery query = UserMembershipQuery.builder()
- .groupId(groupId)
- .memberSearch(queryString)
- .membership(getMembership(selected))
- .pageIndex(page)
- .pageSize(pageSize)
- .build();
-
DbSession dbSession = dbClient.openSession(false);
try {
- GroupDto group = dbClient.groupDao().selectById(dbSession, groupId);
- if (group == null) {
- throw new NotFoundException(String.format("Could not find user group with id '%s'", groupId));
- }
+ GroupDto group = userGroupFinder.getGroup(dbSession, wsGroupRef);
+ long groupId = group.getId();
+
+ UserMembershipQuery query = UserMembershipQuery.builder()
+ .groupId(groupId)
+ .memberSearch(queryString)
+ .membership(getMembership(selected))
+ .pageIndex(page)
+ .pageSize(pageSize)
+ .build();
int total = dbClient.groupMembershipDao().countMembers(dbSession, query);
Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(total);
List<UserMembershipDto> users = dbClient.groupMembershipDao().selectMembers(dbSession, query, paging.offset(), paging.pageSize());
package org.sonar.server.usergroups.ws;
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService.SelectionMode;
import org.sonar.api.utils.System2;
import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
+import org.sonar.db.user.GroupDao;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.GroupMembershipDao;
+import org.sonar.db.user.UserDao;
import org.sonar.db.user.UserDto;
import org.sonar.db.user.UserGroupDao;
import org.sonar.db.user.UserGroupDto;
-import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.tester.UserSessionRule;
-import org.sonar.db.user.GroupDao;
-import org.sonar.db.user.UserDao;
import org.sonar.server.ws.WsTester;
import org.sonar.server.ws.WsTester.TestRequest;
import org.sonar.test.DbTests;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.server.usergroups.ws.UserGroupsWsParameters.PARAM_GROUP_NAME;
+
@Category(DbTests.class)
public class UsersActionTest {
@Rule
- public DbTester dbTester = DbTester.create(System2.INSTANCE);
+ public DbTester db = DbTester.create(System2.INSTANCE);
@Rule
public UserSessionRule userSession = UserSessionRule.standalone();
WsTester wsTester;
DbClient dbClient;
- DbSession session;
+ DbSession dbSession;
@Before
public void setUp() {
- dbTester.truncateTables();
-
- System2 system2 = System2.INSTANCE;
- UserDao userDao = new UserDao(dbTester.myBatis(), system2);
- GroupDao groupDao = new GroupDao(system2);
- UserGroupDao userGroupDao = new UserGroupDao();
- GroupMembershipDao groupMembershipDao = new GroupMembershipDao(dbTester.myBatis());
-
- dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, groupDao, userGroupDao, groupMembershipDao);
- session = dbClient.openSession(false);
- session.commit();
-
- wsTester = new WsTester(new UserGroupsWs(new UsersAction(dbClient, userSession)));
+ dbClient = db.getDbClient();
+ dbSession = db.getSession();
+ UserDao userDao = dbClient.userDao();
+ GroupDao groupDao = dbClient.groupDao();
+ UserGroupDao userGroupDao = dbClient.userGroupDao();
+ GroupMembershipDao groupMembershipDao = dbClient.groupMembershipDao();
+
+ wsTester = new WsTester(new UserGroupsWs(
+ new UsersAction(
+ dbClient,
+ new UserGroupFinder(dbClient),
+ userSession)));
userSession.login("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
}
- @After
- public void tearDown() {
- session.close();
- }
-
@Test(expected = NotFoundException.class)
public void fail_on_unknown_user() throws Exception {
newUsersRequest()
.setParam("login", "john").execute();
}
- private TestRequest newUsersRequest() {
- return wsTester.newGetRequest("api/usergroups", "users");
- }
-
@Test
public void empty_users() throws Exception {
GroupDto group = insertGroup();
- session.commit();
+ dbSession.commit();
newUsersRequest()
.setParam("login", "john")
UserDto groupUser = insertUser("ada", "Ada Lovelace");
insertUser("grace", "Grace Hopper");
addUserToGroup(groupUser, group);
- session.commit();
+ dbSession.commit();
newUsersRequest()
.setParam("id", group.getId().toString())
.assertJson(getClass(), "all.json");
}
+ @Test
+ public void all_users_by_group_name() throws Exception {
+ GroupDto group = insertGroup();
+ UserDto adaLovelace = insertUser("ada", "Ada Lovelace");
+ UserDto graceHopper = insertUser("grace", "Grace Hopper");
+ addUserToGroup(adaLovelace, group);
+ addUserToGroup(graceHopper, group);
+ dbSession.commit();
+
+ String response = newUsersRequest()
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .execute().outputAsString();
+
+ assertThat(response).contains("Ada Lovelace", "Grace Hopper");
+ }
+
@Test
public void selected_users() throws Exception {
GroupDto group = insertGroup();
UserDto groupUser = insertUser("ada", "Ada Lovelace");
insertUser("grace", "Grace Hopper");
addUserToGroup(groupUser, group);
- session.commit();
+ dbSession.commit();
newUsersRequest()
.setParam("id", group.getId().toString())
UserDto groupUser = insertUser("ada", "Ada Lovelace");
insertUser("grace", "Grace Hopper");
addUserToGroup(groupUser, group);
- session.commit();
+ dbSession.commit();
newUsersRequest()
.setParam("id", group.getId().toString())
UserDto groupUser = insertUser("ada", "Ada Lovelace");
insertUser("grace", "Grace Hopper");
addUserToGroup(groupUser, group);
- session.commit();
+ dbSession.commit();
newUsersRequest()
.setParam("id", group.getId().toString())
UserDto groupUser = insertUser("ada", "Ada Lovelace");
insertUser("grace", "Grace Hopper");
addUserToGroup(groupUser, group);
- session.commit();
+ dbSession.commit();
newUsersRequest()
.setParam("id", group.getId().toString())
.assertJson(getClass(), "all_ada.json");
}
+ private TestRequest newUsersRequest() {
+ return wsTester.newGetRequest("api/usergroups", "users");
+ }
+
private GroupDto insertGroup() {
- return dbClient.groupDao().insert(session, new GroupDto()
+ return dbClient.groupDao().insert(dbSession, new GroupDto()
.setName("sonar-users"));
}
private UserDto insertUser(String login, String name) {
- return dbClient.userDao().insert(session, new UserDto().setLogin(login).setName(name));
+ return dbClient.userDao().insert(dbSession, new UserDto().setLogin(login).setName(name));
}
private void addUserToGroup(UserDto user, GroupDto usersGroup) {
- dbClient.userGroupDao().insert(session, new UserGroupDto().setUserId(user.getId()).setGroupId(usersGroup.getId()));
+ dbClient.userGroupDao().insert(dbSession, new UserGroupDto().setUserId(user.getId()).setGroupId(usersGroup.getId()));
}
}