Browse Source

SONAR-8278 Support organizations in web service api/permissions/search_templates

tags/6.2-RC1
Simon Brandhof 7 years ago
parent
commit
f34266f025

+ 8
- 4
server/sonar-server/src/main/java/org/sonar/server/permission/PermissionTemplateService.java View File

@@ -44,6 +44,7 @@ import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.permission.template.PermissionTemplateGroupDto;
import org.sonar.db.permission.template.PermissionTemplateUserDto;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.permission.index.PermissionIndexer;
import org.sonar.server.user.UserSession;

@@ -60,12 +61,15 @@ public class PermissionTemplateService {
private final Settings settings;
private final PermissionIndexer permissionIndexer;
private final UserSession userSession;
private final DefaultOrganizationProvider defaultOrganizationProvider;

public PermissionTemplateService(DbClient dbClient, Settings settings, PermissionIndexer permissionIndexer, UserSession userSession) {
public PermissionTemplateService(DbClient dbClient, Settings settings, PermissionIndexer permissionIndexer, UserSession userSession,
DefaultOrganizationProvider defaultOrganizationProvider) {
this.dbClient = dbClient;
this.settings = settings;
this.permissionIndexer = permissionIndexer;
this.userSession = userSession;
this.defaultOrganizationProvider = defaultOrganizationProvider;
}

/**
@@ -101,7 +105,8 @@ public class PermissionTemplateService {
applyDefault(session, component, userId);
}

public boolean wouldUserHavePermissionWithDefaultTemplate(DbSession dbSession, @Nullable Long userId, String permission, @Nullable String branch, String projectKey, String qualifier) {
public boolean wouldUserHavePermissionWithDefaultTemplate(DbSession dbSession, @Nullable Long userId, String permission, @Nullable String branch, String projectKey,
String qualifier) {
if (userSession.hasPermission(permission)) {
return true;
}
@@ -199,8 +204,7 @@ public class PermissionTemplateService {
*/
@CheckForNull
private PermissionTemplateDto findDefaultTemplate(DbSession dbSession, ComponentDto component) {
// FIXME performance issue here, we should not load all templates
List<PermissionTemplateDto> allPermissionTemplates = dbClient.permissionTemplateDao().selectAll(dbSession);
List<PermissionTemplateDto> allPermissionTemplates = dbClient.permissionTemplateDao().selectAll(dbSession, defaultOrganizationProvider.get().getUuid(), null);
List<PermissionTemplateDto> matchingTemplates = new ArrayList<>();
for (PermissionTemplateDto permissionTemplateDto : allPermissionTemplates) {
String keyPattern = permissionTemplateDto.getKeyPattern();

+ 22
- 12
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java View File

@@ -26,7 +26,11 @@ 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.core.permission.ProjectPermissions;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.server.permission.ws.PermissionWsSupport;
import org.sonar.server.permission.ws.PermissionsWsAction;
import org.sonar.server.user.UserSession;
import org.sonarqube.ws.WsPermissions;
@@ -37,48 +41,54 @@ import org.sonarqube.ws.WsPermissions.SearchTemplatesWsResponse.TemplateIdQualif
import org.sonarqube.ws.client.permission.SearchTemplatesWsRequest;

import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.server.permission.ws.PermissionsWsParametersBuilder.createOrganizationParameter;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_ORGANIZATION_KEY;

public class SearchTemplatesAction implements PermissionsWsAction {
private static final String PROPERTY_PREFIX = "projects_role.";
private static final String DESCRIPTION_SUFFIX = ".desc";

private final DbClient dbClient;
private final UserSession userSession;
private final I18n i18n;
private final PermissionWsSupport support;
private final SearchTemplatesDataLoader dataLoader;

public SearchTemplatesAction(UserSession userSession, I18n i18n, SearchTemplatesDataLoader dataLoader) {
public SearchTemplatesAction(DbClient dbClient, UserSession userSession, I18n i18n, PermissionWsSupport support, SearchTemplatesDataLoader dataLoader) {
this.dbClient = dbClient;
this.userSession = userSession;
this.i18n = i18n;
this.support = support;
this.dataLoader = dataLoader;
}

@Override
public void define(WebService.NewController context) {
context.createAction("search_templates")
WebService.NewAction action = context.createAction("search_templates")
.setDescription("List permission templates.<br />" +
"It requires to be authenticated.")
.setResponseExample(getClass().getResource("search_templates-example.json"))
.setSince("5.2")
.addSearchQuery("defau", "permission template names")
.setHandler(this);

createOrganizationParameter(action);
}

@Override
public void handle(Request wsRequest, Response wsResponse) throws Exception {
userSession.checkLoggedIn();

SearchTemplatesWsResponse searchTemplatesWsResponse = doHandle(toSearchTemplatesWsRequest(wsRequest));
writeProtobuf(searchTemplatesWsResponse, wsRequest, wsResponse);
}
try (DbSession dbSession = dbClient.openSession(false)) {
OrganizationDto org = support.findOrganization(dbSession, wsRequest.param(PARAM_ORGANIZATION_KEY));
SearchTemplatesWsRequest request = new SearchTemplatesWsRequest()
.setOrganizationUuid(org.getUuid())
.setQuery(wsRequest.param(Param.TEXT_QUERY));

private SearchTemplatesWsResponse doHandle(SearchTemplatesWsRequest wsRequest) {
SearchTemplatesData data = dataLoader.load(wsRequest);
return buildResponse(data);
}

private static SearchTemplatesWsRequest toSearchTemplatesWsRequest(Request request) {
return new SearchTemplatesWsRequest().setQuery(request.param(Param.TEXT_QUERY));
SearchTemplatesWsResponse searchTemplatesWsResponse = buildResponse(dataLoader.load(dbSession, request));
writeProtobuf(searchTemplatesWsResponse, wsRequest, wsResponse);
}
}

private WsPermissions.SearchTemplatesWsResponse buildResponse(SearchTemplatesData data) {

+ 14
- 19
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesDataLoader.java View File

@@ -42,28 +42,23 @@ public class SearchTemplatesDataLoader {
this.defaultPermissionTemplateFinder = defaultPermissionTemplateFinder;
}

public SearchTemplatesData load(SearchTemplatesWsRequest request) {
try (DbSession dbSession = dbClient.openSession(false)) {
SearchTemplatesData.Builder data = builder();
List<PermissionTemplateDto> templates = searchTemplates(dbSession, request);
List<Long> templateIds = Lists.transform(templates, PermissionTemplateDto::getId);
List<TemplateUuidQualifier> defaultTemplates = defaultPermissionTemplateFinder.getDefaultTemplatesByQualifier();

data.templates(templates)
.defaultTemplates(defaultTemplates)
.userCountByTemplateIdAndPermission(userCountByTemplateIdAndPermission(dbSession, templateIds))
.groupCountByTemplateIdAndPermission(groupCountByTemplateIdAndPermission(dbSession, templateIds))
.withProjectCreatorByTemplateIdAndPermission(withProjectCreatorsByTemplateIdAndPermission(dbSession, templateIds));

return data.build();
}
public SearchTemplatesData load(DbSession dbSession, SearchTemplatesWsRequest request) {
SearchTemplatesData.Builder data = builder();
List<PermissionTemplateDto> templates = searchTemplates(dbSession, request);
List<Long> templateIds = Lists.transform(templates, PermissionTemplateDto::getId);
List<TemplateUuidQualifier> defaultTemplates = defaultPermissionTemplateFinder.getDefaultTemplatesByQualifier();

data.templates(templates)
.defaultTemplates(defaultTemplates)
.userCountByTemplateIdAndPermission(userCountByTemplateIdAndPermission(dbSession, templateIds))
.groupCountByTemplateIdAndPermission(groupCountByTemplateIdAndPermission(dbSession, templateIds))
.withProjectCreatorByTemplateIdAndPermission(withProjectCreatorsByTemplateIdAndPermission(dbSession, templateIds));

return data.build();
}

private List<PermissionTemplateDto> searchTemplates(DbSession dbSession, SearchTemplatesWsRequest request) {
String nameMatch = request.getQuery();

return nameMatch == null ? dbClient.permissionTemplateDao().selectAll(dbSession)
: dbClient.permissionTemplateDao().selectAll(dbSession, nameMatch);
return dbClient.permissionTemplateDao().selectAll(dbSession, request.getOrganizationUuid(), request.getQuery());
}

private Table<Long, String, Integer> userCountByTemplateIdAndPermission(DbSession dbSession, List<Long> templateIds) {

+ 5
- 2
server/sonar-server/src/test/java/org/sonar/server/permission/PermissionTemplateServiceTest.java View File

@@ -37,6 +37,8 @@ import org.sonar.db.permission.template.PermissionTemplateDbTester;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.permission.index.PermissionIndexer;
import org.sonar.server.tester.UserSessionRule;

@@ -49,7 +51,6 @@ import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION;
import static org.sonar.db.component.ComponentTesting.newProjectDto;
import static org.sonar.db.user.GroupTesting.newGroupDto;


public class PermissionTemplateServiceTest {

private static final String DEFAULT_TEMPLATE = "default_20130101_010203";
@@ -69,7 +70,9 @@ public class PermissionTemplateServiceTest {
private DbSession session = dbTester.getSession();
private Settings settings = new MapSettings();
private PermissionIndexer permissionIndexer = mock(PermissionIndexer.class);
private PermissionTemplateService underTest = new PermissionTemplateService(dbTester.getDbClient(), settings, permissionIndexer, userSession);
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);
private PermissionTemplateService underTest = new PermissionTemplateService(dbTester.getDbClient(), settings,
permissionIndexer, userSession, defaultOrganizationProvider);

@Before
public void setUp() {

+ 5
- 3
server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/ApplyTemplateActionTest.java View File

@@ -40,6 +40,8 @@ import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.issue.index.IssueIndexDefinition;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.permission.PermissionTemplateService;
import org.sonar.server.permission.index.PermissionIndexer;
import org.sonar.server.permission.index.PermissionIndexerTester;
@@ -68,14 +70,14 @@ public class ApplyTemplateActionTest extends BasePermissionWsTest<ApplyTemplateA
private ComponentDto project;
private PermissionTemplateDto template1;
private PermissionTemplateDto template2;

private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(esTester);

private PermissionIndexer permissionIndexer = new PermissionIndexer(db.getDbClient(), esTester.client());
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);

@Override
protected ApplyTemplateAction buildWsAction() {
PermissionTemplateService permissionTemplateService = new PermissionTemplateService(db.getDbClient(), new MapSettings(), permissionIndexer, userSession);
PermissionTemplateService permissionTemplateService = new PermissionTemplateService(db.getDbClient(),
new MapSettings(), permissionIndexer, userSession, defaultOrganizationProvider);
return new ApplyTemplateAction(db.getDbClient(), userSession, permissionTemplateService, newPermissionWsSupport());
}


+ 5
- 1
server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionTest.java View File

@@ -34,6 +34,8 @@ import org.sonar.db.user.UserDto;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.i18n.I18nRule;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.permission.PermissionTemplateService;
import org.sonar.server.permission.index.PermissionIndexer;
import org.sonar.server.permission.ws.BasePermissionWsTest;
@@ -56,10 +58,12 @@ public class BulkApplyTemplateActionTest extends BasePermissionWsTest<BulkApplyT
private PermissionTemplateDto template1;
private PermissionTemplateDto template2;
private PermissionIndexer issuePermissionIndexer = mock(PermissionIndexer.class);
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);

@Override
protected BulkApplyTemplateAction buildWsAction() {
PermissionTemplateService permissionTemplateService = new PermissionTemplateService(db.getDbClient(), new MapSettings(), issuePermissionIndexer, userSession);
PermissionTemplateService permissionTemplateService = new PermissionTemplateService(db.getDbClient(), new MapSettings(),
issuePermissionIndexer, userSession, defaultOrganizationProvider);
return new BulkApplyTemplateAction(db.getDbClient(), userSession, permissionTemplateService, newPermissionWsSupport(), new I18nRule(), newRootResourceTypes());
}


+ 32
- 23
server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/SearchTemplatesActionTest.java View File

@@ -22,18 +22,15 @@ package org.sonar.server.permission.ws.template;
import java.util.Date;
import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.config.MapSettings;
import org.sonar.api.config.Settings;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.System2;
import org.sonar.api.web.UserRole;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.component.ResourceTypesRule;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.GroupDto;
@@ -41,8 +38,8 @@ import org.sonar.db.user.UserDto;
import org.sonar.server.exceptions.UnauthorizedException;
import org.sonar.server.i18n.I18nRule;
import org.sonar.server.permission.ws.BasePermissionWsTest;
import org.sonar.server.permission.ws.PermissionsWsAction;
import org.sonar.server.tester.UserSessionRule;
import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.WsPermissions;

import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
@@ -55,15 +52,7 @@ import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.server.permission.DefaultPermissionTemplates.defaultRootQualifierTemplateProperty;
import static org.sonar.test.JsonAssert.assertJson;

public class SearchTemplatesActionTest extends BasePermissionWsTest {
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Rule
public UserSessionRule userSession = UserSessionRule.standalone();
public class SearchTemplatesActionTest extends BasePermissionWsTest<SearchTemplatesAction> {

private I18nRule i18n = new I18nRule();
private DbClient dbClient = db.getDbClient();
@@ -71,8 +60,7 @@ public class SearchTemplatesActionTest extends BasePermissionWsTest {
private ResourceTypesRule resourceTypes = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT, Qualifiers.VIEW, "DEV");

@Override
protected PermissionsWsAction buildWsAction() {

protected SearchTemplatesAction buildWsAction() {
Settings settings = new MapSettings();
settings.setProperty(defaultRootQualifierTemplateProperty(Qualifiers.PROJECT), UUID_EXAMPLE_01);
settings.setProperty(defaultRootQualifierTemplateProperty(Qualifiers.VIEW), UUID_EXAMPLE_02);
@@ -80,7 +68,7 @@ public class SearchTemplatesActionTest extends BasePermissionWsTest {

DefaultPermissionTemplateFinder defaultPermissionTemplateFinder = new DefaultPermissionTemplateFinder(settings, resourceTypes);
SearchTemplatesDataLoader dataLoader = new SearchTemplatesDataLoader(dbClient, defaultPermissionTemplateFinder);
return new SearchTemplatesAction(userSession, i18n, dataLoader);
return new SearchTemplatesAction(dbClient, userSession, i18n, newPermissionWsSupport(), dataLoader);
}

@Before
@@ -91,7 +79,7 @@ public class SearchTemplatesActionTest extends BasePermissionWsTest {

@Test
public void search_project_permissions() {
PermissionTemplateDto projectTemplate = insertProjectTemplate();
PermissionTemplateDto projectTemplate = insertProjectTemplateOnDefaultOrganization();
PermissionTemplateDto viewsTemplate = insertViewsTemplate();
PermissionTemplateDto developerTemplate = insertDeveloperTemplate();

@@ -138,8 +126,8 @@ public class SearchTemplatesActionTest extends BasePermissionWsTest {
}

@Test
public void search_by_name() {
insertProjectTemplate();
public void search_by_name_in_default_organization() {
insertProjectTemplateOnDefaultOrganization();
insertViewsTemplate();
insertDeveloperTemplate();
db.commit();
@@ -154,6 +142,23 @@ public class SearchTemplatesActionTest extends BasePermissionWsTest {
.doesNotContain("developers");
}

@Test
public void search_in_organization() throws Exception {
OrganizationDto org = db.organizations().insert();
PermissionTemplateDto templateInOrg = insertProjectTemplate(org);
PermissionTemplateDto templateInDefaultOrg = insertProjectTemplateOnDefaultOrganization();
db.commit();

WsPermissions.SearchTemplatesWsResponse result = WsPermissions.SearchTemplatesWsResponse.parseFrom(newRequest()
.setParam("organization", org.getKey())
.setMediaType(MediaTypes.PROTOBUF)
.execute()
.getInputStream());

assertThat(result.getPermissionTemplatesCount()).isEqualTo(1);
assertThat(result.getPermissionTemplates(0).getId()).isEqualTo(templateInOrg.getUuid());
}

@Test
public void fail_if_not_logged_in() {
expectedException.expect(UnauthorizedException.class);
@@ -172,9 +177,13 @@ public class SearchTemplatesActionTest extends BasePermissionWsTest {
.isSimilarTo(getClass().getResource("SearchTemplatesActionTest/display_all_project_permissions.json"));
}

private PermissionTemplateDto insertProjectTemplate() {
private PermissionTemplateDto insertProjectTemplateOnDefaultOrganization() {
return insertProjectTemplate(db.getDefaultOrganization());
}

private PermissionTemplateDto insertProjectTemplate(OrganizationDto org) {
return insertTemplate(newPermissionTemplateDto()
.setOrganizationUuid(db.getDefaultOrganization().getUuid())
.setOrganizationUuid(org.getUuid())
.setUuid(UUID_EXAMPLE_01)
.setName("Default template for Projects")
.setDescription("Template for new projects")

+ 3
- 15
sonar-db/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java View File

@@ -101,21 +101,9 @@ public class PermissionTemplateDao implements Dao {
return mapper(session).selectByUuid(templateUuid);
}

/**
* @deprecated does not support organizations. Should return group ids.
*/
@Deprecated
public List<PermissionTemplateDto> selectAll(DbSession session, String nameMatch) {
String uppercaseNameMatch = toUppercaseSqlQuery(nameMatch);
return mapper(session).selectAll(uppercaseNameMatch);
}

/**
* @deprecated does not support organizations. Should return group ids.
*/
@Deprecated
public List<PermissionTemplateDto> selectAll(DbSession session) {
return mapper(session).selectAll(null);
public List<PermissionTemplateDto> selectAll(DbSession session, String organizationUuid, @Nullable String nameMatch) {
String upperCaseNameLikeSql = nameMatch != null ? toUppercaseSqlQuery(nameMatch) : null;
return mapper(session).selectAll(organizationUuid, upperCaseNameLikeSql);
}

private static String toUppercaseSqlQuery(String nameMatch) {

+ 1
- 1
sonar-db/src/main/java/org/sonar/db/permission/template/PermissionTemplateMapper.java View File

@@ -74,7 +74,7 @@ public interface PermissionTemplateMapper {

int countGroupNamesByQueryAndTemplate(@Param("query") PermissionQuery query, @Param("templateId") long templateId);

List<PermissionTemplateDto> selectAll(@Nullable @Param("nameMatch") String nameMatch);
List<PermissionTemplateDto> selectAll(@Param("organizationUuid") String organizationUuid, @Nullable @Param("upperCaseNameLikeSql") String upperCaseNameLikeSql);

void usersCountByTemplateIdAndPermission(Map<String, Object> parameters, ResultHandler resultHandler);


+ 8
- 8
sonar-db/src/main/resources/org/sonar/db/permission/template/PermissionTemplateMapper.xml View File

@@ -195,15 +195,15 @@
</select>

<select id="selectAll" parameterType="map" resultType="PermissionTemplate">
SELECT
select
<include refid="templateColumns"/>
FROM permission_templates
<where>
<if test="nameMatch!=null">
AND (UPPER(name) LIKE #{nameMatch} ESCAPE '/')
</if>
</where>
ORDER BY UPPER(name), name
from permission_templates
where
organization_uuid = #{organizationUuid,jdbcType=VARCHAR}
<if test="upperCaseNameLikeSql != null">
and upper(name) like #{upperCaseNameLikeSql} escape '/'
</if>
order by upper(name), name
</select>

<select id="selectByName" parameterType="map" resultType="PermissionTemplate">

+ 15
- 13
sonar-db/src/test/java/org/sonar/db/permission/template/PermissionTemplateDaoTest.java View File

@@ -94,17 +94,29 @@ public class PermissionTemplateDaoTest {
}

@Test
public void should_select_all_permission_templates() {
public void selectAll_without_name_filtering() {
db.prepareDbUnit(getClass(), "selectAllPermissionTemplates.xml");
commit();

List<PermissionTemplateDto> permissionTemplates = underTest.selectAll(dbSession);

List<PermissionTemplateDto> permissionTemplates = underTest.selectAll(dbSession, "org1", null);
assertThat(permissionTemplates).hasSize(3);
assertThat(permissionTemplates).extracting("id").containsOnly(1L, 2L, 3L);
assertThat(permissionTemplates).extracting("name").containsOnly("template1", "template2", "template3");
assertThat(permissionTemplates).extracting("kee").containsOnly("template1_20130102_030405", "template2_20130102_030405", "template3_20130102_030405");
assertThat(permissionTemplates).extracting("description").containsOnly("description1", "description2", "description3");

assertThat(underTest.selectAll(dbSession, "missingOrg", null)).isEmpty();
}

@Test
public void selectAll_with_name_filtering() {
PermissionTemplateDto t1InOrg1 = templateDb.insertTemplate(newPermissionTemplateDto().setName("aBcDeF").setOrganizationUuid("org1"));
PermissionTemplateDto t2InOrg1 = templateDb.insertTemplate(newPermissionTemplateDto().setName("cdefgh").setOrganizationUuid("org1"));
PermissionTemplateDto t3InOrg1 = templateDb.insertTemplate(newPermissionTemplateDto().setName("hijkl").setOrganizationUuid("org2"));
PermissionTemplateDto t4InOrg2 = templateDb.insertTemplate(newPermissionTemplateDto().setName("cdefgh").setOrganizationUuid("org2"));

assertThat(underTest.selectAll(dbSession, "org1", "def")).extracting(PermissionTemplateDto::getId).containsExactly(t1InOrg1.getId(), t2InOrg1.getId());
assertThat(underTest.selectAll(dbSession, "org1", "missing")).isEmpty();
}

@Test
@@ -239,16 +251,6 @@ public class PermissionTemplateDaoTest {
assertThat(result).extracting("count").containsOnly(3, 1);
}

@Test
public void select_by_name_query_and_pagination() {
templateDb.insertTemplate(newPermissionTemplateDto().setName("aaabbb"));
templateDb.insertTemplate(newPermissionTemplateDto().setName("aaaccc"));

List<PermissionTemplateDto> templates = underTest.selectAll(dbSession, "aaa");

assertThat(templates.get(0).getName()).isEqualTo("aaabbb");
}

@Test
public void selectPotentialPermissions_with_unknown_template_and_no_user() {
List<String> result = underTest.selectPotentialPermissionsByUserIdAndTemplateId(dbSession, null, 42L);

+ 10
- 0
sonar-ws/src/main/java/org/sonarqube/ws/client/permission/SearchTemplatesWsRequest.java View File

@@ -24,6 +24,7 @@ import javax.annotation.Nullable;

public class SearchTemplatesWsRequest {
private String query;
private String organizationUuid;

@CheckForNull
public String getQuery() {
@@ -34,4 +35,13 @@ public class SearchTemplatesWsRequest {
this.query = query;
return this;
}

public String getOrganizationUuid() {
return organizationUuid;
}

public SearchTemplatesWsRequest setOrganizationUuid(String s) {
this.organizationUuid = s;
return this;
}
}

Loading…
Cancel
Save