From a9f15d8ddb02de93e87cdd95cb6151922d7bf489 Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Thu, 9 Mar 2017 12:21:14 +0100 Subject: [PATCH] SONAR-8892 Add an organization member in database --- .../ComputeEngineContainerImplTest.java | 2 +- .../src/main/java/org/sonar/db/DaoModule.java | 2 + .../src/main/java/org/sonar/db/DbClient.java | 7 ++ .../src/main/java/org/sonar/db/MyBatis.java | 4 + .../organization/OrganizationMemberDao.java | 34 ++++++++ .../organization/OrganizationMemberDto.java | 44 ++++++++++ .../OrganizationMemberMapper.java | 25 ++++++ .../organization/OrganizationMemberMapper.xml | 18 ++++ .../test/java/org/sonar/db/DaoModuleTest.java | 2 +- .../OrganizationMemberDaoTest.java | 82 +++++++++++++++++++ 10 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java create mode 100644 server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDto.java create mode 100644 server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java create mode 100644 server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml create mode 100644 server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationMemberDaoTest.java diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java index c416ceb7a9d..f1e24e5c84c 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java @@ -108,7 +108,7 @@ public class ComputeEngineContainerImplTest { assertThat(picoContainer.getParent().getParent().getParent().getComponentAdapters()).hasSize( COMPONENTS_IN_LEVEL_1_AT_CONSTRUCTION + 23 // level 1 - + 47 // content of DaoModule + + 48 // content of DaoModule + 3 // content of EsSearchModule + 57 // content of CorePropertyDefinitions + 1 // content of CePropertyDefinitions diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java index b088950c1bd..17e164dfd1d 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java @@ -41,6 +41,7 @@ import org.sonar.db.measure.custom.CustomMeasureDao; import org.sonar.db.metric.MetricDao; import org.sonar.db.notification.NotificationQueueDao; import org.sonar.db.organization.OrganizationDao; +import org.sonar.db.organization.OrganizationMemberDao; import org.sonar.db.permission.AuthorizationDao; import org.sonar.db.permission.GroupPermissionDao; import org.sonar.db.permission.UserPermissionDao; @@ -98,6 +99,7 @@ public class DaoModule extends Module { MetricDao.class, NotificationQueueDao.class, OrganizationDao.class, + OrganizationMemberDao.class, PermissionTemplateCharacteristicDao.class, PermissionTemplateDao.class, ProjectQgateAssociationDao.class, diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java index 0102d58ac2f..c36d7934c0b 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java @@ -40,6 +40,7 @@ import org.sonar.db.measure.custom.CustomMeasureDao; import org.sonar.db.metric.MetricDao; import org.sonar.db.notification.NotificationQueueDao; import org.sonar.db.organization.OrganizationDao; +import org.sonar.db.organization.OrganizationMemberDao; import org.sonar.db.permission.AuthorizationDao; import org.sonar.db.permission.GroupPermissionDao; import org.sonar.db.permission.UserPermissionDao; @@ -74,6 +75,7 @@ public class DbClient { private final SchemaMigrationDao schemaMigrationDao; private final AuthorizationDao authorizationDao; private final OrganizationDao organizationDao; + private final OrganizationMemberDao organizationMemberDao; private final QualityProfileDao qualityProfileDao; private final LoadedTemplateDao loadedTemplateDao; private final PropertiesDao propertiesDao; @@ -128,6 +130,7 @@ public class DbClient { schemaMigrationDao = getDao(map, SchemaMigrationDao.class); authorizationDao = getDao(map, AuthorizationDao.class); organizationDao = getDao(map, OrganizationDao.class); + organizationMemberDao = getDao(map, OrganizationMemberDao.class); qualityProfileDao = getDao(map, QualityProfileDao.class); loadedTemplateDao = getDao(map, LoadedTemplateDao.class); propertiesDao = getDao(map, PropertiesDao.class); @@ -192,6 +195,10 @@ public class DbClient { return organizationDao; } + public OrganizationMemberDao organizationMemberDao() { + return organizationMemberDao; + } + public IssueDao issueDao() { return issueDao; } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java index 6f88bffc749..b55c6e18984 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java @@ -66,6 +66,8 @@ import org.sonar.db.notification.NotificationQueueDto; import org.sonar.db.notification.NotificationQueueMapper; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationMapper; +import org.sonar.db.organization.OrganizationMemberDto; +import org.sonar.db.organization.OrganizationMemberMapper; import org.sonar.db.permission.AuthorizationMapper; import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.permission.GroupPermissionMapper; @@ -156,6 +158,7 @@ public class MyBatis implements Startable { confBuilder.loadAlias("Measure", MeasureDto.class); confBuilder.loadAlias("NotificationQueue", NotificationQueueDto.class); confBuilder.loadAlias("Organization", OrganizationDto.class); + confBuilder.loadAlias("OrganizationMember", OrganizationMemberDto.class); confBuilder.loadAlias("PermissionTemplateCharacteristic", PermissionTemplateCharacteristicDto.class); confBuilder.loadAlias("PermissionTemplateGroup", PermissionTemplateGroupDto.class); confBuilder.loadAlias("PermissionTemplate", PermissionTemplateDto.class); @@ -211,6 +214,7 @@ public class MyBatis implements Startable { MetricMapper.class, NotificationQueueMapper.class, OrganizationMapper.class, + OrganizationMemberMapper.class, PermissionTemplateCharacteristicMapper.class, PermissionTemplateMapper.class, ProjectQgateAssociationMapper.class, diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java new file mode 100644 index 00000000000..81668a5174a --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java @@ -0,0 +1,34 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.db.organization; + +import org.sonar.db.Dao; +import org.sonar.db.DbSession; + +public class OrganizationMemberDao implements Dao { + public void insert(DbSession dbSession, OrganizationMemberDto organizationMemberDto) { + mapper(dbSession).insert(organizationMemberDto); + } + + private OrganizationMemberMapper mapper(DbSession dbSession) { + return dbSession.getMapper(OrganizationMemberMapper.class); + } +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDto.java new file mode 100644 index 00000000000..93ff03a7b8c --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDto.java @@ -0,0 +1,44 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.db.organization; + +public class OrganizationMemberDto { + private String organizationUuid; + private Integer userId; + + public String getOrganizationUuid() { + return organizationUuid; + } + + public OrganizationMemberDto setOrganizationUuid(String organizationUuid) { + this.organizationUuid = organizationUuid; + return this; + } + + public Integer getUserId() { + return userId; + } + + public OrganizationMemberDto setUserId(Integer userId) { + this.userId = userId; + return this; + } +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java new file mode 100644 index 00000000000..cec53d6b149 --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java @@ -0,0 +1,25 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.db.organization; + +public interface OrganizationMemberMapper { + void insert(OrganizationMemberDto organizationMember); +} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml new file mode 100644 index 00000000000..bdb144975a3 --- /dev/null +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml @@ -0,0 +1,18 @@ + + + + + + + insert into organization_members + ( + organization_uuid, + user_id + ) + values + ( + #{organizationUuid, jdbcType=VARCHAR}, + #{userId, jdbcType=INTEGER} + ) + + diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java index 914622cfd1e..4e2c7cb812e 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java @@ -29,6 +29,6 @@ public class DaoModuleTest { public void verify_count_of_added_components() { ComponentContainer container = new ComponentContainer(); new DaoModule().configure(container); - assertThat(container.size()).isEqualTo(2 + 45); + assertThat(container.size()).isEqualTo(2 + 46); } } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationMemberDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationMemberDaoTest.java new file mode 100644 index 00000000000..09c82d526e4 --- /dev/null +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationMemberDaoTest.java @@ -0,0 +1,82 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.db.organization; + +import java.util.Map; +import org.apache.ibatis.exceptions.PersistenceException; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; +import org.sonar.db.DbTester; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +public class OrganizationMemberDaoTest { + @Rule + public final DbTester db = DbTester.create().setDisableDefaultOrganization(true); + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private DbClient dbClient = db.getDbClient(); + private DbSession dbSession = db.getSession(); + + private OrganizationMemberDao underTest = dbClient.organizationMemberDao(); + + @Test + public void insert() { + underTest.insert(dbSession, create("O_1", 256)); + + Map result = db.selectFirst(dbSession, "select organization_uuid as \"organizationUuid\", user_id as \"userId\" from organization_members"); + + assertThat(result).containsOnly(entry("organizationUuid", "O_1"), entry("userId", 256L)); + } + + @Test + public void fail_insert_if_no_organization_uuid() { + expectedException.expect(PersistenceException.class); + + underTest.insert(dbSession, create(null, 256)); + } + + @Test + public void fail_insert_if_no_user_id() { + expectedException.expect(PersistenceException.class); + + underTest.insert(dbSession, create("O_1", null)); + } + + @Test + public void fail_if_organization_member_already_exist() { + underTest.insert(dbSession, create("O_1", 256)); + expectedException.expect(PersistenceException.class); + + underTest.insert(dbSession, create("O_1", 256)); + } + + private OrganizationMemberDto create(String organizationUuid, Integer userId) { + return new OrganizationMemberDto() + .setOrganizationUuid(organizationUuid) + .setUserId(userId); + } +} -- 2.39.5