aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>2018-02-15 14:54:15 +0100
committerGuillaume Jambet <guillaume.jambet@gmail.com>2018-03-01 15:21:05 +0100
commitd535686f89484af334723467ed820a685fba4fb0 (patch)
tree2b9d975c896e40c5710b1205f2ebaf7fba45403e /server
parent3ae18356c3fcafeb7b5348c8916098156cd0a824 (diff)
downloadsonarqube-d535686f89484af334723467ed820a685fba4fb0.tar.gz
sonarqube-d535686f89484af334723467ed820a685fba4fb0.zip
SONAR-10347 Add pagination to webhook deliveries search ws.
Diffstat (limited to 'server')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryDao.java25
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryMapper.java13
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/webhook/WebhookDeliveryMapper.xml21
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDeliveryDaoTest.java86
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookTesting.java5
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java71
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/webhook/ws/example-delivery.json32
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java2
8 files changed, 198 insertions, 57 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryDao.java
index 2060cad60f7..e8e63d856af 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryDao.java
@@ -21,6 +21,7 @@ package org.sonar.db.webhook;
import java.util.List;
import java.util.Optional;
+import org.apache.ibatis.session.RowBounds;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
@@ -30,25 +31,37 @@ public class WebhookDeliveryDao implements Dao {
return Optional.ofNullable(mapper(dbSession).selectByUuid(uuid));
}
+ public int countDeliveriesByWebhookUuid(DbSession dbSession, String webhookUuid) {
+ return mapper(dbSession).countByWebhookUuid(webhookUuid);
+ }
+
/**
* All the deliveries for the specified webhook. Results are ordered by descending date.
*/
- public List<WebhookDeliveryLiteDto> selectByWebhookUuid(DbSession dbSession, String webhookUuid) {
- return mapper(dbSession).selectByWebhookUuid(webhookUuid);
+ public List<WebhookDeliveryLiteDto> selectByWebhookUuid(DbSession dbSession, String webhookUuid, int offset, int limit) {
+ return mapper(dbSession).selectByWebhookUuid(webhookUuid, new RowBounds(offset, limit));
+ }
+
+ public int countDeliveriesByComponentUuid(DbSession dbSession, String componentUuid) {
+ return mapper(dbSession).countByComponentUuid(componentUuid);
}
/**
* All the deliveries for the specified component. Results are ordered by descending date.
*/
- public List<WebhookDeliveryLiteDto> selectOrderedByComponentUuid(DbSession dbSession, String componentUuid) {
- return mapper(dbSession).selectOrderedByComponentUuid(componentUuid);
+ public List<WebhookDeliveryLiteDto> selectOrderedByComponentUuid(DbSession dbSession, String componentUuid, int offset, int limit) {
+ return mapper(dbSession).selectOrderedByComponentUuid(componentUuid, new RowBounds(offset, limit));
+ }
+
+ public int countDeliveriesByCeTaskUuid(DbSession dbSession, String ceTaskId) {
+ return mapper(dbSession).countByCeTaskUuid(ceTaskId);
}
/**
* All the deliveries for the specified CE task. Results are ordered by descending date.
*/
- public List<WebhookDeliveryLiteDto> selectOrderedByCeTaskUuid(DbSession dbSession, String ceTaskUuid) {
- return mapper(dbSession).selectOrderedByCeTaskUuid(ceTaskUuid);
+ public List<WebhookDeliveryLiteDto> selectOrderedByCeTaskUuid(DbSession dbSession, String ceTaskUuid, int offset, int limit) {
+ return mapper(dbSession).selectOrderedByCeTaskUuid(ceTaskUuid, new RowBounds(offset, limit));
}
public void insert(DbSession dbSession, WebhookDeliveryDto dto) {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryMapper.java
index f14eb163d1e..6436922de6c 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryMapper.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDeliveryMapper.java
@@ -22,17 +22,24 @@ package org.sonar.db.webhook;
import java.util.List;
import javax.annotation.CheckForNull;
import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
public interface WebhookDeliveryMapper {
@CheckForNull
WebhookDeliveryDto selectByUuid(@Param("uuid") String uuid);
- List<WebhookDeliveryLiteDto> selectByWebhookUuid(@Param("webhookUuid") String webhookUuid);
+ int countByWebhookUuid(@Param("webhookUuid") String webhookUuid);
- List<WebhookDeliveryLiteDto> selectOrderedByComponentUuid(@Param("componentUuid") String componentUuid);
+ List<WebhookDeliveryLiteDto> selectByWebhookUuid(@Param("webhookUuid") String webhookUuid, RowBounds rowBounds);
- List<WebhookDeliveryLiteDto> selectOrderedByCeTaskUuid(@Param("ceTaskUuid") String ceTaskUuid);
+ int countByComponentUuid(@Param("componentUuid") String componentUuid);
+
+ List<WebhookDeliveryLiteDto> selectOrderedByComponentUuid(@Param("componentUuid") String componentUuid, RowBounds rowBounds);
+
+ int countByCeTaskUuid(@Param("ceTaskUuid") String ceTaskId);
+
+ List<WebhookDeliveryLiteDto> selectOrderedByCeTaskUuid(@Param("ceTaskUuid") String ceTaskUuid, RowBounds rowBounds);
void insert(WebhookDeliveryDto dto);
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/webhook/WebhookDeliveryMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/webhook/WebhookDeliveryMapper.xml
index 0612c971293..1321fe21148 100644
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/webhook/WebhookDeliveryMapper.xml
+++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/webhook/WebhookDeliveryMapper.xml
@@ -26,6 +26,13 @@
where uuid = #{uuid,jdbcType=VARCHAR}
</select>
+ <select id="countByWebhookUuid" parameterType="String" resultType="int">
+ select
+ count(1)
+ from webhook_deliveries
+ where webhook_uuid = #{webhookUuid,jdbcType=VARCHAR}
+ </select>
+
<select id="selectByWebhookUuid" parameterType="String" resultType="org.sonar.db.webhook.WebhookDeliveryLiteDto">
select <include refid="sqlLiteColumns" />
from webhook_deliveries
@@ -33,6 +40,13 @@
order by created_at desc
</select>
+ <select id="countByComponentUuid" parameterType="String" resultType="int">
+ select
+ count(1)
+ from webhook_deliveries
+ where component_uuid = #{componentUuid,jdbcType=VARCHAR}
+ </select>
+
<select id="selectOrderedByComponentUuid" parameterType="String" resultType="org.sonar.db.webhook.WebhookDeliveryLiteDto">
select <include refid="sqlLiteColumns" />
from webhook_deliveries
@@ -47,6 +61,13 @@
order by created_at desc
</select>
+ <select id="countByCeTaskUuid" parameterType="String" resultType="int">
+ select
+ count(1)
+ from webhook_deliveries
+ where ce_task_uuid = #{ceTaskUuid,jdbcType=VARCHAR}
+ </select>
+
<insert id="insert" parameterType="org.sonar.db.webhook.WebhookDeliveryDto" useGeneratedKeys="false">
insert into webhook_deliveries (
uuid,
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDeliveryDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDeliveryDaoTest.java
index 025f04b196f..5b547035876 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDeliveryDaoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDeliveryDaoTest.java
@@ -46,6 +46,8 @@ public class WebhookDeliveryDaoTest {
private final DbClient dbClient = dbTester.getDbClient();
private final DbSession dbSession = dbTester.getSession();
+ private final WebhookDbTester dbWebhooks = dbTester.webhooks();
+
private final WebhookDeliveryDao underTest = dbClient.webhookDeliveryDao();
@Test
@@ -55,53 +57,97 @@ public class WebhookDeliveryDaoTest {
@Test
public void selectOrderedByComponentUuid_returns_empty_if_no_records() {
- underTest.insert(dbSession, newDto("D1", "COMPONENT_1", "TASK_1"));
+ underTest.insert(dbSession, newDto("D1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1"));
- List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByComponentUuid(dbSession, "ANOTHER_COMPONENT");
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByComponentUuid(dbSession, "ANOTHER_COMPONENT", 0, 10);
assertThat(deliveries).isEmpty();
}
@Test
public void selectOrderedByComponentUuid_returns_records_ordered_by_date() {
- WebhookDeliveryDto dto1 = newDto("D1", "COMPONENT_1", "TASK_1").setCreatedAt(BEFORE);
- WebhookDeliveryDto dto2 = newDto("D2", "COMPONENT_1", "TASK_1").setCreatedAt(NOW);
- WebhookDeliveryDto dto3 = newDto("D3", "COMPONENT_2", "TASK_1").setCreatedAt(NOW);
+ WebhookDeliveryDto dto1 = newDto("D1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1").setCreatedAt(BEFORE);
+ WebhookDeliveryDto dto2 = newDto("D2", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1").setCreatedAt(NOW);
+ WebhookDeliveryDto dto3 = newDto("D3", "WEBHOOK_UUID_1", "COMPONENT_2", "TASK_1").setCreatedAt(NOW);
underTest.insert(dbSession, dto3);
underTest.insert(dbSession, dto2);
underTest.insert(dbSession, dto1);
- List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByComponentUuid(dbSession, "COMPONENT_1");
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByComponentUuid(dbSession, "COMPONENT_1", 0, 10);
assertThat(deliveries).extracting(WebhookDeliveryLiteDto::getUuid).containsExactly("D2", "D1");
}
@Test
public void selectOrderedByCeTaskUuid_returns_empty_if_no_records() {
- underTest.insert(dbSession, newDto("D1", "COMPONENT_1", "TASK_1"));
+ underTest.insert(dbSession, newDto("D1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1"));
- List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByCeTaskUuid(dbSession, "ANOTHER_TASK");
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByCeTaskUuid(dbSession, "ANOTHER_TASK", 0, 10);
assertThat(deliveries).isEmpty();
}
@Test
public void selectOrderedByCeTaskUuid_returns_records_ordered_by_date() {
- WebhookDeliveryDto dto1 = newDto("D1", "COMPONENT_1", "TASK_1").setCreatedAt(BEFORE);
- WebhookDeliveryDto dto2 = newDto("D2", "COMPONENT_1", "TASK_1").setCreatedAt(NOW);
- WebhookDeliveryDto dto3 = newDto("D3", "COMPONENT_2", "TASK_2").setCreatedAt(NOW);
+ WebhookDeliveryDto dto1 = newDto("D1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1").setCreatedAt(BEFORE);
+ WebhookDeliveryDto dto2 = newDto("D2", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1").setCreatedAt(NOW);
+ WebhookDeliveryDto dto3 = newDto("D3", "WEBHOOK_UUID_1", "COMPONENT_2", "TASK_2").setCreatedAt(NOW);
+ underTest.insert(dbSession, dto3);
+ underTest.insert(dbSession, dto2);
+ underTest.insert(dbSession, dto1);
+
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByCeTaskUuid(dbSession, "TASK_1", 0, 10);
+
+ assertThat(deliveries).extracting(WebhookDeliveryLiteDto::getUuid).containsExactly("D2", "D1");
+ }
+
+ @Test
+ public void selectByWebhookUuid_returns_empty_if_no_records() {
+
+ underTest.insert(dbSession, newDto("D1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1"));
+
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectByWebhookUuid(dbSession, "a-webhook-uuid", 0, 10);
+
+ assertThat(deliveries).isEmpty();
+ }
+
+ @Test
+ public void selectByWebhookUuid_returns_records_ordered_by_date() {
+ WebhookDto webhookDto = dbWebhooks.insert(WebhookTesting.newProjectWebhook("COMPONENT_1"));
+ WebhookDeliveryDto dto1 = newDto("D1", webhookDto.getUuid(), "COMPONENT_1", "TASK_1").setCreatedAt(BEFORE);
+ WebhookDeliveryDto dto2 = newDto("D2", webhookDto.getUuid(), "COMPONENT_1", "TASK_2").setCreatedAt(NOW);
+ WebhookDeliveryDto dto3 = newDto("D3", "fake-webhook-uuid", "COMPONENT_2", "TASK_1").setCreatedAt(NOW);
underTest.insert(dbSession, dto3);
underTest.insert(dbSession, dto2);
underTest.insert(dbSession, dto1);
- List<WebhookDeliveryLiteDto> deliveries = underTest.selectOrderedByCeTaskUuid(dbSession, "TASK_1");
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectByWebhookUuid(dbSession, webhookDto.getUuid(), 0, 10);
assertThat(deliveries).extracting(WebhookDeliveryLiteDto::getUuid).containsExactly("D2", "D1");
}
@Test
+ public void selectByWebhookUuid_returns_records_according_to_pagination() {
+ WebhookDto webhookDto = dbWebhooks.insert(WebhookTesting.newProjectWebhook("COMPONENT_1"));
+ WebhookDeliveryDto dto1 = newDto("D1", webhookDto.getUuid(), "COMPONENT_1", "TASK_1").setCreatedAt(BEFORE);
+ underTest.insert(dbSession, dto1);
+ WebhookDeliveryDto dto2 = newDto("D2", webhookDto.getUuid(), "COMPONENT_1", "TASK_2").setCreatedAt(NOW);
+ underTest.insert(dbSession, dto2);
+ underTest.insert(dbSession, newDto("D3", webhookDto.getUuid(), "COMPONENT_1", "TASK_2").setCreatedAt(NOW));
+ underTest.insert(dbSession, newDto("D4", webhookDto.getUuid(), "COMPONENT_1", "TASK_2").setCreatedAt(NOW));
+ underTest.insert(dbSession, newDto("D5", webhookDto.getUuid(), "COMPONENT_1", "TASK_2").setCreatedAt(NOW));
+ underTest.insert(dbSession, newDto("D6", webhookDto.getUuid(), "COMPONENT_1", "TASK_2").setCreatedAt(NOW));
+
+ List<WebhookDeliveryLiteDto> deliveries = underTest.selectByWebhookUuid(dbSession, webhookDto.getUuid(), 1, 3);
+
+ assertThat(deliveries).extracting(WebhookDeliveryLiteDto::getUuid).containsExactlyInAnyOrder("D3", "D4", "D5");
+ }
+
+
+
+ @Test
public void insert_row_with_only_mandatory_columns() {
- WebhookDeliveryDto dto = newDto("DELIVERY_1", "COMPONENT_1", "TASK_1")
+ WebhookDeliveryDto dto = newDto("DELIVERY_1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1")
.setHttpStatus(null)
.setDurationMs(null)
.setErrorStacktrace(null);
@@ -119,12 +165,13 @@ public class WebhookDeliveryDaoTest {
@Test
public void insert_row_with_all_columns() {
- WebhookDeliveryDto dto = newDto("DELIVERY_1", "COMPONENT_1", "TASK_1");
+ WebhookDeliveryDto dto = newDto("DELIVERY_1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1");
underTest.insert(dbSession, dto);
WebhookDeliveryDto stored = selectByUuid(dto.getUuid());
verifyMandatoryFields(dto, stored);
+ assertThat(stored.getWebhookUuid()).isEqualTo(dto.getWebhookUuid());
assertThat(stored.getHttpStatus()).isEqualTo(dto.getHttpStatus());
assertThat(stored.getDurationMs()).isEqualTo(dto.getDurationMs());
assertThat(stored.getErrorStacktrace()).isEqualTo(dto.getErrorStacktrace());
@@ -132,9 +179,9 @@ public class WebhookDeliveryDaoTest {
@Test
public void deleteComponentBeforeDate_deletes_rows_before_date() {
- underTest.insert(dbSession, newDto("DELIVERY_1", "COMPONENT_1", "TASK_1").setCreatedAt(1_000_000L));
- underTest.insert(dbSession, newDto("DELIVERY_2", "COMPONENT_1", "TASK_2").setCreatedAt(2_000_000L));
- underTest.insert(dbSession, newDto("DELIVERY_3", "COMPONENT_2", "TASK_3").setCreatedAt(1_000_000L));
+ underTest.insert(dbSession, newDto("DELIVERY_1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1").setCreatedAt(1_000_000L));
+ underTest.insert(dbSession, newDto("DELIVERY_2", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_2").setCreatedAt(2_000_000L));
+ underTest.insert(dbSession, newDto("DELIVERY_3", "WEBHOOK_UUID_1", "COMPONENT_2", "TASK_3").setCreatedAt(1_000_000L));
// should delete the old delivery on COMPONENT_1 and keep the one of COMPONENT_2
underTest.deleteComponentBeforeDate(dbSession, "COMPONENT_1", 1_500_000L);
@@ -152,7 +199,7 @@ public class WebhookDeliveryDaoTest {
@Test
public void deleteComponentBeforeDate_does_nothing_on_invalid_uuid() {
- underTest.insert(dbSession, newDto("DELIVERY_1", "COMPONENT_1", "TASK_1").setCreatedAt(1_000_000L));
+ underTest.insert(dbSession, newDto("DELIVERY_1", "WEBHOOK_UUID_1", "COMPONENT_1", "TASK_1").setCreatedAt(1_000_000L));
underTest.deleteComponentBeforeDate(dbSession, "COMPONENT_2", 1_500_000L);
@@ -174,9 +221,10 @@ public class WebhookDeliveryDaoTest {
* Build a {@link WebhookDeliveryDto} with all mandatory fields.
* Optional fields are kept null.
*/
- private static WebhookDeliveryDto newDto(String uuid, String componentUuid, String ceTaskUuid) {
+ private static WebhookDeliveryDto newDto(String uuid, String webhookUuid, String componentUuid, String ceTaskUuid) {
return newWebhookDeliveryDto()
.setUuid(uuid)
+ .setWebhookUuid(webhookUuid)
.setComponentUuid(componentUuid)
.setCeTaskUuid(ceTaskUuid);
}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookTesting.java b/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookTesting.java
index 0c56b9ae85e..4568a137869 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookTesting.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookTesting.java
@@ -36,6 +36,11 @@ public class WebhookTesting {
.setProjectUuid(project.uuid());
}
+ public static WebhookDto newProjectWebhook(String projectUuid) {
+ return getWebhookDto()
+ .setProjectUuid(projectUuid);
+ }
+
public static WebhookDto newWebhook(OrganizationDto organizationDto) {
return getWebhookDto()
.setOrganizationUuid(organizationDto.getUuid());
diff --git a/server/sonar-server/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java b/server/sonar-server/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java
index 685d384a9f9..ee5e469f57a 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java
@@ -34,12 +34,16 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.webhook.WebhookDeliveryLiteDto;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.user.UserSession;
+import org.sonarqube.ws.Common;
import org.sonarqube.ws.Webhooks;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
import static org.apache.commons.lang.StringUtils.isNotBlank;
+import static org.sonar.api.server.ws.WebService.Param.PAGE;
+import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_02;
+import static org.sonar.server.es.SearchOptions.MAX_LIMIT;
import static org.sonar.server.webhook.ws.WebhookWsSupport.copyDtoToProtobuf;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
@@ -79,9 +83,11 @@ public class WebhookDeliveriesAction implements WebhooksWsAction {
action.createParam(PARAM_WEBHOOK)
.setSince("7.1")
- .setDescription("Key of the webhook that triggered those deliveries,"+
+ .setDescription("Key of the webhook that triggered those deliveries," +
"auto-generated value that can be obtained through api/webhooks/create or api/webhooks/list")
.setExampleValue(UUID_EXAMPLE_02);
+
+ action.addPagingParamsSince(10, MAX_LIMIT, "7.1");
}
@Override
@@ -92,42 +98,60 @@ public class WebhookDeliveriesAction implements WebhooksWsAction {
String ceTaskId = request.param(PARAM_TASK);
String componentKey = request.param(PARAM_COMPONENT);
String webhookUuid = request.param(PARAM_WEBHOOK);
+ int page = request.mandatoryParamAsInt(PAGE);
+ int pageSize = request.mandatoryParamAsInt(PAGE_SIZE);
checkArgument(webhookUuid != null ^ (ceTaskId != null ^ componentKey != null),
"Either '%s' or '%s' or '%s' must be provided", PARAM_TASK, PARAM_COMPONENT, PARAM_WEBHOOK);
- Data data = loadFromDatabase(webhookUuid, ceTaskId, componentKey);
+ Data data = loadFromDatabase(webhookUuid, ceTaskId, componentKey, page, pageSize);
data.ensureAdminPermission(userSession);
data.writeTo(request, response);
}
- private Data loadFromDatabase(@Nullable String webhookUuid, @Nullable String ceTaskId, @Nullable String componentKey) {
- ComponentDto component = null;
+ private Data loadFromDatabase(@Nullable String webhookUuid, @Nullable String ceTaskId, @Nullable String componentKey, int page, int pageSize) {
+ ComponentDto component;
List<WebhookDeliveryLiteDto> deliveries;
+ int totalElements;
try (DbSession dbSession = dbClient.openSession(false)) {
if (isNotBlank(webhookUuid)) {
- deliveries = dbClient.webhookDeliveryDao().selectByWebhookUuid(dbSession, webhookUuid);
+ deliveries = dbClient.webhookDeliveryDao().selectByWebhookUuid(dbSession, webhookUuid, page - 1, pageSize);
+ component = getComponentDto(dbSession, deliveries);
+ totalElements = dbClient.webhookDeliveryDao().countDeliveriesByWebhookUuid(dbSession, webhookUuid);
} else if (componentKey != null) {
component = componentFinder.getByKey(dbSession, componentKey);
- deliveries = dbClient.webhookDeliveryDao().selectOrderedByComponentUuid(dbSession, component.uuid());
+ deliveries = dbClient.webhookDeliveryDao().selectOrderedByComponentUuid(dbSession, component.uuid(), page - 1, pageSize);
+ totalElements = dbClient.webhookDeliveryDao().countDeliveriesByComponentUuid(dbSession, component.uuid());
} else {
- deliveries = dbClient.webhookDeliveryDao().selectOrderedByCeTaskUuid(dbSession, ceTaskId);
- Optional<String> deliveredComponentUuid = deliveries
- .stream()
- .map(WebhookDeliveryLiteDto::getComponentUuid)
- .findFirst();
- if (deliveredComponentUuid.isPresent()) {
- component = componentFinder.getByUuid(dbSession, deliveredComponentUuid.get());
- }
+ deliveries = dbClient.webhookDeliveryDao().selectOrderedByCeTaskUuid(dbSession, ceTaskId, page - 1, pageSize);
+ component = getComponentDto(dbSession, deliveries);
+ totalElements = dbClient.webhookDeliveryDao().countDeliveriesByCeTaskUuid(dbSession, ceTaskId);
}
}
- return new Data(component, deliveries);
+ return new Data(component, deliveries).withPagingInfo(page, pageSize, totalElements);
+ }
+
+ private ComponentDto getComponentDto(DbSession dbSession, List<WebhookDeliveryLiteDto> deliveries) {
+ Optional<String> deliveredComponentUuid = deliveries
+ .stream()
+ .map(WebhookDeliveryLiteDto::getComponentUuid)
+ .findFirst();
+
+ if (deliveredComponentUuid.isPresent()) {
+ return componentFinder.getByUuid(dbSession, deliveredComponentUuid.get());
+ } else {
+ return null;
+ }
}
private static class Data {
private final ComponentDto component;
private final List<WebhookDeliveryLiteDto> deliveryDtos;
+ private int pageIndex;
+ private int pageSize;
+ private int totalElements;
+
Data(@Nullable ComponentDto component, List<WebhookDeliveryLiteDto> deliveries) {
this.deliveryDtos = deliveries;
if (deliveries.isEmpty()) {
@@ -150,7 +174,24 @@ public class WebhookDeliveriesAction implements WebhooksWsAction {
copyDtoToProtobuf(component, dto, deliveryBuilder);
responseBuilder.addDeliveries(deliveryBuilder);
}
+
+ responseBuilder.setPaging(buildPaging(pageIndex, pageSize, totalElements));
writeProtobuf(responseBuilder.build(), request, response);
}
+
+ static Common.Paging buildPaging(int pageIndex, int pageSize, int totalElements) {
+ return Common.Paging.newBuilder()
+ .setPageIndex(pageIndex)
+ .setPageSize(pageSize)
+ .setTotal(totalElements)
+ .build();
+ }
+
+ public Data withPagingInfo(int pageIndex, int pageSize, int totalElements) {
+ this.pageIndex = pageIndex;
+ this.pageSize = pageSize;
+ this.totalElements = totalElements;
+ return this;
+ }
}
}
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/webhook/ws/example-delivery.json b/server/sonar-server/src/main/resources/org/sonar/server/webhook/ws/example-delivery.json
index d4da8033df5..d95c99d3ba3 100644
--- a/server/sonar-server/src/main/resources/org/sonar/server/webhook/ws/example-delivery.json
+++ b/server/sonar-server/src/main/resources/org/sonar/server/webhook/ws/example-delivery.json
@@ -1,14 +1,20 @@
{
- "delivery": {
- "id": "d1",
- "componentKey": "my-project",
- "ceTaskId": "task-1",
- "name": "Jenkins",
- "url": "http://jenkins",
- "at": "2017-07-14T04:40:00+0200",
- "success": true,
- "httpStatus": 200,
- "durationMs": 10,
- "payload": "{\"status\"=\"SUCCESS\"}"
- }
-}
+ "paging": {
+ "pageIndex": 1,
+ "pageSize": 10,
+ "total": 1
+ },
+ "deliveries": [
+ {
+ "id": "d1",
+ "componentKey": "my-project",
+ "ceTaskId": "task-1",
+ "name": "Jenkins",
+ "url": "http://jenkins",
+ "at": "2017-07-14T04:40:00+0200",
+ "success": true,
+ "httpStatus": 200,
+ "durationMs": 10
+ }
+ ]
+} \ No newline at end of file
diff --git a/server/sonar-server/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java
index e8b9c9c9ca8..6d3d3327dff 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java
@@ -68,7 +68,7 @@ public class WebhookDeliveriesActionTest {
@Test
public void test_definition() {
- assertThat(ws.getDef().params()).extracting(WebService.Param::key).containsExactlyInAnyOrder("componentKey", "ceTaskId", "webhook");
+ assertThat(ws.getDef().params()).extracting(WebService.Param::key).containsExactlyInAnyOrder("componentKey", "ceTaskId", "webhook", "p", "ps");
assertThat(ws.getDef().isPost()).isFalse();
assertThat(ws.getDef().isInternal()).isFalse();
assertThat(ws.getDef().responseExampleAsString()).isNotEmpty();