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>
This commit is contained in:
Sandeep Kumar
2024-07-17 15:56:41 +05:30
committed by GitHub
parent 96edf52ca6
commit 35c9b8afe1
5 changed files with 50 additions and 8 deletions

View File

@ -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
}
}

View File

@ -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)

View File

@ -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<Vec<String>>,
pub status: Option<Vec<String>>,
pub customer_email: Option<Vec<HashedString<common_utils::pii::EmailStrategy>>>,
pub search_tags: Option<Vec<HashedString<WithType>>>,
}
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]

View File

@ -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<RedirectResponse>)]
pub redirect_response: Option<RedirectResponse>,
// TODO: Convert this to hashedstrings to avoid PII sensitive data
/// Additional tags to be used for global search
#[schema(value_type = Option<RedirectResponse>)]
pub search_tags: Option<Vec<Secret<String>>>,
#[schema(value_type = Option<Vec<String>>)]
pub search_tags: Option<Vec<HashedString<WithType>>>,
}
///frm message is an object sent inside the payments response...when frm is invoked, its value is Some(...), else its None

View File

@ -7,6 +7,8 @@ pub trait Strategy<T> {
}
/// Debug with type
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[derive(Debug, Copy, Clone)]
pub enum WithType {}
impl<T> Strategy<T> for WithType {