Skip to content

Commit

Permalink
SONAR-10134 Bringing Organization to Search Action
Browse files Browse the repository at this point in the history
  • Loading branch information
Guillaume Jambet authored and julienlancelot committed Dec 14, 2017
1 parent 6de5e4f commit 6c46890
Show file tree
Hide file tree
Showing 7 changed files with 325 additions and 238 deletions.
Expand Up @@ -27,6 +27,7 @@
import org.sonar.core.util.stream.MoreCollectors; import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualitygate.ProjectQgateAssociation; import org.sonar.db.qualitygate.ProjectQgateAssociation;
import org.sonar.db.qualitygate.ProjectQgateAssociationDao; import org.sonar.db.qualitygate.ProjectQgateAssociationDao;
import org.sonar.db.qualitygate.ProjectQgateAssociationDto; import org.sonar.db.qualitygate.ProjectQgateAssociationDto;
Expand All @@ -52,21 +53,19 @@ public QgateProjectFinder(DbClient dbClient, UserSession userSession) {
this.associationDao = dbClient.projectQgateAssociationDao(); this.associationDao = dbClient.projectQgateAssociationDao();
} }


public Association find(ProjectQgateAssociationQuery query) { public Association find(DbSession dbSession, OrganizationDto organization, ProjectQgateAssociationQuery query) {
try (DbSession dbSession = dbClient.openSession(false)) { getQualityGateId(dbSession, organization, query.gateId());
getQualityGateId(dbSession, query.gateId()); List<ProjectQgateAssociationDto> projects = associationDao.selectProjects(dbSession, query);
List<ProjectQgateAssociationDto> projects = associationDao.selectProjects(dbSession, query); List<ProjectQgateAssociationDto> authorizedProjects = keepAuthorizedProjects(dbSession, projects);
List<ProjectQgateAssociationDto> authorizedProjects = keepAuthorizedProjects(dbSession, projects);


Paging paging = forPageIndex(query.pageIndex()) Paging paging = forPageIndex(query.pageIndex())
.withPageSize(query.pageSize()) .withPageSize(query.pageSize())
.andTotal(authorizedProjects.size()); .andTotal(authorizedProjects.size());
return new Association(toProjectAssociations(getPaginatedProjects(authorizedProjects, paging)), paging.hasNextPage()); return new Association(toProjectAssociations(getPaginatedProjects(authorizedProjects, paging)), paging.hasNextPage());
}
} }


private Long getQualityGateId(DbSession dbSession, String gateId) { private Long getQualityGateId(DbSession dbSession, OrganizationDto organization, String gateId) {
return checkFound(qualitygateDao.selectById(dbSession, Long.valueOf(gateId)), "Quality gate '" + gateId + "' does not exists.").getId(); return checkFound(qualitygateDao.selectByOrganizationAndId(dbSession, organization, Long.valueOf(gateId)), "Quality gate '" + gateId + "' does not exists.").getId();
} }


