Added metadata to airport queries
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
use crate::db;
|
use crate::db;
|
||||||
use crate::error_handler::ServiceError;
|
use crate::error_handler::ServiceError;
|
||||||
use crate::schema::airports;
|
use crate::schema::airports;
|
||||||
|
use diesel::dsl::count_star;
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
// use log::trace;
|
// use log::trace;
|
||||||
use postgis_diesel::types::*;
|
use postgis_diesel::types::*;
|
||||||
@@ -43,16 +44,9 @@ pub struct QueryAirport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl QueryAirport {
|
impl QueryAirport {
|
||||||
pub fn get_all(bounds: Option<Polygon<Point>>, category: Option<String>, filter: Option<String>, limit: Option<i32>, page: Option<i32>) -> Result<Vec<Self>, ServiceError> {
|
pub fn get_all(bounds: &Option<Polygon<Point>>, category: &Option<String>, filter: &Option<String>, limit: i32, page: i32) -> Result<Vec<Self>, ServiceError> {
|
||||||
let mut conn = db::connection()?;
|
let mut conn = db::connection()?;
|
||||||
let limit = match limit {
|
|
||||||
Some(l) => l,
|
|
||||||
None => 100
|
|
||||||
};
|
|
||||||
let page = match page {
|
|
||||||
Some(p) => p,
|
|
||||||
None => 1
|
|
||||||
};
|
|
||||||
let mut query = airports::table
|
let mut query = airports::table
|
||||||
.limit(limit as i64)
|
.limit(limit as i64)
|
||||||
.into_boxed();
|
.into_boxed();
|
||||||
@@ -70,12 +64,31 @@ impl QueryAirport {
|
|||||||
.or(airports::full_name.ilike(format!("%{}%", filter)))
|
.or(airports::full_name.ilike(format!("%{}%", filter)))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
// let debug = diesel::debug_query::<diesel::pg::Pg, _>(&query);
|
let airports: Vec<QueryAirport> = query.order((airports::id.asc(), airports::category.asc())).load::<QueryAirport>(&mut conn)?;
|
||||||
// trace!("{}", debug);
|
|
||||||
let airports: Vec<QueryAirport> = query.order(airports::category.asc()).load::<QueryAirport>(&mut conn)?;
|
|
||||||
Ok(airports)
|
Ok(airports)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_count(bounds: &Option<Polygon<Point>>, category: &Option<String>, filter: &Option<String>) -> Result<i64, ServiceError> {
|
||||||
|
let mut conn = db::connection()?;
|
||||||
|
let mut query = airports::table.select(count_star()).into_boxed();
|
||||||
|
|
||||||
|
if let Some(bounds) = bounds {
|
||||||
|
query = query.filter(st_contains(bounds, airports::point));
|
||||||
|
}
|
||||||
|
if let Some(category) = category {
|
||||||
|
query = query.filter(airports::category.eq(category));
|
||||||
|
}
|
||||||
|
if let Some(filter) = filter {
|
||||||
|
query = query.filter(airports::icao
|
||||||
|
.ilike(format!("%{}%", filter))
|
||||||
|
.or(airports::full_name.ilike(format!("%{}%", filter)))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
let count: i64 = query.first(&mut conn)?;
|
||||||
|
return Ok(count);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn find(icao: String) -> Result<Self, ServiceError> {
|
pub fn find(icao: String) -> Result<Self, ServiceError> {
|
||||||
let mut conn = db::connection()?;
|
let mut conn = db::connection()?;
|
||||||
let airport = airports::table.filter(airports::icao.eq(icao)).first(&mut conn)?;
|
let airport = airports::table.filter(airports::icao.eq(icao)).first(&mut conn)?;
|
||||||
|
|||||||
@@ -82,10 +82,24 @@ async fn get_all(req: HttpRequest) -> HttpResponse {
|
|||||||
None => None
|
None => None
|
||||||
};
|
};
|
||||||
|
|
||||||
match web::block(move || QueryAirport::get_all(polygon, category, filter, params.limit, params.page)).await.unwrap() {
|
let limit = match params.limit {
|
||||||
|
Some(l) => l,
|
||||||
|
None => 100
|
||||||
|
};
|
||||||
|
let page = match params.page {
|
||||||
|
Some(p) => p,
|
||||||
|
None => 1
|
||||||
|
};
|
||||||
|
let total = match QueryAirport::get_count(&polygon, &category, &filter) {
|
||||||
|
Ok(t) => t,
|
||||||
|
Err(_) => 0
|
||||||
|
};
|
||||||
|
let pages = ((total as f64) / (if limit <= 0 { 1 } else { limit} as f64)).ceil() as i64;
|
||||||
|
|
||||||
|
match web::block(move || QueryAirport::get_all(&polygon, &category, &filter, limit, page)).await.unwrap() {
|
||||||
Ok(a) => HttpResponse::Ok().json(AirportsResponse {
|
Ok(a) => HttpResponse::Ok().json(AirportsResponse {
|
||||||
data: a,
|
data: a,
|
||||||
meta: Metadata { page: 0, limit: 0, pages: 0, total: 0 }
|
meta: Metadata { page, limit, pages, total }
|
||||||
}),
|
}),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error!("{}", err);
|
error!("{}", err);
|
||||||
@@ -105,7 +119,7 @@ async fn get(icao: web::Path<String>) -> HttpResponse {
|
|||||||
match QueryAirport::find(icao.into_inner()) {
|
match QueryAirport::find(icao.into_inner()) {
|
||||||
Ok(a) => HttpResponse::Ok().json(AirportResponse {
|
Ok(a) => HttpResponse::Ok().json(AirportResponse {
|
||||||
data: a,
|
data: a,
|
||||||
meta: Metadata { page: 0, limit: 0, pages: 0, total: 0 }
|
meta: Metadata { page: 1, limit: 1, pages: 1, total: 1 }
|
||||||
}),
|
}),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error!("{}", err);
|
error!("{}", err);
|
||||||
|
|||||||
@@ -69,8 +69,8 @@ pub fn import_data() {
|
|||||||
pub struct Metadata {
|
pub struct Metadata {
|
||||||
pub page: i32,
|
pub page: i32,
|
||||||
pub limit: i32,
|
pub limit: i32,
|
||||||
pub pages: i32,
|
pub pages: i64,
|
||||||
pub total: i32,
|
pub total: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
|
||||||
|
|||||||
Reference in New Issue
Block a user