From f8f79ebb2dca328104e82edad4c66da545d33b77 Mon Sep 17 00:00:00 2001 From: Parth Panchal <83201188+parthp2107@users.noreply.github.com> Date: Mon, 30 May 2022 15:53:23 +0530 Subject: [PATCH] Fixed#2730: added status filter support for webhooks (#5214) * Fixed#2730: added status filter support for webhooks * added status param * addressing comments * postgres query change --- .../v002__create_db_connection_info.sql | 1 + .../v002__create_db_connection_info.sql | 1 + .../catalog/jdbi3/ListFilter.java | 24 +++++++++++++++++++ .../resources/events/WebhookResource.java | 5 +++- 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/bootstrap/sql/com.mysql.cj.jdbc.Driver/v002__create_db_connection_info.sql b/bootstrap/sql/com.mysql.cj.jdbc.Driver/v002__create_db_connection_info.sql index a7eeaff226b..4dcb4138658 100644 --- a/bootstrap/sql/com.mysql.cj.jdbc.Driver/v002__create_db_connection_info.sql +++ b/bootstrap/sql/com.mysql.cj.jdbc.Driver/v002__create_db_connection_info.sql @@ -10,6 +10,7 @@ CREATE TABLE IF NOT EXISTS type_entity ( ); ALTER TABLE webhook_entity +ADD status VARCHAR(256) GENERATED ALWAYS AS (json ->> '$.status') NOT NULL, DROP COLUMN deleted; ALTER TABLE entity_relationship diff --git a/bootstrap/sql/org.postgresql.Driver/v002__create_db_connection_info.sql b/bootstrap/sql/org.postgresql.Driver/v002__create_db_connection_info.sql index 0a50d4be94e..f312a7d3aad 100644 --- a/bootstrap/sql/org.postgresql.Driver/v002__create_db_connection_info.sql +++ b/bootstrap/sql/org.postgresql.Driver/v002__create_db_connection_info.sql @@ -10,6 +10,7 @@ CREATE TABLE IF NOT EXISTS type_entity ( ); ALTER TABLE webhook_entity +ADD status VARCHAR(256) GENERATED ALWAYS AS (json ->> 'status') STORED NOT NULL, DROP COLUMN deleted; DROP INDEX entity_relationship_edge_index; diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/ListFilter.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/ListFilter.java index 8c6250cc8a4..6a88daf8926 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/ListFilter.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/ListFilter.java @@ -1,6 +1,9 @@ package org.openmetadata.catalog.jdbi3; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.openmetadata.catalog.Entity; import org.openmetadata.catalog.type.Include; @@ -39,6 +42,7 @@ public class ListFilter { condition = addCondition(condition, getServiceCondition(tableName)); condition = addCondition(condition, getParentCondition(tableName)); condition = addCondition(condition, getCategoryCondition(tableName)); + condition = addCondition(condition, getWebhookCondition(tableName)); return condition.isEmpty() ? "WHERE TRUE" : "WHERE " + condition; } @@ -73,6 +77,11 @@ public class ListFilter { return category == null ? "" : getCategoryPrefixCondition(tableName, escape(category)); } + public String getWebhookCondition(String tableName) { + String webhookStatus = queryParams.get("status"); + return webhookStatus == null ? "" : getStatusPrefixCondition(tableName, escape(webhookStatus)); + } + private String getFqnPrefixCondition(String tableName, String fqnPrefix) { return tableName == null ? String.format("fullyQualifiedName LIKE '%s%s%%'", fqnPrefix, Entity.SEPARATOR) @@ -85,6 +94,21 @@ public class ListFilter { : String.format("%s.category LIKE '%s%s%%'", tableName, category, ""); } + private String getStatusPrefixCondition(String tableName, String statusPrefix) { + if (!statusPrefix.isEmpty()) { + List statusList = new ArrayList<>(Arrays.asList(statusPrefix.split(","))); + List condition = new ArrayList<>(); + for (String s : statusList) { + String format = "\"" + s + "\""; + condition.add(format); + } + return "status in (" + String.join(",", condition) + ")"; + } + return tableName == null + ? String.format("status LIKE '%s%s%%'", statusPrefix, "") + : String.format("%s.status LIKE '%s%s%%'", tableName, statusPrefix, ""); + } + private String addCondition(String condition1, String condition2) { if (condition1.isEmpty()) { return condition2; diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/events/WebhookResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/events/WebhookResource.java index a9dea44211e..b868a4d5ca8 100644 --- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/events/WebhookResource.java +++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/events/WebhookResource.java @@ -104,6 +104,9 @@ public class WebhookResource extends EntityResource public ResultList list( @Context UriInfo uriInfo, @Context SecurityContext securityContext, + @Parameter(description = "Filter webhooks by status", schema = @Schema(type = "string", example = "active")) + @QueryParam("status") + String statusParam, @Parameter(description = "Limit the number webhooks returned. (1 to 1000000, default = " + "10) ") @DefaultValue("10") @Min(0) @@ -123,7 +126,7 @@ public class WebhookResource extends EntityResource @DefaultValue("non-deleted") Include include) throws IOException { - ListFilter filter = new ListFilter(Include.ALL); + ListFilter filter = new ListFilter(Include.ALL).addQueryParam("status", statusParam); return listInternal(uriInfo, securityContext, "", filter, limitParam, before, after); }