Filter impls
This commit is contained in:
parent
8de10c4e3b
commit
b30072bfe0
|
@ -1,3 +1,4 @@
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
@ -13,4 +14,8 @@ pub struct PropertyPrice {
|
||||||
pub price: f64,
|
pub price: f64,
|
||||||
pub currency: String,
|
pub currency: String,
|
||||||
pub arrangement: ArrangementType,
|
pub arrangement: ArrangementType,
|
||||||
|
#[serde(rename = "timeCreated")]
|
||||||
|
pub time_created: DateTime<Utc>,
|
||||||
|
#[serde(rename = "lastUpdated")]
|
||||||
|
pub last_updated: DateTime<Utc>,
|
||||||
}
|
}
|
|
@ -1,17 +1,86 @@
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
use crate::domain::{arrangement::ArrangementType, property_type::PropertyType};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, PartialOrd)]
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, PartialOrd)]
|
||||||
pub enum Filter {
|
pub enum Filter {
|
||||||
|
PropertyType(PropertyType),
|
||||||
|
|
||||||
Country(String),
|
Country(String),
|
||||||
City(String),
|
City(String),
|
||||||
District(String),
|
District(String),
|
||||||
|
|
||||||
PriceGreaterThan(f64),
|
Rooms(i16),
|
||||||
PriceLessThan(f64),
|
Bathrooms(f32),
|
||||||
|
MinArea(f32),
|
||||||
|
ParkingSpots(i16),
|
||||||
|
|
||||||
Rooms(i32),
|
Arrangement(ArrangementType),
|
||||||
Bathrooms(i32),
|
PriceLessThan(f64),
|
||||||
|
PriceGreaterThan(f64),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Filter {
|
||||||
|
pub fn from_query_param(key: String, val: String) -> Option<Self> {
|
||||||
|
match key.as_str() {
|
||||||
|
"property_type" => {
|
||||||
|
match PropertyType::from_str(&val) {
|
||||||
|
Ok(property_type) => Some(Self::PropertyType(property_type)),
|
||||||
|
Err(_) => None,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"country" => Some(Self::Country(val)),
|
||||||
|
"city" => Some(Self::City(val)),
|
||||||
|
"district" => Some(Self::District(val)),
|
||||||
|
"rooms" => match val.parse::<i16>() {
|
||||||
|
Ok(rooms) => Some(Self::Rooms(rooms)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
"bathrooms" => match val.parse::<f32>() {
|
||||||
|
Ok(bathrooms) => Some(Self::Bathrooms(bathrooms)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
"min_area" => match val.parse::<f32>() {
|
||||||
|
Ok(min_area) => Some(Self::MinArea(min_area)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
"parking_spots" => match val.parse::<i16>() {
|
||||||
|
Ok(parking_spots) => Some(Self::ParkingSpots(parking_spots)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
"arrangement" => match ArrangementType::from_str(&val) {
|
||||||
|
Ok(arrangement_type) => Some(Self::Arrangement(arrangement_type)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
"price_less_than" => match val.parse::<f64>() {
|
||||||
|
Ok(price) => Some(Self::PriceLessThan(price)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
"price_greater_than" => match val.parse::<f64>() {
|
||||||
|
Ok(price) => Some(Self::PriceGreaterThan(price)),
|
||||||
|
Err(_) => None,
|
||||||
|
},
|
||||||
|
_ => { None }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_query_param(self) -> (String, String) {
|
||||||
|
match self {
|
||||||
|
Filter::PropertyType(property_type) => (String::from("property_type"), property_type.to_string()),
|
||||||
|
Filter::Country(country) => (String::from("country"), country),
|
||||||
|
Filter::City(city) => (String::from("city"), city),
|
||||||
|
Filter::District(district) => (String::from("district"), district),
|
||||||
|
Filter::Rooms(rooms) => (String::from("rooms"), rooms.to_string()),
|
||||||
|
Filter::Bathrooms(bathrooms) => (String::from("bathrooms"), bathrooms.to_string()),
|
||||||
|
Filter::MinArea(min_area) => (String::from("min_area"), min_area.to_string()),
|
||||||
|
Filter::ParkingSpots(parking_spots) => (String::from("parking_spots"), parking_spots.to_string()),
|
||||||
|
Filter::Arrangement(arrangement) => (String::from("arrangement"), arrangement.to_string()),
|
||||||
|
Filter::PriceLessThan(price_less_than) => (String::from("price_less_than"), price_less_than.to_string()),
|
||||||
|
Filter::PriceGreaterThan(price_greater_than) => (String::from("price_greater_than"), price_greater_than.to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue