]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8892 Add an organization member in database
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Thu, 9 Mar 2017 11:21:14 +0000 (12:21 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 21 Mar 2017 12:05:50 +0000 (13:05 +0100)
server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java
server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java
server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java
server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java
server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDao.java [new file with mode: 0644]
server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberDto.java [new file with mode: 0644]
server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMemberMapper.java [new file with mode: 0644]
server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMemberMapper.xml [new file with mode: 0644]
server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java
server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationMemberDaoTest.java [new file with mode: 0644]

index c416ceb7a9d6a7910d07b64404d1add424d60f2b..f1e24e5c84c5e82773fe3ab5d0adeee3e45b081f 100644 (file)
@@ -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
index b088950c1bdfcffc04df90bd27141a26d052ef7b..17e164dfd1df078017a1c8db269cd7453b1b22ff 100644 (file)
@@ -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,
index 0102d58ac2ffd31ec9a1ff65a2392a4f5f463b07..c36d7934c0be22d9bb2fbe0794f539ff2e21964d 100644 (file)
@@ -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;
   }
index 6f88bffc749ea378291adddcb6aa46ea08be9294..b55c6e18984e20e43f50ff20d3d047f8bb9f1296 100644 (file)
@@ -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 (file)
index 0000000..81668a5
--- /dev/null
@@ -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 (file)
index 0000000..93ff03a
--- /dev/null
@@ -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 (file)
index 0000000..cec53d6
--- /dev/null
@@ -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 (file)
index 0000000..bdb1449
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.sonar.db.organization.OrganizationMemberMapper">
+  <insert id="insert" parameterType="OrganizationMember" useGeneratedKeys="false">
+    insert into organization_members
+    (
+    organization_uuid,
+    user_id
+    )
+    values
+    (
+    #{organizationUuid, jdbcType=VARCHAR},
+    #{userId, jdbcType=INTEGER}
+    )
+  </insert>
+</mapper>
index 914622cfd1e8feb55b578c9930ad212f1e4388aa..4e2c7cb812e4e4ff162a937bb8da518a5730a8cb 100644 (file)
@@ -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 (file)
index 0000000..09c82d5
--- /dev/null
@@ -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<String, Object> 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);
+  }
+}