From 68a442bed29509011e151404ec2ab31c965438dd Mon Sep 17 00:00:00 2001 From: Ben Sherriff Date: Wed, 13 Sep 2023 10:56:24 -0400 Subject: [PATCH] Filter on airport category --- weather-service/src/airports/model.rs | 36 +++++++++++++++++-------- weather-service/src/airports/routes.rs | 8 +++++- weather-service/src/metars/model.rs | 1 + weather-ui/src/components/MetarMap.tsx | 12 ++++----- weather-ui/src/js/api/airport.ts | 37 +++++++++++++++++--------- weather-ui/src/js/api/airport.types.ts | 8 +++++- 6 files changed, 70 insertions(+), 32 deletions(-) diff --git a/weather-service/src/airports/model.rs b/weather-service/src/airports/model.rs index d769c24..284b6fb 100644 --- a/weather-service/src/airports/model.rs +++ b/weather-service/src/airports/model.rs @@ -41,18 +41,32 @@ pub struct Airports { } impl Airports { - pub fn find_all(bounds: Option>, limit: i32, page: i32) -> Result, CustomError> { + pub fn find_all(bounds: Option>, category: Option, limit: i32, page: i32) -> Result, CustomError> { let mut conn = db::connection()?; - let airports = airports::table - .limit(limit as i64) - .filter(airports::id.gt(page * limit).and(match bounds { - Some(b) => st_contains(b, airports::point), - None => { - let polygon: Polygon = Polygon::new(Some(4326)); - st_contains(polygon, airports::point) - } - })) - .load::(&mut conn)?; + let airports; + if let Some(category) = category { + airports = airports::table + .limit(limit as i64) + .filter(airports::id.gt(page * limit).and(match bounds { + Some(b) => st_contains(b, airports::point), + None => { + let polygon: Polygon = Polygon::new(Some(4326)); + st_contains(polygon, airports::point) + } + }).and(airports::category.eq(category))).load::(&mut conn)?; + } else { + airports = airports::table + .order(airports::category.asc()) + .limit(limit as i64) + .filter(airports::id.gt(page * limit).and(match bounds { + Some(b) => st_contains(b, airports::point), + None => { + let polygon: Polygon = Polygon::new(Some(4326)); + st_contains(polygon, airports::point) + } + })) + .load::(&mut conn)?; + } Ok(airports) } diff --git a/weather-service/src/airports/routes.rs b/weather-service/src/airports/routes.rs index 185f7ff..b8b3d00 100644 --- a/weather-service/src/airports/routes.rs +++ b/weather-service/src/airports/routes.rs @@ -11,6 +11,7 @@ struct FindAllParams { ne_lon: f64, sw_lat: f64, sw_lon: f64, + category: Option, limit: i32, page: i32 } @@ -36,7 +37,12 @@ async fn find_all(req: HttpRequest) -> HttpResponse { polygon.add_point(Point { x: params.ne_lon, y: params.ne_lat, srid: Some(4326) }); polygon.add_point(Point { x: params.sw_lon, y: params.ne_lat, srid: Some(4326) }); polygon.add_point(Point { x: params.sw_lon, y: params.sw_lat, srid: Some(4326) }); - match web::block(move || Airports::find_all(Some(polygon), params.limit, params.page)).await.unwrap() { + let category = match ¶ms.category { + Some(c) => Some(c.to_string()), + None => None + }; + + match web::block(move || Airports::find_all(Some(polygon), category, params.limit, params.page)).await.unwrap() { Ok(a) => HttpResponse::Ok().json(a), Err(err) => { error!("{}", err); diff --git a/weather-service/src/metars/model.rs b/weather-service/src/metars/model.rs index fa7f577..62ddefc 100644 --- a/weather-service/src/metars/model.rs +++ b/weather-service/src/metars/model.rs @@ -150,6 +150,7 @@ impl Metars { Ok(m) => m, Err(err) => return Err(CustomError { error_status_code: 500, error_message: format!("{}", err) }) }; + fn get_missing_metar_icaos(db_metars: &Vec, station_icaos: Vec<&str>) -> Vec { let mut missing_metar_icaos: Vec = vec![]; let current_time = chrono::Local::now().naive_local().timestamp(); diff --git a/weather-ui/src/components/MetarMap.tsx b/weather-ui/src/components/MetarMap.tsx index 843eb0c..c3e13be 100644 --- a/weather-ui/src/components/MetarMap.tsx +++ b/weather-ui/src/components/MetarMap.tsx @@ -18,7 +18,6 @@ export default function Map() { zoom={8} maxZoom={12} minZoom={1} - zoomControl={false} style={{ height: '96.5vh' }} className='overflow-y-hidden overflow-x-hidden' attributionControl={false} @@ -35,8 +34,9 @@ function MapTiles() { const map = useMap(); const mapEvents = useMapEvents({ - zoomend: () => { + zoomend: async () => { setZoomLevel(mapEvents.getZoom()); + await updateAirports(mapEvents.getBounds()); }, movestart: () => { // setDragging(true); @@ -51,10 +51,10 @@ function MapTiles() { const ne = bounds.getNorthEast(); const sw = bounds.getSouthWest(); const _airports = await getAirports({ - ne_lat: ne.lat, - ne_lon: ne.lng, - sw_lat: sw.lat, - sw_lon: sw.lng, + bounds: { + northEast: { lat: ne.lat, lon: ne.lng }, + southWest: { lat: sw.lat, lon: sw.lng } + }, limit: 100, page: 1 }); diff --git a/weather-ui/src/js/api/airport.ts b/weather-ui/src/js/api/airport.ts index ce37e84..ca89ce0 100644 --- a/weather-ui/src/js/api/airport.ts +++ b/weather-ui/src/js/api/airport.ts @@ -2,14 +2,22 @@ import axios from 'axios'; import { Airport } from './airport.types'; interface GetAirportsProps { - ne_lat: number; - ne_lon: number; - sw_lat: number; - sw_lon: number; + bounds?: Bounds; + category?: string; page?: number; limit?: number; } +export interface Bounds { + northEast: Coordinate; + southWest: Coordinate; +} + +export interface Coordinate { + lat: number; + lon: number; +} + interface GetAirportProps { icao: string; } @@ -19,16 +27,19 @@ export async function getAirport({ icao }: GetAirportProps) { return response?.data; } -export async function getAirports({ - ne_lat, - ne_lon, - sw_lat, - sw_lon, - limit = 10, - page = 1 -}: GetAirportsProps): Promise { +export async function getAirports({ bounds, category, limit = 10, page = 1 }: GetAirportsProps): Promise { const response = await axios - .get(`http://localhost:5000/airports`, { params: { ne_lat, ne_lon, sw_lat, sw_lon, limit, page } }) + .get(`http://localhost:5000/airports`, { + params: { + ne_lat: bounds?.northEast.lat, + ne_lon: bounds?.northEast.lon, + sw_lat: bounds?.southWest.lat, + sw_lon: bounds?.southWest.lon, + category, + limit, + page + } + }) .catch((error) => console.error(error)); return response?.data || []; } diff --git a/weather-ui/src/js/api/airport.types.ts b/weather-ui/src/js/api/airport.types.ts index 15545fb..56073e1 100644 --- a/weather-ui/src/js/api/airport.types.ts +++ b/weather-ui/src/js/api/airport.types.ts @@ -1,8 +1,14 @@ import { Metar } from './metar.types'; +export enum AirportCategory { + SMALL = 'small_airport', + MEDIUM = 'medium_airport', + LARGE = 'large_airport' +} + export interface Airport { icao: string; - category: string; + category: AirportCategory; full_name: string; elevation_ft: string; continent: string;