From 0c5b80349c39f01b007122412c329b8c7cb84566 Mon Sep 17 00:00:00 2001 From: anant Date: Thu, 20 Mar 2025 15:33:36 +0530 Subject: [PATCH] Updates for list filters API Adds query params `stream`, `user_id`, and `type` to the endpoint --- src/handlers/http/users/filters.rs | 50 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/handlers/http/users/filters.rs b/src/handlers/http/users/filters.rs index 378e80df3..16a4be3cb 100644 --- a/src/handlers/http/users/filters.rs +++ b/src/handlers/http/users/filters.rs @@ -31,13 +31,59 @@ use actix_web::{ use bytes::Bytes; use chrono::Utc; use http::StatusCode; +use once_cell::sync::Lazy; +use regex::Regex; use serde_json::Error as SerdeError; +#[derive(Debug, Default)] +struct FilterQueryParams { + stream: Option, + user_id: Option, + type_param: Option, +} + +static FILTER_QUERY_PARAMS_RE: Lazy = + Lazy::new(|| Regex::new(r"(?:^|&)(stream|user_id|type)=([^&]*)").unwrap()); + pub async fn list(req: HttpRequest) -> Result { let key = extract_session_key_from_req(&req).map_err(|e| FiltersError::Custom(e.to_string()))?; - let filters = FILTERS.list_filters(&key).await; - Ok((web::Json(filters), StatusCode::OK)) + let mut filters = FILTERS.list_filters(&key).await; + + let query_string = req.query_string(); + if query_string.is_empty() { + Ok((web::Json(filters), StatusCode::OK)) + } else { + let mut params = FilterQueryParams::default(); + + let re = FILTER_QUERY_PARAMS_RE.clone(); + + for cap in re.captures_iter(query_string) { + let key = cap.get(1).unwrap().as_str(); + let value = cap.get(2).unwrap().as_str().to_string(); + + match key { + "stream" => params.stream = Some(value), + "user_id" => params.user_id = Some(value), + "type" => params.type_param = Some(value), + _ => {} // This shouldn't happen with our regex + } + } + + if params.stream.is_some() { + filters.retain(|f| f.stream_name.eq(params.stream.as_ref().unwrap())); + } + + if params.user_id.is_some() { + filters.retain(|f| f.user_id == Some(params.user_id.clone().unwrap())); + } + + if params.type_param.is_some() { + filters.retain(|f| f.query.filter_type == params.type_param.clone().unwrap()); + } + + Ok((web::Json(filters), StatusCode::OK)) + } } pub async fn get(