From 31d3e86b6a6e0589017c6597e4b0f9ffc3939019 Mon Sep 17 00:00:00 2001
From: BenoƮt Gianinetti <benoit.gianinetti@sonarsource.com>
Date: Thu, 27 Jun 2019 15:05:45 +0200
Subject: SC-764 Return alm ogranization type in /api/navigation/organization

---
 .../org/sonar/server/ui/ws/OrganizationAction.java | 48 ++++++++++++++++------
 .../sonar/server/ui/ws/OrganizationActionTest.java |  3 +-
 sonar-ws/src/main/protobuf/ws-organizations.proto  |  1 +
 3 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java
index e2d3b0a9080..19d4b8a9a19 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/OrganizationAction.java
@@ -19,8 +19,10 @@
  */
 package org.sonar.server.ui.ws;
 
+import com.google.common.base.Preconditions;
 import java.util.List;
 import java.util.Optional;
+import javax.annotation.Nullable;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.server.ws.Change;
 import org.sonar.api.server.ws.Request;
@@ -30,6 +32,7 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.api.web.page.Page;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
+import org.sonar.db.alm.AlmAppInstallDto;
 import org.sonar.db.alm.OrganizationAlmBindingDto;
 import org.sonar.db.component.ComponentQuery;
 import org.sonar.db.organization.OrganizationDto;
@@ -100,16 +103,26 @@ public class OrganizationAction implements NavigationWsAction {
         }
       }
       boolean newProjectPrivate = dbClient.organizationDao().getNewProjectPrivate(dbSession, organization);
+      Optional<OrganizationAlmBindingDto> optOrganizationAlmBinding = dbClient.organizationAlmBindingDao().selectByOrganization(dbSession, organization);
 
       JsonWriter json = response.newJsonWriter();
       json.beginObject();
-      writeOrganization(json, organization, dbClient.organizationAlmBindingDao().selectByOrganization(dbSession, organization), newProjectPrivate);
+      if (optOrganizationAlmBinding.isPresent()) {
+        OrganizationAlmBindingDto organizationAlmBinding = optOrganizationAlmBinding.get();
+        Optional<AlmAppInstallDto> almAppInstall = dbClient.almAppInstallDao().selectByUuid(dbSession, organizationAlmBinding.getAlmAppInstallUuid());
+        Preconditions.checkState(almAppInstall.isPresent(), "Failed to get ALM information for organization '{}': '{}' application is not installed.",
+          organization.getName(), organizationAlmBinding.getAlm().getId());
+        writeOrganization(json, organization, newProjectPrivate, organizationAlmBinding, almAppInstall.get());
+      } else {
+        writeOrganization(json, organization, newProjectPrivate, null, null);
+      }
       json.endObject()
         .close();
     }
   }
 
-  private void writeOrganization(JsonWriter json, OrganizationDto organization, Optional<OrganizationAlmBindingDto> organizationAlmBinding, boolean newProjectPrivate) {
+  private void writeOrganization(JsonWriter json, OrganizationDto organization, boolean newProjectPrivate, @Nullable OrganizationAlmBindingDto organizationAlmBinding,
+    @Nullable AlmAppInstallDto almAppInstall) {
     json.name("organization")
       .beginObject()
       .prop("isDefault", organization.getKey().equals(defaultOrganizationProvider.get().getKey()))
@@ -118,7 +131,26 @@ public class OrganizationAction implements NavigationWsAction {
       .prop("canUpdateProjectsVisibilityToPrivate",
         userSession.hasPermission(ADMINISTER, organization) &&
           billingValidations.canUpdateProjectVisibilityToPrivate(new BillingValidations.Organization(organization.getKey(), organization.getUuid(), organization.getName())));
-    writeAlm(json, organizationAlmBinding);
+
+    if (organizationAlmBinding != null && almAppInstall != null) {
+      writeAlm(json, organizationAlmBinding, almAppInstall);
+    }
+
+    writeOrganizationPages(json, organization);
+  }
+
+  private static void writeAlm(JsonWriter json, OrganizationAlmBindingDto organizationAlmBinding, AlmAppInstallDto almAppInstall) {
+    json
+      .name("alm")
+      .beginObject()
+      .prop("key", organizationAlmBinding.getAlm().getId())
+      .prop("url", organizationAlmBinding.getUrl())
+      .prop("membersSync", organizationAlmBinding.isMembersSyncEnable())
+      .prop("personal", almAppInstall.isOwnerUser())
+      .endObject();
+  }
+
+  private void writeOrganizationPages(JsonWriter json, OrganizationDto organization) {
     json.name("pages");
     writePages(json, pageRepository.getOrganizationPages(false));
     if (userSession.hasPermission(ADMINISTER, organization)) {
@@ -137,14 +169,4 @@ public class OrganizationAction implements NavigationWsAction {
     json.endArray();
   }
 
-  private static void writeAlm(JsonWriter json, Optional<OrganizationAlmBindingDto> organizationAlmBindingOpt) {
-    organizationAlmBindingOpt.ifPresent(
-      organizationAlmBinding -> json
-        .name("alm")
-        .beginObject()
-        .prop("key", organizationAlmBinding.getAlm().getId())
-        .prop("url", organizationAlmBinding.getUrl())
-        .prop("membersSync", organizationAlmBinding.isMembersSyncEnable())
-        .endObject());
-  }
 }
diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java
index 29fa073a563..7d2e3f9905a 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/OrganizationActionTest.java
@@ -194,7 +194,8 @@ public class OrganizationActionTest {
       "    \"alm\": {" +
       "      \"key\": \"" + organizationAlmBinding.getAlm().getId() + "\"," +
       "      \"url\": \"" + organizationAlmBinding.getUrl() + "\"," +
-      "      \"membersSync\": " + organizationAlmBinding.isMembersSyncEnable() +
+      "      \"membersSync\": " + organizationAlmBinding.isMembersSyncEnable() + "," +
+      "      \"personal\": " + almAppInstall.isOwnerUser() +
       "    }" +
       "  }" +
       "}");
diff --git a/sonar-ws/src/main/protobuf/ws-organizations.proto b/sonar-ws/src/main/protobuf/ws-organizations.proto
index c07f6c5a8ed..7a468f3b8fe 100644
--- a/sonar-ws/src/main/protobuf/ws-organizations.proto
+++ b/sonar-ws/src/main/protobuf/ws-organizations.proto
@@ -66,6 +66,7 @@ message Organization {
   message Alm {
     optional string key = 1;
     optional string url = 2;
+    optional bool personal = 3;
   }
 
   message Actions {
-- 
cgit v1.2.3