Fixed layouts

This commit is contained in:
2023-12-21 23:50:39 -05:00
parent 0b2ef94b99
commit bd6d5e03d3
17 changed files with 307 additions and 70 deletions

View File

@@ -144,7 +144,8 @@ pub struct QueryAirport {
#[derive(Debug)]
pub struct QueryFilters {
pub search: Option<String>,
pub icaos: Option<Vec<String>>,
pub name: Option<String>,
pub bounds: Option<Polygon<Point>>,
pub categories: Option<Vec<AirportCategory>>,
pub order_field: Option<QueryOrderField>,
@@ -154,7 +155,8 @@ pub struct QueryFilters {
impl Default for QueryFilters {
fn default() -> Self {
QueryFilters {
search: None,
icaos: None,
name: None,
bounds: None,
categories: None,
order_field: None,
@@ -305,11 +307,21 @@ impl QueryAirport {
if let Some(categories) = &filters.categories {
parts.push(format!("({})", categories.iter().map(|category| format!("category = '{}'", category.to_string())).collect::<Vec<String>>().join(" OR ")));
}
if let Some(search) = &filters.search {
fn sanitize_icao(icao: &str) -> String {
// Sanitize search to only allow [a-zA-Z0-9-\\s]
let search = search.chars().filter(|c| c.is_alphanumeric() || *c == '-' || *c == ' ').collect::<String>();
let search_strs = vec!["icao", "name", "iso_country", "iso_region", "municipality"];
parts.push(format!("({})", search_strs.iter().map(|s| format!("{} ILIKE '%{}%'", s, search)).collect::<Vec<String>>().join(" OR ")));
icao.chars().filter(|c| c.is_alphanumeric() || *c == '-' || *c == ' ').collect::<String>()
}
if &filters.icaos.is_some() == &true && &filters.name.is_some() == &true {
let icaos = filters.icaos.as_ref().unwrap();
let name = sanitize_icao(filters.name.as_ref().unwrap());
let icao_part = format!("({})", icaos.iter().map(|icao| format!("icao ILIKE '{}'", sanitize_icao(icao))).collect::<Vec<String>>().join(" OR "));
let name_part = format!("name ILIKE '%{}%'", name);
parts.push(format!("({} OR {})", icao_part, name_part));
} else if let Some(icaos) = &filters.icaos {
parts.push(format!("({})", icaos.iter().map(|icao| format!("icao ILIKE '{}'", sanitize_icao(icao))).collect::<Vec<String>>().join(" OR ")));
} else if let Some(name) = &filters.name {
let search = sanitize_icao(name);
parts.push(format!("name ILIKE '%{}%'", search));
}
if parts.len() > 0 {

View File

@@ -10,7 +10,8 @@ use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
struct GetAllParameters {
search: Option<String>,
icaos: Option<String>,
name: Option<String>,
bounds: Option<String>,
categories: Option<String>,
order_field: Option<String>,
@@ -68,7 +69,11 @@ async fn import(mut payload: Multipart, auth: JwtAuth) -> HttpResponse {
async fn get_all(req: HttpRequest) -> HttpResponse {
let params = web::Query::<GetAllParameters>::from_query(req.query_string()).unwrap();
let mut filters = QueryFilters::default();
filters.search = params.search.clone();
filters.icaos = match &params.icaos {
Some(i) => Some(i.split(",").map(|s| s.to_string()).collect()),
None => None
};
filters.name = params.name.clone();
filters.categories = match &params.categories {
Some(c) => Some(c.split(",").map(|s| AirportCategory::from_str(s).unwrap()).collect()),
None => None