]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15588 Endpoint for dismissing sonarlint promotion
authorZipeng WU <zipeng.wu@sonarsource.com>
Fri, 29 Oct 2021 13:23:24 +0000 (15:23 +0200)
committersonartech <sonartech@sonarsource.com>
Wed, 3 Nov 2021 20:03:31 +0000 (20:03 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/DismissSonarlintAdAction.java [new file with mode: 0644]
server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/UsersWsModule.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/DismissSonarlintAdActionTest.java [new file with mode: 0644]
server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/UsersWsModuleTest.java
sonar-ws/src/main/java/org/sonarqube/ws/client/user/UsersWsParameters.java

index 56e53fe8bb0b4117268cb4d08518c49802bc83b9..fbc3e97a9d531b23d1d9644524ad33aa260ad7ed 100644 (file)
@@ -129,6 +129,10 @@ public class UserDao implements Dao {
     mapper(session).updateSonarlintLastConnectionDate(login, system2.now());
   }
 
+  public void dismissSonarlintAd(DbSession session, String login) {
+    mapper(session).dismissSonarlintAd(login);
+  }
+
   public void setRoot(DbSession session, String login, boolean root) {
     mapper(session).setRoot(login, root, system2.now());
   }
index 0f76f7216672091f975c6953e96accb348775879..2ff12a2a6724b57d8de25f19b21ba7fc62a9338b 100644 (file)
@@ -86,4 +86,6 @@ public interface UserMapper {
   void clearHomepage(@Param("login") String login, @Param("now") long now);
 
   long countActiveSonarlintUsers(@Param("sinceDate") long sinceDate);
+
+  void dismissSonarlintAd(@Param("login") String login);
 }
index 56fa48283cb601de67edda76806fcdca4d8805c9..6533abbfbf549f96e41b08e33870c17fe4c19c25 100644 (file)
 
     <update id="updateSonarlintLastConnectionDate" parameterType="map">
         update users set
-          last_sonarlint_connection =  #{now, jdbcType=BIGINT}
+        last_sonarlint_connection = #{now, jdbcType=BIGINT}
         where
-          login = #{login, jdbcType=VARCHAR}
+        login = #{login, jdbcType=VARCHAR}
+    </update>
+
+    <update id="dismissSonarlintAd" parameterType="map">
+        update users set
+        sonarlint_ad_seen = true
+        where
+        login = #{login, jdbcType=VARCHAR}
     </update>
 
     <update id="deactivateUser" parameterType="map">
index 596b74f4bc4ac38bfc1d62b10072cb6267b8f9f5..d727f9a3973c6505828ecd928f018c3ed0d50af4 100644 (file)
@@ -97,6 +97,18 @@ public class UserDaoTest {
     assertThat(user).isNull();
   }
 
+  @Test
+  public void dismiss_sonarlint_ad() {
+    UserDto user = db.users().insertUser(u -> u.setLogin("user"));
+    assertThat(user.isSonarlintAdSeen()).isFalse();
+
+    underTest.dismissSonarlintAd(session, "user");
+
+    user = db.users().selectUserByLogin("user").get();
+
+    assertThat(user.isSonarlintAdSeen()).isTrue();
+  }
+
   @Test
   public void selectUsersByLogins() {
     db.users().insertUser(user -> user.setLogin("user1"));
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/DismissSonarlintAdAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/DismissSonarlintAdAction.java
new file mode 100644 (file)
index 0000000..ebf1b34
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.server.user.ws;
+
+import org.sonar.api.server.ws.Request;
+import org.sonar.api.server.ws.Response;
+import org.sonar.api.server.ws.WebService;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.server.user.UserSession;
+
+import static org.sonarqube.ws.client.user.UsersWsParameters.ACTION_DISMISS_SONARLINT_AD;
+
+public class DismissSonarlintAdAction implements UsersWsAction {
+  private final UserSession userSession;
+  private final DbClient dbClient;
+
+  public DismissSonarlintAdAction(UserSession userSession, DbClient dbClient) {
+    this.userSession = userSession;
+    this.dbClient = dbClient;
+  }
+
+  @Override
+  public void define(WebService.NewController controller) {
+    controller.createAction(ACTION_DISMISS_SONARLINT_AD)
+      .setDescription("Dismiss SonarLint advertisement.")
+      .setSince("9.2")
+      .setPost(true)
+      .setHandler(this);
+  }
+
+  @Override
+  public void handle(Request request, Response response) throws Exception {
+    userSession.checkLoggedIn();
+    try (DbSession dbSession = dbClient.openSession(false)) {
+      dbClient.userDao().dismissSonarlintAd(dbSession, userSession.getLogin());
+      dbSession.commit();
+    }
+    response.noContent();
+  }
+}
index c7ecb05366d68ddfb929bbc0c819f085501ccd44..5cc26c19446a1c87116a68b7334cc0a3d9862ff2 100644 (file)
@@ -38,6 +38,7 @@ public class UsersWsModule extends Module {
       UpdateAction.class,
       UpdateLoginAction.class,
       DeactivateAction.class,
+      DismissSonarlintAdAction.class,
       ChangePasswordAction.class,
       CurrentAction.class,
       SearchAction.class,
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/DismissSonarlintAdActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/DismissSonarlintAdActionTest.java
new file mode 100644 (file)
index 0000000..66f9582
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.server.user.ws;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonar.api.server.ws.WebService;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbTester;
+import org.sonar.db.user.UserDto;
+import org.sonar.server.exceptions.UnauthorizedException;
+import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.ws.TestRequest;
+import org.sonar.server.ws.WsActionTester;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.sonarqube.ws.client.user.UsersWsParameters.ACTION_DISMISS_SONARLINT_AD;
+
+public class DismissSonarlintAdActionTest {
+  @Rule
+  public UserSessionRule userSession = UserSessionRule.standalone();
+  @Rule
+  public DbTester db = DbTester.create(System2.INSTANCE);
+
+  private final WsActionTester tester = new WsActionTester(new DismissSonarlintAdAction(userSession, db.getDbClient()));
+
+  @Test
+  public void test_definition() {
+    WebService.Action definition = tester.getDef();
+    assertThat(definition.key()).isEqualTo(ACTION_DISMISS_SONARLINT_AD);
+    assertThat(definition.description()).isEqualTo("Dismiss SonarLint advertisement.");
+    assertThat(definition.since()).isEqualTo("9.2");
+    assertThat(definition.isPost()).isTrue();
+    assertThat(definition.params()).isEmpty();
+    assertThat(definition.changelog()).isEmpty();
+  }
+
+  @Test
+  public void endpoint_throw_exception_if_no_user_login() {
+    final TestRequest request = tester.newRequest();
+    assertThatThrownBy(() -> request.execute())
+      .isInstanceOf(UnauthorizedException.class);
+  }
+
+  @Test
+  public void calling_endpoint_should_set_sonarlint_ad_seen_true() {
+    UserDto user = db.users().insertUser(u -> u
+      .setLogin("obiwan.kenobi")
+      .setName("Obiwan Kenobi")
+      .setEmail(null));
+    userSession.logIn(user);
+    assertThat(user.isSonarlintAdSeen()).isFalse();
+
+    tester.newRequest().execute();
+    UserDto updatedUser = db.users().selectUserByLogin(user.getLogin()).get();
+    assertThat(updatedUser.isSonarlintAdSeen()).isTrue();
+  }
+}
\ No newline at end of file
index 9e961b12313355c3019b2abaf02e3403979764c6..0ad143c412590d10d7e2f9ce371256c4ae95a117 100644 (file)
@@ -34,7 +34,7 @@ public class UsersWsModuleTest {
   public void verify_count_of_added_components() {
     ComponentContainer container = new ComponentContainer();
     new UsersWsModule(new ConfigurationBridge(settings)).configure(container);
-    assertThat(container.size()).isEqualTo(2 + 15);
+    assertThat(container.size()).isEqualTo(2 + 16);
   }
 
   @Test
@@ -43,6 +43,6 @@ public class UsersWsModuleTest {
 
     ComponentContainer container = new ComponentContainer();
     new UsersWsModule(new ConfigurationBridge(settings)).configure(container);
-    assertThat(container.size()).isEqualTo(2 + 16);
+    assertThat(container.size()).isEqualTo(2 + 17);
   }
 }
index 08531d55e96086c2d75ed4416af7d481e284cc3e..798f5139b5d0ddf7e724a3c716488878a9a85e73 100644 (file)
@@ -30,6 +30,7 @@ public class UsersWsParameters {
   public static final String ACTION_SKIP_ONBOARDING_TUTORIAL = "skip_onboarding_tutorial";
   public static final String ACTION_CURRENT = "current";
   public static final String ACTION_UPDATE_IDENTITY_PROVIDER = "update_identity_provider";
+  public static final String ACTION_DISMISS_SONARLINT_AD = "dismiss_sonarlint_ad";
 
   public static final String PARAM_LOGIN = "login";
   public static final String PARAM_PASSWORD = "password";