From 72c0fa1280ecd2ee5064549d80a60ef64fb19be2 Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Wed, 6 Jul 2016 00:31:45 +0200 Subject: [PATCH] SONAR-7835 Select user permissions --- .../sonar/db/permission/PermissionDao.java | 5 ++ .../sonar/db/permission/PermissionMapper.java | 2 +- .../sonar/db/permission/PermissionQuery.java | 17 ++++++- .../sonar/db/permission/PermissionMapper.xml | 43 ++++++++--------- .../permission/UserWithPermissionDaoTest.java | 48 ++++++++++++++++--- 5 files changed, 82 insertions(+), 33 deletions(-) diff --git a/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java b/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java index dbf7d0f38311..9f4426021d77 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java @@ -33,6 +33,7 @@ import org.sonar.db.user.UserPermissionDto; import static com.google.common.collect.Maps.newHashMap; +import static java.util.Collections.emptyList; import static org.sonar.db.DatabaseUtils.executeLargeInputsWithoutOutput; public class PermissionDao implements Dao { @@ -70,6 +71,10 @@ public int countUsersByQuery(DbSession dbSession, PermissionQuery query) { } public List selectUserPermissionsByQuery(DbSession dbSession, PermissionQuery query) { + if (query.getLogins() != null && query.getLogins().isEmpty()) { + return emptyList(); + } + return mapper(dbSession).selectUserPermissionsByQuery(query); } diff --git a/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java b/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java index f2b94da1b3f6..cad5ff80c400 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java @@ -36,7 +36,7 @@ public interface PermissionMapper { int countUsersByQuery(@Param("query") PermissionQuery query); - List selectUserPermissionsByQuery(PermissionQuery query); + List selectUserPermissionsByQuery(@Param("query") PermissionQuery query); List selectGroups(Map parameters); diff --git a/sonar-db/src/main/java/org/sonar/db/permission/PermissionQuery.java b/sonar-db/src/main/java/org/sonar/db/permission/PermissionQuery.java index d58357d13bca..1d76a9dd426c 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/PermissionQuery.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/PermissionQuery.java @@ -19,6 +19,7 @@ */ package org.sonar.db.permission; +import java.util.List; import java.util.Locale; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -34,7 +35,6 @@ * Query used to get users and groups permissions */ public class PermissionQuery { - public static final int RESULTS_MAX_SIZE = 100; public static final int SEARCH_QUERY_MIN_LENGTH = 3; public static final int DEFAULT_PAGE_SIZE = 20; @@ -46,6 +46,7 @@ public class PermissionQuery { private final String searchQuery; private final String searchQueryToSql; private final boolean withPermissionOnly; + private final List logins; private final int pageSize; private final int pageOffset; @@ -59,6 +60,7 @@ private PermissionQuery(Builder builder) { this.searchQueryToSql = builder.searchQuery == null ? null : buildLikeValue(builder.searchQuery, WildcardPosition.BEFORE_AND_AFTER).toLowerCase(Locale.ENGLISH); this.pageSize = builder.pageSize; this.pageOffset = offset(builder.pageIndex, builder.pageSize); + this.logins = builder.logins; } @CheckForNull @@ -97,6 +99,11 @@ public int getPageOffset() { return pageOffset; } + @CheckForNull + public List getLogins() { + return logins; + } + public static Builder builder() { return new Builder(); } @@ -107,6 +114,7 @@ public static class Builder { private String template; private String searchQuery; private boolean withPermissionOnly; + private List logins; private Integer pageIndex = DEFAULT_PAGE_INDEX; private Integer pageSize = DEFAULT_PAGE_SIZE; @@ -150,11 +158,16 @@ public Builder withPermissionOnly() { return this; } + public Builder setLogins(@Nullable List logins) { + this.logins = logins; + return this; + } + public PermissionQuery build() { this.pageIndex = firstNonNull(pageIndex, DEFAULT_PAGE_INDEX); this.pageSize = firstNonNull(pageSize, DEFAULT_PAGE_SIZE); checkArgument(searchQuery == null || searchQuery.length() >= 3); - checkArgument(!(withPermissionOnly && permission == null)); + checkArgument(logins == null || !logins.isEmpty()); return new PermissionQuery(this); } } diff --git a/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml b/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml index f93c971998fa..79297f8659d4 100644 --- a/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml @@ -3,17 +3,20 @@ + + + FROM users u LEFT JOIN user_roles user_role ON user_role.user_id=u.id @@ -40,17 +43,17 @@ + + + u.login as login, u.name as name, u.email as email, lower(u.name), u.id + + - - - u.login as login, u.name as name, u.email as email, lower(u.name), u.id - - + + from users u left join user_roles ur ON ur.user_id=u.id left join projects p on ur.resource_id = p.id and u.active = ${_true} + + and u.login in + + #{login} + + and lower(u.name) like #{query.searchQueryToSql} ESCAPE '/' @@ -83,25 +97,6 @@ - -