@Override public void define(WebService.NewController context) { WebService.NewAction action = context.createAction("search_members") .setDescription("Search members of an organization.<br/>" + "Require organization membership.") .setResponseExample(getClass().getResource("search_members-example.json")) .setSince("6.4") .setInternal(true) .setChangelog(new Change("7.3", "This action now requires organization membership")) .setHandler(this); action.createSearchQuery("orwe", "names", "logins") .setMinimumLength(2); action.addPagingParams(50, MAX_LIMIT); action.createParam(Param.SELECTED) .setDescription("Depending on the value, show only selected items (selected=selected) or deselected items (selected=deselected).") .setInternal(true) .setDefaultValue(SELECTED.value()) .setPossibleValues(SELECTED.value(), SelectionMode.DESELECTED.value()); action.createParam(PARAM_ORGANIZATION) .setDescription("Organization key") .setInternal(true) .setRequired(false); }
private static UserQuery.Builder buildUserQuery(Request request, OrganizationDto organization) { UserQuery.Builder userQuery = UserQuery.builder(); String textQuery = request.param(Param.TEXT_QUERY); checkArgument(textQuery == null || textQuery.length() >= 2, "Query length must be greater than or equal to 2"); userQuery.setTextQuery(textQuery); SelectionMode selectionMode = SelectionMode.fromParam(request.mandatoryParam(Param.SELECTED)); if (SelectionMode.DESELECTED.equals(selectionMode)) { userQuery.setExcludedOrganizationUuid(organization.getUuid()); } else { userQuery.setOrganizationUuid(organization.getUuid()); } return userQuery; }
@Override public void handle(Request request, Response response) throws Exception { SearchUsersRequest wsRequest = buildRequest(request); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganizationByKey(dbSession, wsRequest.getOrganization()); QProfileDto profile = wsSupport.getProfile(dbSession, organization, wsRequest.getQualityProfile(), wsRequest.getLanguage()); wsSupport.checkCanEdit(dbSession, organization, profile); SearchGroupsQuery query = builder() .setOrganization(organization) .setProfile(profile) .setQuery(wsRequest.getQuery()) .setMembership(MEMBERSHIP.get(fromParam(wsRequest.getSelected()))) .build(); int total = dbClient.qProfileEditGroupsDao().countByQuery(dbSession, query); List<GroupMembershipDto> groupMemberships = dbClient.qProfileEditGroupsDao().selectByQuery(dbSession, query, forPage(wsRequest.getPage()).andSize(wsRequest.getPageSize())); Map<Integer, GroupDto> groupsById = dbClient.groupDao().selectByIds(dbSession, groupMemberships.stream().map(GroupMembershipDto::getGroupId).collect(MoreCollectors.toList())) .stream() .collect(MoreCollectors.uniqueIndex(GroupDto::getId)); writeProtobuf( Qualityprofiles.SearchGroupsResponse.newBuilder() .addAllGroups(groupMemberships.stream() .map(groupsMembership -> toGroup(groupsById.get(groupsMembership.getGroupId()), groupsMembership.isSelected())) .collect(toList())) .setPaging(buildPaging(wsRequest, total)).build(), request, response); } }
@Override public void handle(Request request, Response response) throws Exception { SearchUsersRequest wsRequest = buildRequest(request); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganizationByKey(dbSession, wsRequest.getOrganization()); QProfileDto profile = wsSupport.getProfile(dbSession, organization, wsRequest.getQualityProfile(), wsRequest.getLanguage()); wsSupport.checkCanEdit(dbSession, organization, profile); SearchUsersQuery query = builder() .setOrganization(organization) .setProfile(profile) .setQuery(wsRequest.getQuery()) .setMembership(MEMBERSHIP.get(fromParam(wsRequest.getSelected()))) .build(); int total = dbClient.qProfileEditUsersDao().countByQuery(dbSession, query); List<UserMembershipDto> usersMembership = dbClient.qProfileEditUsersDao().selectByQuery(dbSession, query, forPage(wsRequest.getPage()).andSize(wsRequest.getPageSize())); Map<Integer, UserDto> usersById = dbClient.userDao().selectByIds(dbSession, usersMembership.stream().map(UserMembershipDto::getUserId).collect(toList())) .stream().collect(uniqueIndex(UserDto::getId)); writeProtobuf( SearchUsersResponse.newBuilder() .addAllUsers(usersMembership.stream() .map(userMembershipDto -> toUser(usersById.get(userMembershipDto.getUserId()), userMembershipDto.isSelected())) .collect(toList())) .setPaging(buildPaging(wsRequest, total)).build(), request, response); } }
@Override public void define(WebService.NewController context) { WebService.NewAction action = context.createAction("search_members") .setDescription("Search members of an organization") .setResponseExample(getClass().getResource("search_members-example.json")) .setSince("6.4") .setInternal(true) .setHandler(this); action.addSearchQuery("orwe", "names", "logins"); action.addPagingParams(50, MAX_LIMIT); action.createParam(Param.SELECTED) .setDescription("Depending on the value, show only selected items (selected=selected) or deselected items (selected=deselected).") .setInternal(true) .setDefaultValue(SelectionMode.SELECTED.value()) .setPossibleValues(SelectionMode.SELECTED.value(), SelectionMode.DESELECTED.value()); action.createParam("organization") .setDescription("Organization key") .setInternal(true) .setRequired(false); }
private List<ProjectQprofileAssociationDto> loadAllProjects(String profileKey, DbSession session, String selected, String query) { QProfileDto profile = dbClient.qualityProfileDao().selectByUuid(session, profileKey); OrganizationDto organization = wsSupport.getOrganization(session, profile); List<ProjectQprofileAssociationDto> projects; SelectionMode selectionMode = SelectionMode.fromParam(selected); if (SelectionMode.SELECTED == selectionMode) { projects = dbClient.qualityProfileDao().selectSelectedProjects(session, organization, profile, query); } else if (SelectionMode.DESELECTED == selectionMode) { projects = dbClient.qualityProfileDao().selectDeselectedProjects(session, organization, profile, query); } else { projects = dbClient.qualityProfileDao().selectProjectAssociations(session, organization, profile, query); } return projects; }
private static UserQuery.Builder buildUserQuery(Request request, OrganizationDto organization) { UserQuery.Builder userQuery = UserQuery.builder(); String textQuery = request.param(Param.TEXT_QUERY); checkArgument(textQuery == null || textQuery.length() >= 2, "Query length must be greater than or equal to 2"); userQuery.setTextQuery(textQuery); SelectionMode selectionMode = SelectionMode.fromParam(request.mandatoryParam(Param.SELECTED)); if (SelectionMode.DESELECTED.equals(selectionMode)) { userQuery.setExcludedOrganizationUuid(organization.getUuid()); } else { userQuery.setOrganizationUuid(organization.getUuid()); } return userQuery; }
private static String getMembership(String selected) { SelectionMode selectionMode = SelectionMode.fromParam(selected); String membership = GroupMembershipQuery.ANY; if (SelectionMode.SELECTED == selectionMode) { membership = GroupMembershipQuery.IN; } else if (SelectionMode.DESELECTED == selectionMode) { membership = GroupMembershipQuery.OUT; } return membership; }
/** * Add 'selected=(selected|deselected|all)' for select-list oriented WS. */ public NewAction addSelectionModeParam() { createParam(Param.SELECTED) .setDescription("Depending on the value, show only selected items (selected=selected), deselected items (selected=deselected), " + "or all items with their selection status (selected=all).") .setDefaultValue(SelectionMode.SELECTED.value()) .setPossibleValues(SelectionMode.possibleValues()); return this; } }
private static String getMembership(String selected) { SelectionMode selectionMode = SelectionMode.fromParam(selected); String membership = UserMembershipQuery.ANY; if (SelectionMode.SELECTED == selectionMode) { membership = UserMembershipQuery.IN; } else if (SelectionMode.DESELECTED == selectionMode) { membership = UserMembershipQuery.OUT; } return membership; } }
.setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) .setParam(PARAM_ORGANIZATION, organization.getKey()) .setParam(PARAM_SELECTED, ALL.value()) .setParam(PARAM_PAGE, "1") .setParam(PARAM_PAGE_SIZE, "1") .setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) .setParam(PARAM_ORGANIZATION, organization.getKey()) .setParam(PARAM_SELECTED, ALL.value()) .setParam(PARAM_PAGE, "2") .setParam(PARAM_PAGE_SIZE, "1") .setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) .setParam(PARAM_ORGANIZATION, organization.getKey()) .setParam(PARAM_SELECTED, ALL.value()) .setParam(PARAM_PAGE, "1") .setParam(PARAM_PAGE_SIZE, "2") .setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) .setParam(PARAM_ORGANIZATION, organization.getKey()) .setParam(PARAM_SELECTED, ALL.value()) .setParam(PARAM_PAGE, "1") .setParam(PARAM_PAGE_SIZE, "3") .setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) .setParam(PARAM_ORGANIZATION, organization.getKey()) .setParam(PARAM_SELECTED, ALL.value()) .setParam(PARAM_PAGE, "3") .setParam(PARAM_PAGE_SIZE, "3")
.setParam("id", group.getId().toString()) .setParam("q", "ace") .setParam(Param.SELECTED, SelectionMode.ALL.value()) .execute() .getInput()).isSimilarTo("{\n" +
@Test public void selected_users() { GroupDto group = db.users().insertGroup(db.getDefaultOrganization(), "a group"); UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada").setName("Ada Lovelace")); db.organizations().addMember(db.getDefaultOrganization(), lovelace); UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper")); db.organizations().addMember(db.getDefaultOrganization(), hopper); db.users().insertMember(group, lovelace); loginAsAdminOnDefaultOrganization(); assertJson(newUsersRequest() .setParam("id", group.getId().toString()) .execute() .getInput()).isSimilarTo("{\n" + " \"users\": [\n" + " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" + " ]\n" + "}"); assertJson(newUsersRequest() .setParam("id", group.getId().toString()) .setParam(Param.SELECTED, SelectionMode.SELECTED.value()) .execute() .getInput()).isSimilarTo("{\n" + " \"users\": [\n" + " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" + " ]\n" + "}"); }
@Override public void handle(Request request, Response response) throws Exception { SearchUsersRequest wsRequest = buildRequest(request); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganizationByKey(dbSession, wsRequest.getOrganization()); QProfileDto profile = wsSupport.getProfile(dbSession, organization, wsRequest.getQualityProfile(), wsRequest.getLanguage()); wsSupport.checkCanEdit(dbSession, organization, profile); SearchGroupsQuery query = builder() .setOrganization(organization) .setProfile(profile) .setQuery(wsRequest.getQuery()) .setMembership(MEMBERSHIP.get(fromParam(wsRequest.getSelected()))) .build(); int total = dbClient.qProfileEditGroupsDao().countByQuery(dbSession, query); List<GroupMembershipDto> groupMemberships = dbClient.qProfileEditGroupsDao().selectByQuery(dbSession, query, forPage(wsRequest.getPage()).andSize(wsRequest.getPageSize())); Map<Integer, GroupDto> groupsById = dbClient.groupDao().selectByIds(dbSession, groupMemberships.stream().map(GroupMembershipDto::getGroupId).collect(MoreCollectors.toList())) .stream() .collect(MoreCollectors.uniqueIndex(GroupDto::getId)); writeProtobuf( Qualityprofiles.SearchGroupsResponse.newBuilder() .addAllGroups(groupMemberships.stream() .map(groupsMembership -> toGroup(groupsById.get(groupsMembership.getGroupId()), groupsMembership.isSelected())) .collect(toList())) .setPaging(buildPaging(wsRequest, total)).build(), request, response); } }
@Override public void handle(Request request, Response response) throws Exception { SearchUsersRequest wsRequest = buildRequest(request); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganizationByKey(dbSession, wsRequest.getOrganization()); QProfileDto profile = wsSupport.getProfile(dbSession, organization, wsRequest.getQualityProfile(), wsRequest.getLanguage()); wsSupport.checkCanEdit(dbSession, organization, profile); SearchUsersQuery query = builder() .setOrganization(organization) .setProfile(profile) .setQuery(wsRequest.getQuery()) .setMembership(MEMBERSHIP.get(fromParam(wsRequest.getSelected()))) .build(); int total = dbClient.qProfileEditUsersDao().countByQuery(dbSession, query); List<UserMembershipDto> usersMembership = dbClient.qProfileEditUsersDao().selectByQuery(dbSession, query, forPage(wsRequest.getPage()).andSize(wsRequest.getPageSize())); Map<Integer, UserDto> usersById = dbClient.userDao().selectByIds(dbSession, usersMembership.stream().map(UserMembershipDto::getUserId).collect(toList())) .stream().collect(uniqueIndex(UserDto::getId)); writeProtobuf( SearchUsersResponse.newBuilder() .addAllUsers(usersMembership.stream() .map(userMembershipDto -> toUser(usersById.get(userMembershipDto.getUserId()), userMembershipDto.isSelected())) .collect(toList())) .setPaging(buildPaging(wsRequest, total)).build(), request, response); } }
@Test public void references_group_by_its_name() { OrganizationDto org = db.organizations().insert(); GroupDto group = db.users().insertGroup(org, "the-group"); UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace")); UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper")); db.users().insertMember(group, lovelace); db.organizations().addMember(org, lovelace); db.organizations().addMember(org, hopper); loginAsAdmin(org); String result = newUsersRequest() .setParam("organization", org.getKey()) .setParam("name", group.getName()) .setParam(Param.SELECTED, SelectionMode.ALL.value()) .execute() .getInput(); assertJson(result).isSimilarTo("{\n" + " \"users\": [\n" + " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" + " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" + " ]\n" + "}\n"); }
@Test public void search_non_members() { OrganizationDto organization = db.organizations().insert(); UserDto currentUser = db.users().insertUser(); userSession.logIn(currentUser).addMembership(organization); UserDto anotherUser = db.users().insertUser(); db.organizations().addMember(organization, currentUser, anotherUser); OrganizationDto anotherOrganization = db.organizations().insert(); UserDto userInNoOrganization = db.users().insertUser(); UserDto userInAnotherOrganization = db.users().insertUser(); db.organizations().addMember(anotherOrganization, userInAnotherOrganization); indexAllUsers(); SearchMembersWsResponse result = ws.newRequest() .setParam("organization", organization.getKey()) .setParam("selected", DESELECTED.value()) .executeProtobuf(SearchMembersWsResponse.class); assertThat(result.getUsersList()) .extracting(User::getLogin, User::getName) .containsOnly( tuple(userInNoOrganization.getLogin(), userInNoOrganization.getName()), tuple(userInAnotherOrganization.getLogin(), userInAnotherOrganization.getName())); }
@Test public void return_members_by_group_id() { GroupDto group = db.users().insertGroup(); UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace")); db.organizations().addMember(db.getDefaultOrganization(), lovelace); UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper")); db.organizations().addMember(db.getDefaultOrganization(), hopper); db.users().insertMember(group, lovelace); loginAsAdminOnDefaultOrganization(); String result = newUsersRequest() .setParam("id", group.getId().toString()) .setParam(Param.SELECTED, SelectionMode.ALL.value()) .execute() .getInput(); assertJson(result).isSimilarTo("{\n" + " \"users\": [\n" + " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" + " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" + " ]\n" + "}\n"); }
@Test public void references_group_in_default_organization_by_its_name() { GroupDto group = db.users().insertGroup(); UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace")); db.organizations().addMember(db.getDefaultOrganization(), lovelace); UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper")); db.organizations().addMember(db.getDefaultOrganization(), hopper); db.users().insertMember(group, lovelace); loginAsAdminOnDefaultOrganization(); String result = newUsersRequest() .setParam("name", group.getName()) .setParam(Param.SELECTED, SelectionMode.ALL.value()) .execute() .getInput(); assertJson(result).isSimilarTo("{\n" + " \"users\": [\n" + " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" + " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" + " ]\n" + "}\n"); }