aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-dao
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2018-10-30 08:34:54 +0100
committerSonarTech <sonartech@sonarsource.com>2018-11-16 20:21:05 +0100
commit2507163633382d56601e825ba2aadafc3edbbe9f (patch)
tree02c8d3f113653a59611637f797b11151b8701638 /server/sonar-db-dao
parent02f78a025d5a3569c9b1c9e6e1cc5e170b27f91c (diff)
downloadsonarqube-2507163633382d56601e825ba2aadafc3edbbe9f.tar.gz
sonarqube-2507163633382d56601e825ba2aadafc3edbbe9f.zip
SONAR-11321 Prevent binding already bound application
Diffstat (limited to 'server/sonar-db-dao')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java7
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java3
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java3
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml19
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java34
5 files changed, 57 insertions, 9 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java
index 3612870461b..5a21a4be784 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingDao.java
@@ -29,6 +29,7 @@ import org.sonar.db.Dao;
import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
+import static java.util.Optional.ofNullable;
import static org.sonar.db.DatabaseUtils.executeLargeInputs;
public class OrganizationAlmBindingDao implements Dao {
@@ -42,7 +43,7 @@ public class OrganizationAlmBindingDao implements Dao {
}
public Optional<OrganizationAlmBindingDto> selectByOrganization(DbSession dbSession, OrganizationDto organization) {
- return Optional.ofNullable(getMapper(dbSession).selectByOrganizationUuid(organization.getUuid()));
+ return ofNullable(getMapper(dbSession).selectByOrganizationUuid(organization.getUuid()));
}
public List<OrganizationAlmBindingDto> selectByOrganizations(DbSession dbSession, Collection<OrganizationDto> organizations) {
@@ -50,6 +51,10 @@ public class OrganizationAlmBindingDao implements Dao {
organizationUuids -> getMapper(dbSession).selectByOrganizationUuids(organizationUuids));
}
+ public Optional<OrganizationAlmBindingDto> selectByAlmAppInstall(DbSession dbSession, AlmAppInstallDto almAppInstall) {
+ return ofNullable(getMapper(dbSession).selectByInstallationUuid(almAppInstall.getUuid()));
+ }
+
public void insert(DbSession dbSession, OrganizationDto organization, AlmAppInstallDto almAppInstall, String url, String userUuid) {
long now = system2.now();
getMapper(dbSession).insert(new OrganizationAlmBindingDto()
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java
index f664a50f51b..ec29ed9f93d 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/OrganizationAlmBindingMapper.java
@@ -31,6 +31,9 @@ public interface OrganizationAlmBindingMapper {
List<OrganizationAlmBindingDto> selectByOrganizationUuids(@Param("organizationUuids") Collection<String> organizationUuids);
+ @CheckForNull
+ OrganizationAlmBindingDto selectByInstallationUuid(@Param("installationUuid") String installationUuid);
+
void insert(@Param("dto") OrganizationAlmBindingDto dto);
void deleteByOrganizationUuid(@Param("organizationUuid") String organizationUuid);
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java
index d8a40ea81fc..14e607a85fb 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDto.java
@@ -109,6 +109,7 @@ public class OrganizationDto {
return this;
}
+ @CheckForNull
public String getDescription() {
return description;
}
@@ -118,6 +119,7 @@ public class OrganizationDto {
return this;
}
+ @CheckForNull
public String getUrl() {
return url;
}
@@ -127,6 +129,7 @@ public class OrganizationDto {
return this;
}
+ @CheckForNull
public String getAvatarUrl() {
return avatarUrl;
}
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml
index 395eb9100e5..1f636ee415b 100644
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml
+++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/OrganizationAlmBindingMapper.xml
@@ -26,12 +26,21 @@
select
<include refid="columns"/>
from
- organization_alm_bindings
+ organization_alm_bindings
+ where
+ organization_uuid in
+ <foreach collection="organizationUuids" open="(" close=")" item="organizationUuid" separator=",">
+ #{organizationUuid , jdbcType=VARCHAR}
+ </foreach>
+ </select>
+
+ <select id="selectByInstallationUuid" parameterType="String" resultType="org.sonar.db.alm.OrganizationAlmBindingDto">
+ select
+ <include refid="columns"/>
+ from
+ organization_alm_bindings
where
- organization_uuid in
- <foreach collection="organizationUuids" open="(" close=")" item="organizationUuid" separator=",">
- #{organizationUuid , jdbcType=VARCHAR}
- </foreach>
+ alm_app_install_uuid = #{installationUuid, jdbcType=VARCHAR}
</select>
<insert id="insert" parameterType="Map" useGeneratedKeys="false">
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java
index 8972e200a09..857a403ab40 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/OrganizationAlmBindingDaoTest.java
@@ -25,14 +25,12 @@ import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.internal.TestSystem2;
import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.user.UserDto;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.assertj.core.groups.Tuple.tuple;
@@ -75,7 +73,7 @@ public class OrganizationAlmBindingDaoTest {
OrganizationDto organization = db.organizations().insert();
AlmAppInstallDto almAppInstall = db.alm().insertAlmAppInstall();
db.alm().insertOrganizationAlmBinding(organization, almAppInstall);
- // No binding on other organization
+ // No binding on other installation
OrganizationDto otherOrganization = db.organizations().insert();
Optional<OrganizationAlmBindingDto> result = underTest.selectByOrganization(db.getSession(), otherOrganization);
@@ -101,6 +99,36 @@ public class OrganizationAlmBindingDaoTest {
}
@Test
+ public void selectByAlmAppInstall() {
+ OrganizationDto organization = db.organizations().insert();
+ AlmAppInstallDto almAppInstall = db.alm().insertAlmAppInstall();
+ OrganizationAlmBindingDto dto = db.alm().insertOrganizationAlmBinding(organization, almAppInstall);
+
+ Optional<OrganizationAlmBindingDto> result = underTest.selectByAlmAppInstall(db.getSession(), almAppInstall);
+
+ assertThat(result.get())
+ .extracting(OrganizationAlmBindingDto::getUuid, OrganizationAlmBindingDto::getOrganizationUuid, OrganizationAlmBindingDto::getAlmAppInstallUuid,
+ OrganizationAlmBindingDto::getUrl, OrganizationAlmBindingDto::getAlm,
+ OrganizationAlmBindingDto::getUserUuid, OrganizationAlmBindingDto::getCreatedAt)
+ .containsExactlyInAnyOrder(dto.getUuid(), organization.getUuid(), dto.getAlmAppInstallUuid(),
+ dto.getUrl(), ALM.GITHUB,
+ dto.getUserUuid(), NOW);
+ }
+
+ @Test
+ public void selectByAlmAppInstall_returns_empty_when_installation_is_not_bound_to_organization() {
+ OrganizationDto organization = db.organizations().insert();
+ AlmAppInstallDto almAppInstall = db.alm().insertAlmAppInstall();
+ db.alm().insertOrganizationAlmBinding(organization, almAppInstall);
+ // No binding on other organization
+ AlmAppInstallDto otherAlmAppInstall = db.alm().insertAlmAppInstall();
+
+ Optional<OrganizationAlmBindingDto> result = underTest.selectByAlmAppInstall(db.getSession(), otherAlmAppInstall);
+
+ assertThat(result).isEmpty();
+ }
+
+ @Test
public void insert() {
when(uuidFactory.create()).thenReturn("ABCD");
OrganizationDto organization = db.organizations().insert();