From 52b24b06255c984d5a9638c4e30f16a440dc9217 Mon Sep 17 00:00:00 2001 From: Belen Pruvost Date: Fri, 22 Apr 2022 09:32:10 +0200 Subject: [PATCH] SONAR-16264 - Search Tokens endpoint update --- .../java/org/sonar/db/user/UserTokenDto.java | 12 ++++++++++++ .../org/sonar/db/user/UserTokenMapper.xml | 6 +++++- .../java/org/sonar/db/user/UserTokenDaoTest.java | 4 +++- .../java/org/sonar/db/user/UserDbTester.java | 11 +++++++++++ .../java/org/sonar/db/user/UserTokenTesting.java | 1 + .../sonar/server/usertoken/ws/SearchAction.java | 16 ++++++++++++++-- .../server/usertoken/ws/search-example.json | 13 ++++++++++--- .../server/usertoken/ws/SearchActionTest.java | 11 +++++++++-- sonar-ws/src/main/protobuf/ws-user_tokens.proto | 7 +++++++ 9 files changed, 72 insertions(+), 9 deletions(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserTokenDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserTokenDto.java index 916255e7a61..c3630bbc7ea 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserTokenDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserTokenDto.java @@ -43,6 +43,8 @@ public class UserTokenDto { private String type; + private String projectName; + public String getUuid() { return uuid; } @@ -114,4 +116,14 @@ public class UserTokenDto { this.type = type; return this; } + + @CheckForNull + public String getProjectName() { + return projectName; + } + + public UserTokenDto setProjectName(@Nullable String projectName) { + this.projectName = projectName; + return this; + } } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserTokenMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserTokenMapper.xml index d56b2e9e62c..3977a794045 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserTokenMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/user/UserTokenMapper.xml @@ -11,7 +11,8 @@ t.last_connection_date as "lastConnectionDate", t.created_at as "createdAt", t.project_key as "projectKey", - t.type as "type" + t.type as "type", + p.name as "projectName" @@ -46,6 +47,7 @@ SELECT FROM user_tokens t + LEFT JOIN projects p on t.project_key = p.kee WHERE t.token_hash=#{tokenHash, jdbcType=VARCHAR} @@ -53,6 +55,7 @@ SELECT FROM user_tokens t + LEFT JOIN projects p on t.project_key = p.kee WHERE t.user_uuid=#{userUuid, jdbcType=VARCHAR} and t.name=#{name, jdbcType=VARCHAR} @@ -60,6 +63,7 @@ SELECT FROM user_tokens t + LEFT JOIN projects p on t.project_key = p.kee WHERE t.user_uuid=#{userUuid, jdbcType=VARCHAR} diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserTokenDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserTokenDaoTest.java index ac3f92b7655..2568efd1b22 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserTokenDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserTokenDaoTest.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.sonar.api.utils.System2; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.component.ComponentDto; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; @@ -58,7 +59,7 @@ public class UserTokenDaoTest { @Test public void insert_project_analysis_token() { UserTokenDto projectAnalysisToken = newProjectAnalysisToken(); - + ComponentDto project = db.components().insertPublicProject(p -> p.setDbKey(projectAnalysisToken.getProjectKey())); underTest.insert(db.getSession(), projectAnalysisToken, "login"); UserTokenDto projectAnalysisTokenFromDb = underTest.selectByTokenHash(db.getSession(), projectAnalysisToken.getTokenHash()); @@ -70,6 +71,7 @@ public class UserTokenDaoTest { assertThat(projectAnalysisTokenFromDb.getUserUuid()).isEqualTo(projectAnalysisToken.getUserUuid()); assertThat(projectAnalysisTokenFromDb.getProjectKey()).isEqualTo(projectAnalysisToken.getProjectKey()); assertThat(projectAnalysisTokenFromDb.getType()).isEqualTo(projectAnalysisToken.getType()); + assertThat(projectAnalysisTokenFromDb.getProjectName()).isEqualTo(project.name()); } @Test diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java index 5078c9d1b39..c942060e71c 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java @@ -335,6 +335,17 @@ public class UserDbTester { return dto; } + // PROJECT ANALYSIS TOKEN + + @SafeVarargs + public final UserTokenDto insertProjectAnalysisToken(UserDto user, Consumer... populators) { + UserTokenDto dto = UserTokenTesting.newProjectAnalysisToken().setUserUuid(user.getUuid()); + stream(populators).forEach(p -> p.accept(dto)); + db.getDbClient().userTokenDao().insert(db.getSession(), dto, user.getLogin()); + db.commit(); + return dto; + } + // SESSION TOKENS @SafeVarargs diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserTokenTesting.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserTokenTesting.java index 7d3fa6725ae..68c93488a2a 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserTokenTesting.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserTokenTesting.java @@ -43,6 +43,7 @@ public class UserTokenTesting { .setName("name_" + randomAlphanumeric(20)) .setTokenHash("hash_" + randomAlphanumeric(30)) .setProjectKey("projectUuid_" + randomAlphanumeric(40)) + .setProjectName("Project " + randomAlphanumeric(40)) .setCreatedAt(nextLong()) .setType("PROJECT_ANALYSIS_TOKEN"); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/SearchAction.java index a74db1bfa7e..0a04977cc9f 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/SearchAction.java @@ -29,12 +29,16 @@ import org.sonar.db.DbSession; import org.sonar.db.user.UserDto; import org.sonar.db.user.UserTokenDto; import org.sonarqube.ws.UserTokens.SearchWsResponse; +import org.sonarqube.ws.UserTokens.SearchWsResponse.UserToken; import static java.util.Optional.ofNullable; +import static org.elasticsearch.common.Strings.isNullOrEmpty; import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.server.usertoken.ws.UserTokenSupport.ACTION_SEARCH; import static org.sonar.server.usertoken.ws.UserTokenSupport.PARAM_LOGIN; import static org.sonar.server.ws.WsUtils.writeProtobuf; +import static org.sonarqube.ws.UserTokens.SearchWsResponse.UserToken.Project; +import static org.sonarqube.ws.UserTokens.SearchWsResponse.UserToken.newBuilder; public class SearchAction implements UserTokensWsAction { @@ -80,14 +84,22 @@ public class SearchAction implements UserTokensWsAction { private static SearchWsResponse buildResponse(UserDto user, List userTokensDto) { SearchWsResponse.Builder searchWsResponse = SearchWsResponse.newBuilder(); - SearchWsResponse.UserToken.Builder userTokenBuilder = SearchWsResponse.UserToken.newBuilder(); + UserToken.Builder userTokenBuilder = newBuilder(); searchWsResponse.setLogin(user.getLogin()); for (UserTokenDto userTokenDto : userTokensDto) { userTokenBuilder .clear() .setName(userTokenDto.getName()) - .setCreatedAt(formatDateTime(userTokenDto.getCreatedAt())); + .setCreatedAt(formatDateTime(userTokenDto.getCreatedAt())) + .setType(userTokenDto.getType()); ofNullable(userTokenDto.getLastConnectionDate()).ifPresent(date -> userTokenBuilder.setLastConnectionDate(formatDateTime(date))); + + if (!isNullOrEmpty(userTokenDto.getProjectKey()) && !isNullOrEmpty(userTokenDto.getProjectName())) { + Project.Builder projectBuilder = newBuilder().getProjectBuilder() + .setKey(userTokenDto.getProjectKey()) + .setName(userTokenDto.getProjectName()); + userTokenBuilder.setProject(projectBuilder.build()); + } searchWsResponse.addUserTokens(userTokenBuilder); } diff --git a/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/usertoken/ws/search-example.json b/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/usertoken/ws/search-example.json index b19fd6032ba..34f35268527 100644 --- a/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/usertoken/ws/search-example.json +++ b/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/usertoken/ws/search-example.json @@ -3,15 +3,22 @@ "userTokens": [ { "name": "Project scan on AppVeyor", - "createdAt": "2015-08-02T15:44:27+0200" + "createdAt": "2015-08-02T15:44:27+0200", + "type": "USER_TOKEN" }, { "name": "Project scan on Jenkins", - "createdAt": "2015-04-08T21:57:47+0200" + "createdAt": "2015-04-08T21:57:47+0200", + "type": "PROJECT_ANALYSIS_TOKEN", + "project": { + "key": "project-1", + "name": "Project 1" + } }, { "name": "Project scan on Travis", - "createdAt": "2015-11-26T08:31:07+0100" + "createdAt": "2015-11-26T08:31:07+0100", + "type": "USER_TOKEN" } ] } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/SearchActionTest.java index 87ff45df420..1b165a2367c 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/SearchActionTest.java @@ -26,6 +26,7 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.db.DbClient; import org.sonar.db.DbTester; +import org.sonar.db.component.ComponentDto; import org.sonar.db.user.UserDto; import org.sonar.db.user.UserTokenDto; import org.sonar.server.exceptions.ForbiddenException; @@ -67,12 +68,18 @@ public class SearchActionTest { @Test public void search_json_example() { + ComponentDto project1 = db.components().insertPublicProject(p -> p.setDbKey("project-1").setName("Project 1")); UserDto user1 = db.users().insertUser(u -> u.setLogin("grace.hopper")); UserDto user2 = db.users().insertUser(u -> u.setLogin("ada.lovelace")); db.users().insertToken(user1, t -> t.setName("Project scan on Travis").setCreatedAt(1448523067221L)); db.users().insertToken(user1, t -> t.setName("Project scan on AppVeyor").setCreatedAt(1438523067221L)); - db.users().insertToken(user1, t -> t.setName("Project scan on Jenkins").setCreatedAt(1428523067221L)); - db.users().insertToken(user2, t -> t.setName("Project scan on Travis").setCreatedAt(141456787123L)); + db.users().insertProjectAnalysisToken(user1, t -> t.setName("Project scan on Jenkins") + .setCreatedAt(1428523067221L) + .setProjectKey(project1.getKey())); + db.users().insertProjectAnalysisToken(user2, t -> t.setName("Project scan on Travis") + .setCreatedAt(141456787123L) + .setProjectKey(project1.getKey())); + logInAsSystemAdministrator(); String response = ws.newRequest() diff --git a/sonar-ws/src/main/protobuf/ws-user_tokens.proto b/sonar-ws/src/main/protobuf/ws-user_tokens.proto index ead834a91d7..983659285f6 100644 --- a/sonar-ws/src/main/protobuf/ws-user_tokens.proto +++ b/sonar-ws/src/main/protobuf/ws-user_tokens.proto @@ -43,5 +43,12 @@ message SearchWsResponse { optional string name = 1; optional string createdAt = 2; optional string lastConnectionDate = 3; + optional string type = 4; + optional Project project = 5; + + message Project { + optional string key = 1; + optional string name = 2; + } } } -- 2.39.5