private static List<ProjectQgateAssociationDto> getPaginatedProjects(List<ProjectQgateAssociationDto> projects, Paging paging) { private static List<ProjectQgateAssociationDto> getPaginatedProjects(List<ProjectQgateAssociationDto> projects, Paging paging) {
Expand Down
Expand Up @@ -23,18 +23,32 @@
import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param; import org.sonar.db.DbClient;
import org.sonar.api.utils.text.JsonWriter; import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualitygate.ProjectQgateAssociation; import org.sonar.db.qualitygate.ProjectQgateAssociation;
import org.sonar.db.qualitygate.ProjectQgateAssociationQuery; import org.sonar.db.qualitygate.ProjectQgateAssociationQuery;
import org.sonar.server.qualitygate.QgateProjectFinder; import org.sonar.server.qualitygate.QgateProjectFinder;
import org.sonarqube.ws.Qualitygates;

import static org.sonar.api.server.ws.WebService.Param.SELECTED;
import static org.sonar.db.qualitygate.ProjectQgateAssociationQuery.ANY;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_GATE_ID;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PAGE;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PAGE_SIZE;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_QUERY;
import static org.sonar.server.ws.WsUtils.writeProtobuf;


public class SearchAction implements QualityGatesWsAction { public class SearchAction implements QualityGatesWsAction {


private final DbClient dbClient;
private final QgateProjectFinder projectFinder; private final QgateProjectFinder projectFinder;
private final QualityGatesWsSupport wsSupport;


public SearchAction(QgateProjectFinder projectFinder) { public SearchAction(DbClient dbClient, QgateProjectFinder projectFinder, QualityGatesWsSupport wsSupport) {
this.dbClient = dbClient;
this.projectFinder = projectFinder; this.projectFinder = projectFinder;
this.wsSupport = wsSupport;
} }


@Override @Override
Expand All @@ -43,47 +57,60 @@ public void define(WebService.NewController controller) {
.setDescription("Search for projects associated (or not) to a quality gate.<br/>" + .setDescription("Search for projects associated (or not) to a quality gate.<br/>" +
"Only authorized projects for current user will be returned.") "Only authorized projects for current user will be returned.")
.setSince("4.3") .setSince("4.3")
.setResponseExample(Resources.getResource(this.getClass(), "example-search.json")) .setResponseExample(Resources.getResource(this.getClass(), "search-example.json"))
.setHandler(this); .setHandler(this);


action.createParam(QualityGatesWsParameters.PARAM_GATE_ID) action.createParam(PARAM_GATE_ID)
.setDescription("Quality Gate ID") .setDescription("Quality Gate ID")
.setRequired(true) .setRequired(true)
.setExampleValue("1"); .setExampleValue("1");


action.createParam(QualityGatesWsParameters.PARAM_QUERY) action.createParam(PARAM_QUERY)
.setDescription("To search for projects containing this string. If this parameter is set, \"selected\" is set to \"all\".") .setDescription("To search for projects containing this string. If this parameter is set, \"selected\" is set to \"all\".")
.setExampleValue("abc"); .setExampleValue("abc");


action.addSelectionModeParam(); action.addSelectionModeParam();


action.createParam(QualityGatesWsParameters.PARAM_PAGE) action.createParam(PARAM_PAGE)
.setDescription("Page number") .setDescription("Page number")
.setDefaultValue("1") .setDefaultValue("1")
.setExampleValue("2"); .setExampleValue("2");


action.createParam(QualityGatesWsParameters.PARAM_PAGE_SIZE) action.createParam(PARAM_PAGE_SIZE)
.setDescription("Page size") .setDescription("Page size")
.setExampleValue("10"); .setExampleValue("10");

wsSupport.createOrganizationParam(action);
} }


@Override @Override
public void handle(Request request, Response response) { public void handle(Request request, Response response) {
QgateProjectFinder.Association associations = projectFinder.find(ProjectQgateAssociationQuery.builder()
.gateId(request.mandatoryParam(QualityGatesWsParameters.PARAM_GATE_ID)) try (DbSession dbSession = dbClient.openSession(false)) {
.membership(request.param(QualityGatesWsParameters.PARAM_QUERY) == null ? request.param(Param.SELECTED) : ProjectQgateAssociationQuery.ANY)
.projectSearch(request.param(QualityGatesWsParameters.PARAM_QUERY)) OrganizationDto organization = wsSupport.getOrganization(dbSession, request);
.pageIndex(request.paramAsInt(QualityGatesWsParameters.PARAM_PAGE))
.pageSize(request.paramAsInt(QualityGatesWsParameters.PARAM_PAGE_SIZE)) QgateProjectFinder.Association associations = projectFinder.find(dbSession, organization,
.build()); ProjectQgateAssociationQuery.builder()
try (JsonWriter writer = response.newJsonWriter()) { .gateId(request.mandatoryParam(PARAM_GATE_ID))
writer.beginObject().prop("more", associations.hasMoreResults()); .membership(request.param(PARAM_QUERY) == null ? request.param(SELECTED) : ANY)
writer.name("results").beginArray(); .projectSearch(request.param(PARAM_QUERY))
.pageIndex(request.paramAsInt(PARAM_PAGE))
.pageSize(request.paramAsInt(PARAM_PAGE_SIZE))
.build());

Qualitygates.SearchResponse.Builder createResponse = Qualitygates.SearchResponse.newBuilder()
.setMore(associations.hasMoreResults());

for (ProjectQgateAssociation project : associations.projects()) { for (ProjectQgateAssociation project : associations.projects()) {
writer.beginObject().prop("id", project.id()).prop("name", project.name()).prop(Param.SELECTED, project.isMember()).endObject(); createResponse.addResultsBuilder()
.setId(project.id())
.setName(project.name())
.setSelected(project.isMember());
} }
writer.endArray().endObject().close();
writeProtobuf(createResponse.build(), request, response);

} }
} }

} }

0 comments on commit 6c46890

Please sign in to comment.