From: Julien HENRY Date: Mon, 30 Jul 2018 16:04:30 +0000 (+0200) Subject: SONAR-11039 Return ALM link in api/navigation/component X-Git-Tag: 7.5~624 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=09cfe39f8e8cc6c5b23182d282dd2e1257fbdbca;p=sonarqube.git SONAR-11039 Return ALM link in api/navigation/component --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsDao.java index e4a77591ab0..51d5789ae89 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsDao.java @@ -64,6 +64,10 @@ public class ProjectAlmBindingsDao implements Dao { return getMapper(dbSession).bindingCount(alm.getId(), repoId) == 1; } + public Optional selectByProjectUuid(DbSession session, String projectUuid) { + return Optional.ofNullable(getMapper(session).selectByProjectUuid(projectUuid)); + } + /** * Gets a list of bindings by their repo_id. The result does NOT contain {@code null} values for bindings not found, so * the size of result may be less than the number of ids. @@ -88,4 +92,5 @@ public class ProjectAlmBindingsDao implements Dao { private static ProjectAlmBindingsMapper getMapper(DbSession dbSession) { return dbSession.getMapper(ProjectAlmBindingsMapper.class); } + } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsMapper.java index b8c5464a254..41eec6968e4 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsMapper.java @@ -36,4 +36,6 @@ public interface ProjectAlmBindingsMapper { List selectByRepoIds(@Param("almId") String almId, @Param("repoIds") List repoIds); ProjectAlmBindingDto selectByRepoId(@Param("almId") String almId, @Param("repoId") String repoId); + + ProjectAlmBindingDto selectByProjectUuid(@Param("projectUuid") String projectUuid); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingsMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingsMapper.xml index 9b6b65d2ae2..317e4038790 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingsMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingsMapper.xml @@ -79,4 +79,17 @@ and repo_id = #{repoId, jdbcType=VARCHAR} + + diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/ProjectAlmBindingsDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/ProjectAlmBindingsDaoTest.java index 287582125c0..b434588cdab 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/ProjectAlmBindingsDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/ProjectAlmBindingsDaoTest.java @@ -231,6 +231,29 @@ public class ProjectAlmBindingsDaoTest { assertThat(dto.get().getGithubSlug()).isEqualTo(A_GITHUB_SLUG); } + @Test + public void select_by_project_uuid() { + when(system2.now()).thenReturn(DATE); + when(uuidFactory.create()) + .thenReturn("uuid1") + .thenReturn("uuid2") + .thenReturn("uuid3"); + underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL); + underTest.insertOrUpdate(dbSession, GITHUB, ANOTHER_REPO, ANOTHER_UUID, null, ANOTHER_URL); + underTest.insertOrUpdate(dbSession, BITBUCKETCLOUD, ANOTHER_REPO, "foo", null, "http://foo"); + + assertThat(underTest.selectByProjectUuid(dbSession, "missing")).isNotPresent(); + + Optional dto = underTest.selectByProjectUuid(dbSession, A_UUID); + assertThat(dto).isPresent(); + assertThat(dto.get().getUuid()).isEqualTo("uuid1"); + assertThat(dto.get().getAlmId()).isEqualTo(GITHUB.getId()); + assertThat(dto.get().getRepoId()).isEqualTo(A_REPO); + assertThat(dto.get().getProjectUuid()).isEqualTo(A_UUID); + assertThat(dto.get().getUrl()).isEqualTo(A_URL); + assertThat(dto.get().getGithubSlug()).isEqualTo(A_GITHUB_SLUG); + } + @Test public void select_by_repo_ids() { when(system2.now()).thenReturn(DATE); diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java index c8964af2459..b526c287961 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java @@ -41,6 +41,7 @@ import org.sonar.api.web.UserRole; import org.sonar.api.web.page.Page; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.alm.ProjectAlmBindingDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.measure.LiveMeasureDto; @@ -116,7 +117,8 @@ public class ComponentAction implements NavigationWsAction { .setResponseExample(getClass().getResource("component-example.json")) .setSince("5.2") .setChangelog( - new Change("6.4", "The 'visibility' field is added")); + new Change("6.4", "The 'visibility' field is added"), + new Change("7.3", "The 'almRepoUrl' and 'almId' fields are added")); action.createParam(PARAM_COMPONENT) .setDescription("A component key.") @@ -155,6 +157,7 @@ public class ComponentAction implements NavigationWsAction { JsonWriter json = response.newJsonWriter(); json.beginObject(); writeComponent(json, session, component, org, analysis.orElse(null)); + writeAlmDetails(json, session, component); writeProfiles(json, session, component); writeQualityGate(json, session, org, project); if (userSession.hasComponentPermission(ADMIN, component) || @@ -167,6 +170,12 @@ public class ComponentAction implements NavigationWsAction { } } + private void writeAlmDetails(JsonWriter json, DbSession session, ComponentDto component) { + Optional bindingOpt = dbClient.projectAlmBindingsDao().selectByProjectUuid(session, component.uuid()); + bindingOpt.ifPresent(b -> json.prop("almId", b.getAlmId()) + .prop("almRepoUrl", b.getUrl())); + } + private static Consumer writeToJson(JsonWriter json) { return profile -> json.beginObject() .prop("key", profile.getQpKey()) diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java index c214196f65c..4465e76135b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java @@ -39,6 +39,7 @@ import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; import org.sonar.db.DbClient; import org.sonar.db.DbTester; +import org.sonar.db.alm.ALM; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; @@ -576,7 +577,8 @@ public class ComponentActionTest { assertThat(action.description()).isNotNull(); assertThat(action.responseExample()).isNotNull(); assertThat(action.changelog()).extracting(Change::getVersion, Change::getDescription).containsExactlyInAnyOrder( - tuple("6.4", "The 'visibility' field is added")); + tuple("6.4", "The 'visibility' field is added"), + tuple("7.3", "The 'almRepoUrl' and 'almId' fields are added")); WebService.Param componentId = action.param(PARAM_COMPONENT); assertThat(componentId.isRequired()).isFalse(); @@ -586,6 +588,17 @@ public class ComponentActionTest { assertThat(componentId.deprecatedKeySince()).isEqualTo("6.4"); } + @Test + public void return_component_alm_info() { + ComponentDto project = insertOrganizationAndProject(); + dbClient.projectAlmBindingsDao().insertOrUpdate(db.getSession(), ALM.BITBUCKETCLOUD, "{123456789}", project.uuid(), null, "http://bitbucket.org/foo/bar"); + db.getSession().commit(); + userSession.addProjectPermission(UserRole.USER, project); + init(); + + executeAndVerify(project.getDbKey(), "return_component_info_with_alm.json"); + } + private ComponentDto insertOrganizationAndProject() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org")); db.qualityGates().createDefaultQualityGate(organization); diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json new file mode 100644 index 00000000000..e28c5cfb2a0 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json @@ -0,0 +1,16 @@ +{ + "organization": "my-org", + "key": "polop", + "id": "abcd", + "name": "Polop", + "description": "test project", + "almId": "bitbucketcloud", + "almRepoUrl": "http://bitbucket.org/foo/bar", + "breadcrumbs": [ + { + "key": "polop", + "name": "Polop", + "qualifier": "TRK" + } + ] +}