From 35c9b8afe1a09b858c79c0ce13cf5c24d200d3fd Mon Sep 17 00:00:00 2001 From: Sandeep Kumar <83278309+tsdk02@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:56:41 +0530 Subject: [PATCH] feat(globalsearch): Added search_tags based filter for global search in dashboard (#5341) Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> Co-authored-by: Abhishek Kanojia <89402434+Abhitator216@users.noreply.github.com> --- api-reference/openapi_spec.json | 10 +++---- crates/analytics/src/search.rs | 36 +++++++++++++++++++++++ crates/api_models/src/analytics/search.rs | 2 ++ crates/api_models/src/payments.rs | 8 +++-- crates/masking/src/strategy.rs | 2 ++ 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/api-reference/openapi_spec.json b/api-reference/openapi_spec.json index 79605b77fa..12b3d2a05f 100644 --- a/api-reference/openapi_spec.json +++ b/api-reference/openapi_spec.json @@ -9515,11 +9515,11 @@ "nullable": true }, "search_tags": { - "allOf": [ - { - "$ref": "#/components/schemas/RedirectResponse" - } - ], + "type": "array", + "items": { + "type": "string" + }, + "description": "Additional tags to be used for global search", "nullable": true } } diff --git a/crates/analytics/src/search.rs b/crates/analytics/src/search.rs index 269864bf44..a5bd117bd6 100644 --- a/crates/analytics/src/search.rs +++ b/crates/analytics/src/search.rs @@ -66,6 +66,24 @@ pub async fn msearch_results( .switch()?; } }; + if let Some(search_tags) = filters.search_tags { + if !search_tags.is_empty() { + query_builder + .add_filter_clause( + "feature_metadata.search_tags.keyword".to_string(), + search_tags + .iter() + .filter_map(|search_tag| { + // TODO: Add trait based inputs instead of converting this to strings + serde_json::to_value(search_tag) + .ok() + .and_then(|a| a.as_str().map(|a| a.to_string())) + }) + .collect(), + ) + .switch()?; + } + }; }; let response_text: OpenMsearchOutput = client @@ -173,6 +191,24 @@ pub async fn search_results( .switch()?; } }; + if let Some(search_tags) = filters.search_tags { + if !search_tags.is_empty() { + query_builder + .add_filter_clause( + "feature_metadata.search_tags.keyword".to_string(), + search_tags + .iter() + .filter_map(|search_tag| { + // TODO: Add trait based inputs instead of converting this to strings + serde_json::to_value(search_tag) + .ok() + .and_then(|a| a.as_str().map(|a| a.to_string())) + }) + .collect(), + ) + .switch()?; + } + }; }; query_builder .set_offset_n_count(search_req.offset, search_req.count) diff --git a/crates/api_models/src/analytics/search.rs b/crates/api_models/src/analytics/search.rs index 034a2a9435..d1af00de56 100644 --- a/crates/api_models/src/analytics/search.rs +++ b/crates/api_models/src/analytics/search.rs @@ -1,4 +1,5 @@ use common_utils::hashing::HashedString; +use masking::WithType; use serde_json::Value; #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] @@ -7,6 +8,7 @@ pub struct SearchFilters { pub currency: Option>, pub status: Option>, pub customer_email: Option>>, + pub search_tags: Option>>, } #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index f53507fc13..c04af20449 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -9,11 +9,12 @@ use common_utils::{ consts::default_payments_list_limit, crypto, ext_traits::{ConfigExt, Encode}, + hashing::HashedString, id_type, pii::{self, Email}, types::{MinorUnit, StringMajorUnit}, }; -use masking::{PeekInterface, Secret}; +use masking::{PeekInterface, Secret, WithType}; use router_derive::Setter; use serde::{ de::{self, Unexpected, Visitor}, @@ -4987,11 +4988,12 @@ pub struct PaymentsStartRequest { #[derive(Debug, Clone, serde::Deserialize, serde::Serialize, ToSchema)] pub struct FeatureMetadata { /// Redirection response coming in request as metadata field only for redirection scenarios + #[schema(value_type = Option)] pub redirect_response: Option, // TODO: Convert this to hashedstrings to avoid PII sensitive data /// Additional tags to be used for global search - #[schema(value_type = Option)] - pub search_tags: Option>>, + #[schema(value_type = Option>)] + pub search_tags: Option>>, } ///frm message is an object sent inside the payments response...when frm is invoked, its value is Some(...), else its None diff --git a/crates/masking/src/strategy.rs b/crates/masking/src/strategy.rs index 8b4d9b0ec3..eb705ca490 100644 --- a/crates/masking/src/strategy.rs +++ b/crates/masking/src/strategy.rs @@ -7,6 +7,8 @@ pub trait Strategy { } /// Debug with type +#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Debug, Copy, Clone)] pub enum WithType {} impl Strategy for WithType {