public List<Integer> selectUserIdsByQuery(DbSession dbSession, PermissionQuery query) { return mapper(dbSession).selectUserIdsByQuery(query) .stream() // Pagination is done in Java because it's too complex to use SQL pagination in Oracle and MsSQL with the distinct .skip(query.getPageOffset()) .limit(query.getPageSize()) .collect(MoreCollectors.toArrayList()); }
private List<UserPermissionDto> findUserPermissions(DbSession dbSession, OrganizationDto org, List<UserDto> users, Optional<ProjectId> project) { if (users.isEmpty()) { return emptyList(); } List<Integer> userIds = users.stream().map(UserDto::getId).collect(Collectors.toList()); PermissionQuery query = PermissionQuery.builder() .setOrganizationUuid(org.getUuid()) .setComponentUuid(project.map(ProjectId::getUuid).orElse(null)) .withAtLeastOnePermission() .build(); return dbClient.userPermissionDao().selectUserPermissionsByQuery(dbSession, query, userIds); } }
public PermissionQuery build() { requireNonNull(organizationUuid, "Organization UUID cannot be null"); this.pageIndex = firstNonNull(pageIndex, DEFAULT_PAGE_INDEX); this.pageSize = firstNonNull(pageSize, DEFAULT_PAGE_SIZE); checkArgument(searchQuery == null || searchQuery.length() >= SEARCH_QUERY_MIN_LENGTH, "Search query should contains at least %s characters", SEARCH_QUERY_MIN_LENGTH); return new PermissionQuery(this); } }
@Test public void create_query_with_default_pagination() { PermissionQuery quey = PermissionQuery.builder() .setOrganizationUuid("ORGANIZATION_UUID") .build(); assertThat(quey.getPageOffset()).isEqualTo(0); assertThat(quey.getPageSize()).isEqualTo(20); }
@Test public void create_query() { PermissionQuery quey = PermissionQuery.builder() .setComponentUuid("COMPONENT_UUID") .setOrganizationUuid("ORGANIZATION_UUID") .setPermission("user") .setSearchQuery("sonar") .build(); assertThat(quey.getComponentUuid()).isEqualTo("COMPONENT_UUID"); assertThat(quey.getOrganizationUuid()).isEqualTo("ORGANIZATION_UUID"); assertThat(quey.getPermission()).isEqualTo("user"); assertThat(quey.getSearchQuery()).isEqualTo("sonar"); }
@Override public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto org = wsSupport.findOrganization(dbSession, request.param(PARAM_ORGANIZATION)); Optional<ProjectId> projectId = wsSupport.findProjectId(dbSession, request); checkProjectAdmin(userSession, org.getUuid(), projectId); PermissionQuery query = buildPermissionQuery(request, org, projectId); // TODO validatePermission(groupsRequest.getPermission(), wsProjectRef); List<GroupDto> groups = findGroups(dbSession, org, query); int total = dbClient.groupPermissionDao().countGroupsByQuery(dbSession, query); List<GroupPermissionDto> groupsWithPermission = findGroupPermissions(dbSession, org, groups, projectId); Paging paging = Paging.forPageIndex(request.mandatoryParamAsInt(Param.PAGE)).withPageSize(query.getPageSize()).andTotal(total); WsGroupsResponse groupsResponse = buildResponse(groups, groupsWithPermission, paging); writeProtobuf(groupsResponse, request, response); } }
@Test public void create_query_with_pagination() { PermissionQuery quey = PermissionQuery.builder() .setOrganizationUuid("ORGANIZATION_UUID") .setPageSize(10) .setPageIndex(5) .build(); assertThat(quey.getPageOffset()).isEqualTo(40); assertThat(quey.getPageSize()).isEqualTo(10); }
@Override public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto org = wsSupport.findOrganization(dbSession, request.param(PARAM_ORGANIZATION)); Optional<ProjectId> projectId = wsSupport.findProjectId(dbSession, request); checkProjectAdmin(userSession, org.getUuid(), projectId); PermissionQuery query = buildPermissionQuery(request, org, projectId); List<UserDto> users = findUsers(dbSession, query); int total = dbClient.userPermissionDao().countUsersByQuery(dbSession, query); List<UserPermissionDto> userPermissions = findUserPermissions(dbSession, org, users, projectId); Paging paging = Paging.forPageIndex(request.mandatoryParamAsInt(Param.PAGE)).withPageSize(query.getPageSize()).andTotal(total); UsersWsResponse usersWsResponse = buildResponse(users, userPermissions, paging); writeProtobuf(usersWsResponse, request, response); } }
private boolean isUserAlreadyAdded(DbSession dbSession, OrganizationDto organizationDto, long templateId, String userLogin, String permission) { PermissionQuery permissionQuery = PermissionQuery.builder().setOrganizationUuid(organizationDto.getUuid()).setPermission(permission).build(); List<String> usersWithPermission = dbClient.permissionTemplateDao().selectUserLoginsByQueryAndTemplate(dbSession, permissionQuery, templateId); return usersWithPermission.stream().anyMatch(s -> s.equals(userLogin)); }
/** * Returns the names of the groups that match the given query, for the given organization. * The virtual group "Anyone" may be returned as the value {@link DefaultGroups#ANYONE}. * @return group names, sorted in alphabetical order */ public List<String> selectGroupNamesByQuery(DbSession dbSession, PermissionQuery query) { return mapper(dbSession).selectGroupNamesByQuery(query, new RowBounds(query.getPageOffset(), query.getPageSize())); }
@Override public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto org = support.findOrganization(dbSession, request.param(PARAM_ORGANIZATION)); Optional<ProjectId> projectId = support.findProjectId(dbSession, request); checkProjectAdmin(userSession, org.getUuid(), projectId); PermissionQuery query = buildPermissionQuery(request, org, projectId); List<UserDto> users = findUsers(dbSession, query); int total = dbClient.userPermissionDao().countUsersByQuery(dbSession, query); List<UserPermissionDto> userPermissions = findUserPermissions(dbSession, org, users, projectId); Paging paging = Paging.forPageIndex(request.mandatoryParamAsInt(Param.PAGE)).withPageSize(query.getPageSize()).andTotal(total); UsersWsResponse usersWsResponse = buildResponse(users, userPermissions, paging); writeProtobuf(usersWsResponse, request, response); } }
public PermissionQuery build() { this.pageIndex = firstNonNull(pageIndex, DEFAULT_PAGE_INDEX); this.pageSize = firstNonNull(pageSize, DEFAULT_PAGE_SIZE); checkArgument(searchQuery == null || searchQuery.length() >= SEARCH_QUERY_MIN_LENGTH, "Search query should contains at least %s characters", SEARCH_QUERY_MIN_LENGTH); return new PermissionQuery(this); } }
private static PermissionQuery permissionQuery(String permissionKey, OrganizationDto org) { return PermissionQuery.builder() .setOrganizationUuid(org.getUuid()) .setPermission(permissionKey) .withAtLeastOnePermission() .build(); } }
/** * @return a paginated list of user logins. */ public List<String> selectUserLoginsByQueryAndTemplate(DbSession session, PermissionQuery query, long templateId) { return mapper(session).selectUserLoginsByQueryAndTemplate(query, templateId, new RowBounds(query.getPageOffset(), query.getPageSize())); }
@Override public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto org = support.findOrganization(dbSession, request.param(PARAM_ORGANIZATION)); Optional<ProjectId> projectId = support.findProjectId(dbSession, request); checkProjectAdmin(userSession, org.getUuid(), projectId); PermissionQuery query = buildPermissionQuery(request, org, projectId); // TODO validatePermission(groupsRequest.getPermission(), wsProjectRef); List<GroupDto> groups = findGroups(dbSession, org, query); int total = dbClient.groupPermissionDao().countGroupsByQuery(dbSession, query); List<GroupPermissionDto> groupsWithPermission = findGroupPermissions(dbSession, org, groups, projectId); Paging paging = Paging.forPageIndex(request.mandatoryParamAsInt(Param.PAGE)).withPageSize(query.getPageSize()).andTotal(total); WsGroupsResponse groupsResponse = buildResponse(groups, groupsWithPermission, paging); writeProtobuf(groupsResponse, request, response); } }
private int countGroups(DbSession dbSession, OrganizationDto org, String permission) { PermissionQuery query = PermissionQuery.builder().setOrganizationUuid(org.getUuid()).setPermission(permission).build(); return dbClient.groupPermissionDao().countGroupsByQuery(dbSession, query); }
public List<String> selectGroupNamesByQueryAndTemplate(DbSession session, PermissionQuery query, long templateId) { return mapper(session).selectGroupNamesByQueryAndTemplate(templateId, query, new RowBounds(query.getPageOffset(), query.getPageSize())); }
@Test public void select_group_names_by_query_and_template_is_paginated() { OrganizationDto organization = db.organizations().insert(); IntStream.rangeClosed(0, 9).forEach(i -> db.users().insertGroup(organization, i + "-name")); PermissionTemplateDto template = permissionTemplateDbTester.insertTemplate(organization); assertThat(selectGroupNamesByQueryAndTemplate(builder().setPageIndex(1).setPageSize(1), organization, template)) .containsExactly("0-name"); assertThat(selectGroupNamesByQueryAndTemplate(builder().setPageIndex(2).setPageSize(3), organization, template)) .containsExactly("3-name", "4-name", "5-name"); }
/** * Returns the names of the groups that match the given query, for the given organization. * The virtual group "Anyone" may be returned as the value {@link DefaultGroups#ANYONE}. * @return group names, sorted in alphabetical order */ public List<String> selectGroupNamesByQuery(DbSession dbSession, String organizationUuid, PermissionQuery query) { return mapper(dbSession).selectGroupNamesByQuery(organizationUuid, query, new RowBounds(query.getPageOffset(), query.getPageSize())); }
private PermissionQuery.Builder newQuery() { return PermissionQuery.builder().setOrganizationUuid(db.getDefaultOrganization().getUuid()); }