import org.sonar.server.rule.Rule;
import org.sonar.server.rule.RuleService;
import org.sonar.server.user.UserSession;
+import org.sonar.server.user.ws.UserJsonWriter;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Maps.newHashMap;
private final Durations durations;
private final Languages languages;
private final UserSession userSession;
+ private final UserJsonWriter userWriter;
public SearchAction(DbClient dbClient, IssueService service, IssueActionsWriter actionsWriter, IssueQueryService issueQueryService,
RuleService ruleService, ActionPlanService actionPlanService, UserFinder userFinder, I18n i18n, Durations durations, Languages languages,
- UserSession userSession) {
+ UserSession userSession, UserJsonWriter userWriter) {
this.dbClient = dbClient;
this.service = service;
this.actionsWriter = actionsWriter;
this.durations = durations;
this.languages = languages;
this.userSession = userSession;
+ this.userWriter = userWriter;
}
@Override
.prop("line", issue.line())
.prop("debt", debt != null ? durations.encode(debt) : null)
.prop("reporter", issue.reporter())
- .prop("assignee", issue.assignee())
.prop("author", issue.authorLogin())
.prop("actionPlan", actionPlanKey)
.prop("creationDate", isoDate(issue.creationDate()))
.prop("fUpdateAge", formatAgeDate(updateDate))
.prop("closeDate", isoDate(issue.closeDate()));
+ json.name("assignee");
+ userWriter.write(json, usersByLogin.get(issue.assignee()));
+
writeTags(issue, json);
writeIssueComments(commentsByIssues.get(issue.key()), usersByLogin, json);
writeIssueAttributes(issue, json);
json.endArray();
}
- private void writeTags(Issue issue, JsonWriter json) {
+ private static void writeTags(Issue issue, JsonWriter json) {
Collection<String> tags = issue.tags();
if (tags != null && !tags.isEmpty()) {
json.name("tags").beginArray();
}
}
- private void writeIssueAttributes(Issue issue, JsonWriter json) {
+ private static void writeIssueAttributes(Issue issue, JsonWriter json) {
if (!issue.attributes().isEmpty()) {
json.name("attr").beginObject();
for (Map.Entry<String, String> entry : issue.attributes().entrySet()) {
json.endArray();
}
- private void writeProjects(JsonWriter json, List<ComponentDto> projects) {
+ private static void writeProjects(JsonWriter json, List<ComponentDto> projects) {
json.name("projects").beginArray();
for (ComponentDto project : projects) {
json.beginObject()
return buildProjectsByComponentUuid(components, projectsByUuid);
}
- private Map<String, ComponentDto> buildProjectsByUuid(Collection<ComponentDto> projects) {
+ private static Map<String, ComponentDto> buildProjectsByUuid(Collection<ComponentDto> projects) {
Map<String, ComponentDto> projectsByUuid = newHashMap();
for (ComponentDto project : projects) {
if (project == null) {
return projectsByUuid;
}
- private Map<String, ComponentDto> buildProjectsByComponentUuid(Collection<ComponentDto> components, Map<String, ComponentDto> projectsByUuid) {
+ private static Map<String, ComponentDto> buildProjectsByComponentUuid(Collection<ComponentDto> components, Map<String, ComponentDto> projectsByUuid) {
Map<String, ComponentDto> projectsByComponentUuid = newHashMap();
for (ComponentDto component : components) {
if (component.uuid() == null) {
}
@CheckForNull
- private String isoDate(@Nullable Date date) {
+ private static String isoDate(@Nullable Date date) {
if (date != null) {
return DateUtils.formatDateTime(date);
}
}
}
- private void addZeroFacetsForSelectedItems(Request request, String facetName, Set<String> itemsFromFacets, JsonWriter json) {
+ private static void addZeroFacetsForSelectedItems(Request request, String facetName, Set<String> itemsFromFacets, JsonWriter json) {
List<String> requestParams = request.paramAsStrings(facetName);
if (requestParams != null) {
for (String param : requestParams) {
*/
package org.sonar.server.platform.platformlevel;
+import org.sonar.server.user.ws.UserJsonWriter;
+
import java.util.List;
import org.sonar.api.config.EmailSettings;
import org.sonar.api.issue.action.Actions;
NewUserNotifier.class,
DefaultUserFinder.class,
DefaultUserService.class,
+ UserJsonWriter.class,
UsersWs.class,
org.sonar.server.user.ws.CreateAction.class,
org.sonar.server.user.ws.UpdateAction.class,
package org.sonar.server.user.ws;
+import com.google.common.collect.ImmutableSet;
import org.sonar.api.i18n.I18n;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
private final UserUpdater userUpdater;
private final I18n i18n;
private final UserSession userSession;
+ private final UserJsonWriter userWriter;
- public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n, UserSession userSession) {
+ public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n, UserSession userSession, UserJsonWriter userWriter) {
this.index = index;
this.userUpdater = userUpdater;
this.i18n = i18n;
this.userSession = userSession;
+ this.userWriter = userWriter;
}
@Override
json.endObject().close();
}
- private static void writeUser(JsonWriter json, UserDoc user) {
- json.name("user").beginObject()
- .prop("login", user.login())
- .prop("name", user.name())
- .prop("email", user.email())
- .prop("active", user.active())
- .name("scmAccounts").beginArray().values(user.scmAccounts()).endArray()
- .endObject();
+ private void writeUser(JsonWriter json, UserDoc user) {
+ json.name("user");
+ userWriter.write(json, user, ImmutableSet.<String>of(), UserJsonWriter.FIELDS);
}
private void writeReactivationMessage(JsonWriter json, String login) {
package org.sonar.server.user.ws;
+import com.google.common.collect.Sets;
+import java.util.Arrays;
+import java.util.Set;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewAction;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.user.UserSession;
import org.sonar.server.user.UserUpdater;
private final UserIndex index;
private final UserUpdater userUpdater;
private final UserSession userSession;
+ private final UserJsonWriter userWriter;
+ private final DbClient dbClient;
- public DeactivateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession) {
+ public DeactivateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession, UserJsonWriter userWriter, DbClient dbClient) {
this.index = index;
this.userUpdater = userUpdater;
this.userSession = userSession;
+ this.userWriter = userWriter;
+ this.dbClient = dbClient;
}
@Override
}
private void writeUser(JsonWriter json, UserDoc user) {
- json.name("user").beginObject()
- .prop("login", user.login())
- .prop("name", user.name())
- .prop("email", user.email())
- .prop("active", user.active())
- .name("scmAccounts").beginArray().values(user.scmAccounts()).endArray()
- .endObject();
+ json.name("user");
+ Set<String> groups = Sets.newHashSet();
+ DbSession dbSession = dbClient.openSession(false);
+ try {
+ groups.addAll(dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, Arrays.asList(user.login())).get(user.login()));
+ } finally {
+ MyBatis.closeQuietly(dbSession);
+ }
+ userWriter.write(json, user, groups, UserJsonWriter.FIELDS);
}
}
import com.google.common.base.Function;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.List;
-import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
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.core.permission.GlobalPermissions;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.server.db.DbClient;
import org.sonar.server.es.SearchOptions;
import org.sonar.server.es.SearchResult;
-import org.sonar.server.user.UserSession;
import org.sonar.server.user.index.UserDoc;
import org.sonar.server.user.index.UserIndex;
public class SearchAction implements UsersWsAction {
- private static final String FIELD_LOGIN = "login";
- private static final String FIELD_NAME = "name";
- private static final String FIELD_EMAIL = "email";
- private static final String FIELD_SCM_ACCOUNTS = "scmAccounts";
- private static final String FIELD_GROUPS = "groups";
- private static final Set<String> FIELDS = ImmutableSet.of(FIELD_LOGIN, FIELD_NAME, FIELD_EMAIL, FIELD_SCM_ACCOUNTS, FIELD_GROUPS);
-
private final UserIndex userIndex;
private final DbClient dbClient;
- private final UserSession userSession;
+ private final UserJsonWriter userWriter;
- public SearchAction(UserIndex userIndex, DbClient dbClient, UserSession userSession) {
+ public SearchAction(UserIndex userIndex, DbClient dbClient, UserJsonWriter userWriter) {
this.userIndex = userIndex;
this.dbClient = dbClient;
- this.userSession = userSession;
+ this.userWriter = userWriter;
}
@Override
.setHandler(this)
.setResponseExample(getClass().getResource("example-search.json"));
- action.addFieldsParam(FIELDS);
+ action.addFieldsParam(UserJsonWriter.FIELDS);
action.addPagingParams(50);
action.createParam(Param.TEXT_QUERY)
json.name("users").beginArray();
for (UserDoc user : result.getDocs()) {
- json.beginObject();
- writeIfNeeded(json, user.login(), FIELD_LOGIN, fields);
- writeIfNeeded(json, user.name(), FIELD_NAME, fields);
- writeIfNeeded(json, user.email(), FIELD_EMAIL, fields);
- writeGroupsIfNeeded(json, groupsByLogin.get(user.login()), fields);
- writeScmAccountsIfNeeded(json, fields, user);
- json.endObject();
+ Collection<String> groups = groupsByLogin.get(user.login());
+ userWriter.write(json, user, groups, fields);
}
json.endArray();
}
-
- private void writeIfNeeded(JsonWriter json, @Nullable String value, String field, @Nullable List<String> fields) {
- if (fieldIsWanted(field, fields)) {
- json.prop(field, value);
- }
- }
-
- private void writeGroupsIfNeeded(JsonWriter json, Collection<String> groups, @Nullable List<String> fields) {
- if (fieldIsWanted(FIELD_GROUPS, fields) && userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)) {
- json.name(FIELD_GROUPS).beginArray();
- for (String groupName : groups) {
- json.value(groupName);
- }
- json.endArray();
- }
- }
-
- private void writeScmAccountsIfNeeded(JsonWriter json, List<String> fields, UserDoc user) {
- if (fieldIsWanted(FIELD_SCM_ACCOUNTS, fields)) {
- json.name(FIELD_SCM_ACCOUNTS)
- .beginArray()
- .values(user.scmAccounts())
- .endArray();
- }
- }
-
- private boolean fieldIsWanted(String field, @Nullable List<String> fields) {
- return fields == null || fields.isEmpty() || fields.contains(field);
- }
}
package org.sonar.server.user.ws;
+import com.google.common.collect.Sets;
+import java.util.Arrays;
+import java.util.Set;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.db.DbClient;
import org.sonar.server.user.UpdateUser;
import org.sonar.server.user.UserSession;
import org.sonar.server.user.UserUpdater;
private final UserIndex index;
private final UserUpdater userUpdater;
private final UserSession userSession;
+ private final UserJsonWriter userWriter;
+ private final DbClient dbClient;
- public UpdateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession) {
+ public UpdateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession, UserJsonWriter userWriter, DbClient dbClient) {
this.index = index;
this.userUpdater = userUpdater;
this.userSession = userSession;
+ this.userWriter = userWriter;
+ this.dbClient = dbClient;
}
@Override
json.endObject().close();
}
- private static void writeUser(JsonWriter json, UserDoc user) {
- json.name("user").beginObject()
- .prop("login", user.login())
- .prop("name", user.name())
- .prop("email", user.email())
- .prop("active", user.active())
- .name("scmAccounts").beginArray().values(user.scmAccounts()).endArray()
- .endObject();
+ private void writeUser(JsonWriter json, UserDoc user) {
+ json.name("user");
+ Set<String> groups = Sets.newHashSet();
+ DbSession dbSession = dbClient.openSession(false);
+ try {
+ groups.addAll(dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, Arrays.asList(user.login())).get(user.login()));
+ } finally {
+ MyBatis.closeQuietly(dbSession);
+ }
+ userWriter.write(json, user, groups, UserJsonWriter.FIELDS);
}
}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.user.ws;
+
+import com.google.common.collect.ImmutableSet;
+import java.util.Collection;
+import java.util.Set;
+import javax.annotation.Nullable;
+import org.sonar.api.user.User;
+import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.server.user.UserSession;
+import org.sonar.server.user.index.UserDoc;
+
+public class UserJsonWriter {
+
+ private static final String FIELD_LOGIN = "login";
+ private static final String FIELD_NAME = "name";
+ private static final String FIELD_EMAIL = "email";
+ private static final String FIELD_SCM_ACCOUNTS = "scmAccounts";
+ private static final String FIELD_GROUPS = "groups";
+ private static final String FIELD_ACTIVE = "active";
+
+ 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);
+
+ private final UserSession userSession;
+
+ public UserJsonWriter(UserSession userSession) {
+ this.userSession = userSession;
+ }
+
+ /**
+ * Serializes a user to the passed JsonWriter.
+ */
+ public void write(JsonWriter json, User user, Collection<String> groups, Collection<String> fields) {
+ json.beginObject();
+ json.prop(FIELD_LOGIN, user.login());
+ writeIfNeeded(json, user.name(), FIELD_NAME, fields);
+ writeIfNeeded(json, user.email(), FIELD_EMAIL, fields);
+ writeIfNeeded(json, user.active(), FIELD_ACTIVE, fields);
+ writeGroupsIfNeeded(json, groups, fields);
+ writeScmAccountsIfNeeded(json, fields, user);
+ json.endObject();
+ }
+
+ /**
+ * A shortcut to {@link #write(JsonWriter, User, Collection, Collection)} with preselected fields and without group information
+ */
+ public void write(JsonWriter json, @Nullable User user) {
+ if (user == null) {
+ json.beginObject().endObject();
+ } else {
+ write(json, user, ImmutableSet.<String>of(), CONCISE_FIELDS);
+ }
+ }
+
+ private static void writeIfNeeded(JsonWriter json, @Nullable String value, String field, Collection<String> fields) {
+ if (isFieldWanted(field, fields)) {
+ json.prop(field, value);
+ }
+ }
+
+ private static void writeIfNeeded(JsonWriter json, @Nullable Boolean value, String field, Collection<String> fields) {
+ if (isFieldWanted(field, fields)) {
+ json.prop(field, value);
+ }
+ }
+
+ private void writeGroupsIfNeeded(JsonWriter json, Collection<String> groups, @Nullable Collection<String> fields) {
+ if (isFieldWanted(FIELD_GROUPS, fields) && userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)) {
+ json.name(FIELD_GROUPS).beginArray();
+ for (String groupName : groups) {
+ json.value(groupName);
+ }
+ json.endArray();
+ }
+ }
+
+ private static void writeScmAccountsIfNeeded(JsonWriter json, Collection<String> fields, User user) {
+ if (isFieldWanted(FIELD_SCM_ACCOUNTS, fields)) {
+ json.name(FIELD_SCM_ACCOUNTS)
+ .beginArray()
+ .values(((UserDoc) user).scmAccounts())
+ .endArray();
+ }
+ }
+
+ private static boolean isFieldWanted(String field, @Nullable Collection<String> fields) {
+ return fields == null || fields.isEmpty() || fields.contains(field);
+ }
+}
@Test
public void filter_by_assigned_to_me() throws Exception {
+ db.userDao().insert(session, new UserDto().setLogin("john").setName("John").setEmail("john@email.com"));
+
ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject"));
setDefaultProjectPermission(project);
ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, "BCDE").setKey("MyComponent"));
@Test
public void assigned_to_me_facet_is_sticky_relative_to_assignees() throws Exception {
+ db.userDao().insert(session, new UserDto().setLogin("alice").setName("Alice").setEmail("alice@email.com"));
+
ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject"));
setDefaultProjectPermission(project);
ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, "BCDE").setKey("MyComponent"));
index = new UserIndex(esTester.client());
tester = new WsTester(new UsersWs(new CreateAction(index,
new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)),
- i18n, userSessionRule)));
+ i18n, userSessionRule, new UserJsonWriter(userSessionRule))));
controller = tester.controller("api/users");
}
import org.sonar.core.permission.GlobalPermissions;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.DbTester;
+import org.sonar.core.user.GroupMembershipDao;
import org.sonar.core.user.UserDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.es.EsTester;
System2 system2 = new System2();
UserDao userDao = new UserDao(dbTester.myBatis(), system2);
- dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao);
+ dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, new GroupMembershipDao(dbTester.myBatis()));
session = dbClient.openSession(false);
session.commit();
userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true);
index = new UserIndex(esTester.client());
tester = new WsTester(new UsersWs(new DeactivateAction(index,
- new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule)));
+ new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule,
+ new UserJsonWriter(userSessionRule), dbClient)));
controller = tester.controller("api/users");
}
session = dbClient.openSession(false);
index = new UserIndex(esTester.client());
- tester = new WsTester(new UsersWs(new SearchAction(index, dbClient, userSession)));
+ tester = new WsTester(new UsersWs(new SearchAction(index, dbClient, new UserJsonWriter(userSession))));
controller = tester.controller("api/users");
}
.contains("scmAccounts")
.doesNotContain("groups");
- assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "login").execute().outputAsString())
- .contains("login")
- .doesNotContain("name")
- .doesNotContain("email")
- .doesNotContain("scmAccounts")
- .doesNotContain("groups");
-
assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "scmAccounts").execute().outputAsString())
- .doesNotContain("login")
+ .contains("login")
.doesNotContain("name")
.doesNotContain("email")
.contains("scmAccounts")
.doesNotContain("groups");
assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString())
- .doesNotContain("login")
+ .contains("login")
.doesNotContain("name")
.doesNotContain("email")
.doesNotContain("scmAccounts")
.contains("groups");
assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString())
- .doesNotContain("login")
+ .contains("login")
.doesNotContain("name")
.doesNotContain("email")
.doesNotContain("scmAccounts")
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.DbTester;
import org.sonar.core.user.GroupDto;
+import org.sonar.core.user.GroupMembershipDao;
import org.sonar.core.user.UserDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.es.EsTester;
UserDao userDao = new UserDao(dbTester.myBatis(), system2);
UserGroupDao userGroupDao = new UserGroupDao();
GroupDao groupDao = new GroupDao(system2);
- dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, userGroupDao, groupDao);
+ dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, userGroupDao, groupDao, new GroupMembershipDao(dbTester.myBatis()));
session = dbClient.openSession(false);
groupDao.insert(session, new GroupDto().setName("sonar-users"));
session.commit();
userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true);
index = new UserIndex(esTester.client());
tester = new WsTester(new UsersWs(new UpdateAction(index,
- new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule)));
+ new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule,
+ new UserJsonWriter(userSessionRule), dbClient)));
controller = tester.controller("api/users");
}
import org.sonar.api.server.ws.WebService;
import org.sonar.server.db.DbClient;
import org.sonar.server.tester.UserSessionRule;
-import org.sonar.server.user.UserSession;
import org.sonar.server.user.UserUpdater;
import org.sonar.server.user.index.UserIndex;
import org.sonar.server.ws.WsTester;
@Before
public void setUp() {
WsTester tester = new WsTester(new UsersWs(
- new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class), userSessionRule),
- new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule),
+ new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class), userSessionRule, mock(UserJsonWriter.class)),
+ new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule, mock(UserJsonWriter.class), mock(DbClient.class)),
new CurrentAction(userSessionRule),
- new DeactivateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule),
+ new DeactivateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule, mock(UserJsonWriter.class), mock(DbClient.class)),
new ChangePasswordAction(mock(UserUpdater.class), userSessionRule),
- new SearchAction(mock(UserIndex.class), mock(DbClient.class), mock(UserSession.class))));
+ new SearchAction(mock(UserIndex.class), mock(DbClient.class), mock(UserJsonWriter.class))));
controller = tester.controller("api/users");
}
"severity": "MAJOR",
"debt": "10min",
"fUpdateAge": "less than a minute",
- "assignee": "alice"
+ "assignee": {
+ "login": "alice"
+ }
}
],
"facets": [
"severity": "MAJOR",
"debt": "10min",
"fUpdateAge": "less than a minute",
- "assignee": "john"
+ "assignee": {
+ "login": "john"
+ }
}
],
"facets": [
"severity": "MAJOR",
"debt": "10min",
"author": "John",
- "assignee": "simon",
+ "assignee": {
+ "login": "simon",
+ "name": "Simon",
+ "active": true,
+ "email": "simon@email.com"
+ },
"reporter": "fabrice",
"actionPlan": "AP-ABCD",
"updateDate": "2017-12-04T00:00:00+0100",
"issues": [
{
"key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
- "assignee": "simon",
+ "assignee": {
+ "login": "simon",
+ "name": "Simon",
+ "active": true,
+ "email": "simon@email.com"
+ },
"assigneeName": "Simon",
"reporter": "fabrice",
"reporterName": "Fabrice",