aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-01-18 12:12:39 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-01-18 18:33:40 +0100
commitddee50ce60a9cf14288e4d593adaa217d6372894 (patch)
tree36136244069cb3aa0b1318ee9b9c269c43173bca /server
parentd2f4b79ac7df4f29364d84cd9bdfc27df62c97a0 (diff)
downloadsonarqube-ddee50ce60a9cf14288e4d593adaa217d6372894.tar.gz
sonarqube-ddee50ce60a9cf14288e4d593adaa217d6372894.zip
SONAR-7205 WS users/search with token count in response
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java23
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java19
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/user/ws/search-example.json (renamed from server/sonar-server/src/main/resources/org/sonar/server/user/ws/example-search.json)16
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java91
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/five_users.json15
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/user_one.json3
6 files changed, 92 insertions, 75 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java
index c7f84c9d2b8..270a336fe3f 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java
@@ -21,10 +21,12 @@ package org.sonar.server.user.ws;
import com.google.common.base.Function;
import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
@@ -32,14 +34,14 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
import org.sonar.server.es.SearchOptions;
import org.sonar.server.es.SearchResult;
import org.sonar.server.user.index.UserDoc;
import org.sonar.server.user.index.UserIndex;
+import static com.google.common.base.Objects.firstNonNull;
import static org.sonar.server.es.SearchOptions.MAX_LIMIT;
public class SearchAction implements UsersWsAction {
@@ -60,7 +62,7 @@ public class SearchAction implements UsersWsAction {
.setDescription("Get a list of active users. Administer System permission is required to show the 'groups' field.")
.setSince("3.6")
.setHandler(this)
- .setResponseExample(getClass().getResource("example-search.json"));
+ .setResponseExample(getClass().getResource("search-example.json"));
action.addFieldsParam(UserJsonWriter.FIELDS);
action.addPagingParams(50, MAX_LIMIT);
@@ -77,31 +79,34 @@ public class SearchAction implements UsersWsAction {
SearchResult<UserDoc> result = userIndex.search(request.param(Param.TEXT_QUERY), options);
Multimap<String, String> groupsByLogin = ArrayListMultimap.create();
+ Map<String, Integer> tokenCountsByLogin = new HashMap<>();
DbSession dbSession = dbClient.openSession(false);
try {
- Collection<String> logins = Collections2.transform(result.getDocs(), new Function<UserDoc, String>() {
+ List<String> logins = Lists.transform(result.getDocs(), new Function<UserDoc, String>() {
@Override
public String apply(@Nonnull UserDoc input) {
return input.login();
}
});
groupsByLogin = dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, logins);
+ tokenCountsByLogin = dbClient.userTokenDao().countTokensByLogins(dbSession, logins);
} finally {
- MyBatis.closeQuietly(dbSession);
+ dbClient.closeSession(dbSession);
}
JsonWriter json = response.newJsonWriter().beginObject();
options.writeJson(json, result.getTotal());
- writeUsers(json, result, fields, groupsByLogin);
+ writeUsers(json, result, groupsByLogin, tokenCountsByLogin, fields);
json.endObject().close();
}
- private void writeUsers(JsonWriter json, SearchResult<UserDoc> result, @Nullable List<String> fields, Multimap<String, String> groupsByLogin) {
+ private void writeUsers(JsonWriter json, SearchResult<UserDoc> result, Multimap<String, String> groupsByLogin, Map<String, Integer> tokenCountsByLogin,
+ @Nullable List<String> fields) {
json.name("users").beginArray();
for (UserDoc user : result.getDocs()) {
Collection<String> groups = groupsByLogin.get(user.login());
- userWriter.write(json, user, groups, fields);
+ userWriter.write(json, user, firstNonNull(tokenCountsByLogin.get(user.login()), 0), groups, fields);
}
json.endArray();
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java
index c9d730da357..e19fbdba8aa 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java
@@ -40,6 +40,7 @@ public class UserJsonWriter {
private static final String FIELD_SCM_ACCOUNTS = "scmAccounts";
private static final String FIELD_GROUPS = "groups";
private static final String FIELD_ACTIVE = "active";
+ private static final String FIELD_TOKEN_COUNT = "tokenCount";
public static final Set<String> FIELDS = ImmutableSet.of(FIELD_NAME, FIELD_EMAIL, FIELD_SCM_ACCOUNTS, FIELD_GROUPS, FIELD_ACTIVE);
private static final Set<String> CONCISE_FIELDS = ImmutableSet.of(FIELD_NAME, FIELD_EMAIL, FIELD_ACTIVE);
@@ -53,7 +54,14 @@ public class UserJsonWriter {
/**
* Serializes a user to the passed JsonWriter.
*/
- public void write(JsonWriter json, User user, Collection<String> groups, Collection<String> fields) {
+ public void write(JsonWriter json, User user, Collection<String> groups, @Nullable Collection<String> fields) {
+ write(json, user, null, groups, fields);
+ }
+
+ /**
+ * Serializes a user to the passed JsonWriter.
+ */
+ public void write(JsonWriter json, User user, @Nullable Integer tokenCount, Collection<String> groups, @Nullable Collection<String> fields) {
json.beginObject();
json.prop(FIELD_LOGIN, user.login());
writeIfNeeded(json, user.name(), FIELD_NAME, fields);
@@ -61,6 +69,7 @@ public class UserJsonWriter {
writeIfNeeded(json, user.active(), FIELD_ACTIVE, fields);
writeGroupsIfNeeded(json, groups, fields);
writeScmAccountsIfNeeded(json, fields, user);
+ writeTokenCount(json, tokenCount);
json.endObject();
}
@@ -93,4 +102,12 @@ public class UserJsonWriter {
.endArray();
}
}
+
+ private static void writeTokenCount(JsonWriter json, @Nullable Integer tokenCount) {
+ if (tokenCount == null) {
+ return;
+ }
+
+ json.prop(FIELD_TOKEN_COUNT, tokenCount);
+ }
}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/user/ws/example-search.json b/server/sonar-server/src/main/resources/org/sonar/server/user/ws/search-example.json
index 39448ce788d..43f791d247f 100644
--- a/server/sonar-server/src/main/resources/org/sonar/server/user/ws/example-search.json
+++ b/server/sonar-server/src/main/resources/org/sonar/server/user/ws/search-example.json
@@ -6,15 +6,25 @@
"active": true,
"email": "f@m.com",
"scmAccounts": [],
- "groups": ["sonar-users", "sonar-administrators"]
+ "groups": [
+ "sonar-users",
+ "sonar-administrators"
+ ],
+ "tokenCount": 1
},
{
"login": "sbrandhof",
"name": "Simon",
"active": true,
"email": "s.brandhof@company.tld",
- "scmAccounts": ["simon.brandhof", "s.brandhof@company.tld"],
- "groups": ["sonar-users"]
+ "scmAccounts": [
+ "simon.brandhof",
+ "s.brandhof@company.tld"
+ ],
+ "groups": [
+ "sonar-users"
+ ],
+ "tokenCount": 3
}
]
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java
index 50a89ef02d0..24689abde3d 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java
@@ -20,136 +20,109 @@
package org.sonar.server.user.ws;
import com.google.common.collect.Lists;
-import java.util.Arrays;
import java.util.List;
-import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.sonar.api.config.Settings;
-import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
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.GroupDto;
-import org.sonar.db.user.GroupMembershipDao;
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.es.EsTester;
import org.sonar.server.tester.UserSessionRule;
-import org.sonar.db.user.GroupDao;
-import org.sonar.db.user.UserDao;
import org.sonar.server.user.index.UserDoc;
import org.sonar.server.user.index.UserIndex;
import org.sonar.server.user.index.UserIndexDefinition;
import org.sonar.server.ws.WsTester;
import org.sonar.test.DbTests;
+import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.db.user.UserTokenTesting.newUserToken;
@Category(DbTests.class)
public class SearchActionTest {
- @Rule
- public DbTester dbTester = DbTester.create(System2.INSTANCE);
-
@ClassRule
public static final EsTester esTester = new EsTester().addDefinitions(new UserIndexDefinition(new Settings()));
-
@Rule
public UserSessionRule userSession = UserSessionRule.standalone();
+ @Rule
+ public DbTester db = DbTester.create(System2.INSTANCE);
+ DbClient dbClient = db.getDbClient();
+ DbSession dbSession = db.getSession();
- WebService.Controller controller;
-
- WsTester tester;
-
+ WsTester ws;
UserIndex index;
- DbClient dbClient;
-
- DbSession session;
-
@Before
public void setUp() {
- dbTester.truncateTables();
esTester.truncateIndices();
-
- dbClient = new DbClient(dbTester.database(), dbTester.myBatis(),
- new GroupMembershipDao(dbTester.myBatis()),
- new UserDao(dbTester.myBatis(), new System2()),
- new GroupDao(new System2()),
- new UserGroupDao());
- session = dbClient.openSession(false);
-
index = new UserIndex(esTester.client());
- tester = new WsTester(new UsersWs(new SearchAction(index, dbClient, new UserJsonWriter(userSession))));
- controller = tester.controller("api/users");
- }
-
- @After
- public void tearDown() {
- session.close();
+ ws = new WsTester(new UsersWs(new SearchAction(index, dbClient, new UserJsonWriter(userSession))));
}
@Test
public void search_empty() throws Exception {
- tester.newGetRequest("api/users", "search").execute().assertJson(getClass(), "empty.json");
+ ws.newGetRequest("api/users", "search").execute().assertJson(getClass(), "empty.json");
}
@Test
public void search_without_parameters() throws Exception {
injectUsers(5);
- tester.newGetRequest("api/users", "search").execute().assertJson(getClass(), "five_users.json");
+ ws.newGetRequest("api/users", "search").execute().assertJson(getClass(), "five_users.json");
}
@Test
public void search_with_query() throws Exception {
injectUsers(5);
- tester.newGetRequest("api/users", "search").setParam("q", "user-1").execute().assertJson(getClass(), "user_one.json");
+ ws.newGetRequest("api/users", "search").setParam("q", "user-1").execute().assertJson(getClass(), "user_one.json");
}
@Test
public void search_with_paging() throws Exception {
injectUsers(10);
- tester.newGetRequest("api/users", "search").setParam(Param.PAGE_SIZE, "5").execute().assertJson(getClass(), "page_one.json");
- tester.newGetRequest("api/users", "search").setParam(Param.PAGE_SIZE, "5").setParam(Param.PAGE, "2").execute().assertJson(getClass(), "page_two.json");
+ ws.newGetRequest("api/users", "search").setParam(Param.PAGE_SIZE, "5").execute().assertJson(getClass(), "page_one.json");
+ ws.newGetRequest("api/users", "search").setParam(Param.PAGE_SIZE, "5").setParam(Param.PAGE, "2").execute().assertJson(getClass(), "page_two.json");
}
@Test
public void search_with_fields() throws Exception {
injectUsers(1);
- assertThat(tester.newGetRequest("api/users", "search").execute().outputAsString())
+ assertThat(ws.newGetRequest("api/users", "search").execute().outputAsString())
.contains("login")
.contains("name")
.contains("email")
.contains("scmAccounts")
.doesNotContain("groups");
- assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "").execute().outputAsString())
+ assertThat(ws.newGetRequest("api/users", "search").setParam(Param.FIELDS, "").execute().outputAsString())
.contains("login")
.contains("name")
.contains("email")
.contains("scmAccounts")
.doesNotContain("groups");
- assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "scmAccounts").execute().outputAsString())
+ assertThat(ws.newGetRequest("api/users", "search").setParam(Param.FIELDS, "scmAccounts").execute().outputAsString())
.contains("login")
.doesNotContain("name")
.doesNotContain("email")
.contains("scmAccounts")
.doesNotContain("groups");
- assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString())
+ assertThat(ws.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString())
.contains("login")
.doesNotContain("name")
.doesNotContain("email")
@@ -158,14 +131,14 @@ public class SearchActionTest {
loginAsAdmin();
- assertThat(tester.newGetRequest("api/users", "search").execute().outputAsString())
+ assertThat(ws.newGetRequest("api/users", "search").execute().outputAsString())
.contains("login")
.contains("name")
.contains("email")
.contains("scmAccounts")
.contains("groups");
- assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString())
+ assertThat(ws.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString())
.contains("login")
.doesNotContain("name")
.doesNotContain("email")
@@ -177,14 +150,14 @@ public class SearchActionTest {
public void search_with_groups() throws Exception {
List<UserDto> users = injectUsers(1);
- GroupDto group1 = dbClient.groupDao().insert(session, new GroupDto().setName("sonar-users"));
- GroupDto group2 = dbClient.groupDao().insert(session, new GroupDto().setName("sonar-admins"));
- dbClient.userGroupDao().insert(session, new UserGroupDto().setGroupId(group1.getId()).setUserId(users.get(0).getId()));
- dbClient.userGroupDao().insert(session, new UserGroupDto().setGroupId(group2.getId()).setUserId(users.get(0).getId()));
- session.commit();
+ GroupDto group1 = dbClient.groupDao().insert(dbSession, new GroupDto().setName("sonar-users"));
+ GroupDto group2 = dbClient.groupDao().insert(dbSession, new GroupDto().setName("sonar-admins"));
+ dbClient.userGroupDao().insert(dbSession, new UserGroupDto().setGroupId(group1.getId()).setUserId(users.get(0).getId()));
+ dbClient.userGroupDao().insert(dbSession, new UserGroupDto().setGroupId(group2.getId()).setUserId(users.get(0).getId()));
+ dbSession.commit();
loginAsAdmin();
- tester.newGetRequest("api/users", "search").execute().assertJson(getClass(), "user_with_groups.json");
+ ws.newGetRequest("api/users", "search").execute().assertJson(getClass(), "user_with_groups.json");
}
private List<UserDto> injectUsers(int numberOfUsers) throws Exception {
@@ -195,9 +168,9 @@ public class SearchActionTest {
String email = String.format("user-%d@mail.com", index);
String login = String.format("user-%d", index);
String name = String.format("User %d", index);
- List<String> scmAccounts = Arrays.asList(String.format("user-%d", index));
+ List<String> scmAccounts = singletonList(String.format("user-%d", index));
- userDtos.add(dbClient.userDao().insert(session, new UserDto()
+ userDtos.add(dbClient.userDao().insert(dbSession, new UserDto()
.setActive(true)
.setCreatedAt(createdAt)
.setEmail(email)
@@ -214,8 +187,14 @@ public class SearchActionTest {
.setName(name)
.setScmAccounts(scmAccounts)
.setUpdatedAt(createdAt);
+
+ for (int tokenIndex = 0; tokenIndex < index; tokenIndex++) {
+ dbClient.userTokenDao().insert(dbSession, newUserToken()
+ .setLogin(login)
+ .setName(String.format("%s-%d", login, tokenIndex)));
+ }
}
- session.commit();
+ dbSession.commit();
esTester.putDocuments(UserIndexDefinition.INDEX, UserIndexDefinition.TYPE_USER, users);
return userDtos;
}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/five_users.json b/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/five_users.json
index 88a6fec9ecb..576b41ad6ce 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/five_users.json
+++ b/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/five_users.json
@@ -9,7 +9,8 @@
"email": "user-0@mail.com",
"scmAccounts": [
"user-0"
- ]
+ ],
+ "tokenCount": 0
},
{
"login": "user-1",
@@ -17,7 +18,8 @@
"email": "user-1@mail.com",
"scmAccounts": [
"user-1"
- ]
+ ],
+ "tokenCount": 1
},
{
"login": "user-2",
@@ -25,7 +27,8 @@
"email": "user-2@mail.com",
"scmAccounts": [
"user-2"
- ]
+ ],
+ "tokenCount": 2
},
{
"login": "user-3",
@@ -33,7 +36,8 @@
"email": "user-3@mail.com",
"scmAccounts": [
"user-3"
- ]
+ ],
+ "tokenCount": 3
},
{
"login": "user-4",
@@ -41,7 +45,8 @@
"email": "user-4@mail.com",
"scmAccounts": [
"user-4"
- ]
+ ],
+ "tokenCount": 4
}
]
}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/user_one.json b/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/user_one.json
index 3c5b27e9552..2f3d06e9ac6 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/user_one.json
+++ b/server/sonar-server/src/test/resources/org/sonar/server/user/ws/SearchActionTest/user_one.json
@@ -9,7 +9,8 @@
"email": "user-1@mail.com",
"scmAccounts": [
"user-1"
- ]
+ ],
+ "tokenCount": 1
}
]
}