use serde::Deserialize;
use validator::Validate;
fn default_page_size() -> i64 {
50
}
#[derive(Debug, Clone, Deserialize, Validate, PartialEq, Eq)]
pub struct QuerySearch {
pub q: Option<String>,
pub sort: Option<String>,
#[serde(default)]
#[validate(range(min = 0))]
pub offset: i64,
#[serde(default = "default_page_size")]
#[validate(range(min = 1))]
pub page_size: i64,
pub include_total: Option<bool>,
}
impl QuerySearch {
pub fn parse_sort(&self, allowed_fields: &[&str]) -> Vec<String> {
self.sort
.as_deref()
.unwrap_or("")
.split(',')
.filter(|s| allowed_fields.contains(&s.strip_prefix('-').unwrap_or(s)))
.map(|f| {
f.strip_prefix('-')
.map(|d| format!("{d} DESC"))
.unwrap_or(f.to_string())
})
.collect()
}
pub fn sort_as_order_by_args(&self, allowed_fields: &[&str], default: &str) -> String {
let sorting = self.parse_sort(allowed_fields);
match sorting.len() {
0 => String::from(default),
_ => sorting.join(", "),
}
}
}