From 91d8e6c9107b7ab4b4bae0ddb15e66aae1bc3191 Mon Sep 17 00:00:00 2001 From: Ben Sherriff Date: Fri, 1 Dec 2023 17:30:29 -0500 Subject: [PATCH] Fixed airport responses --- service/src/airports/model.rs | 2 +- service/src/airports/routes.rs | 36 ++++++++++++++++++------- service/src/metars/model.rs | 22 +++++++++++++++ ui/src/api/metar.types.ts | 4 +-- ui/src/components/Metars/MapTiles.tsx | 2 +- ui/src/components/Metars/MetarModal.tsx | 23 ++++++++++------ ui/src/components/Metars/metars.css | 2 +- 7 files changed, 68 insertions(+), 23 deletions(-) diff --git a/service/src/airports/model.rs b/service/src/airports/model.rs index 7fa4e78..ca89af3 100644 --- a/service/src/airports/model.rs +++ b/service/src/airports/model.rs @@ -22,7 +22,7 @@ pub struct Airport { pub iata_code: String, pub local_code: String, pub point: Point, - pub tower: Option, + pub has_tower: Option, } impl Into for Airport { diff --git a/service/src/airports/routes.rs b/service/src/airports/routes.rs index 4a37ee8..df0adfb 100644 --- a/service/src/airports/routes.rs +++ b/service/src/airports/routes.rs @@ -106,10 +106,17 @@ async fn get_all(req: HttpRequest) -> HttpResponse { let pages = ((total as f64) / (if limit <= 0 { 1 } else { limit} as f64)).ceil() as i64; match web::block(move || QueryAirport::get_all(&filters, limit, page)).await.unwrap() { - Ok(a) => HttpResponse::Ok().json(Response { - data: a, - meta: Some(Metadata { page, limit, pages, total }) - }), + Ok(a) => { + // Convert Vec to Vec + let mut airports: Vec = vec![]; + for airport in a { + airports.push(airport.into()); + } + HttpResponse::Ok().json(Response { + data: airports, + meta: Some(Metadata { page, limit, pages, total }) + }) + }, Err(err) => { error!("{}", err); err.to_http_response() @@ -120,10 +127,13 @@ async fn get_all(req: HttpRequest) -> HttpResponse { #[get("/{icao}")] async fn get(icao: web::Path) -> HttpResponse { match QueryAirport::find(icao.into_inner()) { - Ok(a) => HttpResponse::Ok().json(Response { - data: a, - meta: Some(Metadata { page: 1, limit: 1, pages: 1, total: 1 }) - }), + Ok(a) => { + let airport: Airport = a.into(); + HttpResponse::Ok().json(Response { + data: airport, + meta: Some(Metadata { page: 1, limit: 1, pages: 1, total: 1 }) + }) + }, Err(err) => { error!("{}", err); err.to_http_response() @@ -139,7 +149,10 @@ async fn create(airport: web::Json, auth: JwtAuth) -> HttpResponse { }; let query_airport: QueryAirport = airport.into_inner().into(); match QueryAirport::insert(query_airport) { - Ok(a) => HttpResponse::Created().json(a), + Ok(a) => { + let airport: Airport = a.into(); + HttpResponse::Ok().json(airport) + }, Err(err) => { error!("{}", err); err.to_http_response() @@ -155,7 +168,10 @@ async fn update(icao: web::Path, airport: web::Json, auth: JwtA }; let query_airport: QueryAirport = airport.into_inner().into(); match QueryAirport::update(icao.into_inner(), query_airport) { - Ok(a) => HttpResponse::Ok().json(a), + Ok(a) => { + let airport: Airport = a.into(); + HttpResponse::Ok().json(airport) + }, Err(err) => { error!("{}", err); err.to_http_response() diff --git a/service/src/metars/model.rs b/service/src/metars/model.rs index 97fe42e..28c4132 100644 --- a/service/src/metars/model.rs +++ b/service/src/metars/model.rs @@ -8,10 +8,15 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] pub struct QualityControlFlags { + #[serde(skip_serializing_if = "Option::is_none")] pub auto: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub auto_station_without_precipication: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub auto_station_with_precipication: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub maintenance_indicator_on: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub corrected: Option } @@ -30,6 +35,7 @@ impl Default for QualityControlFlags { #[derive(Serialize, Deserialize, Debug)] pub struct SkyCondition { pub sky_cover: String, + #[serde(skip_serializing_if = "Option::is_none")] pub cloud_base_ft_agl: Option } @@ -45,8 +51,11 @@ impl Default for SkyCondition { #[derive(Serialize, Deserialize, Debug)] pub struct RunwayVisualRange { pub runway: String, + #[serde(skip_serializing_if = "Option::is_none")] pub visibility_ft: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub variable_visibility_high_ft: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub variable_visibility_low_ft: Option } @@ -75,23 +84,36 @@ pub struct Metar { pub raw_text: String, pub station_id: String, pub observation_time: chrono::NaiveDateTime, + #[serde(skip_serializing_if = "Option::is_none")] pub temp_c: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub dewpoint_c: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub wind_dir_degrees: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub wind_speed_kt: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub wind_gust_kt: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub variable_wind_dir_degrees: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub visibility_statute_mi: Option, pub runway_visual_range: Vec, + #[serde(skip_serializing_if = "Option::is_none")] pub altim_in_hg: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub sea_level_pressure_mb: Option, pub quality_control_flags: QualityControlFlags, pub weather_phenomena: Vec, pub sky_condition: Vec, pub flight_category: FlightCategory, + #[serde(skip_serializing_if = "Option::is_none")] pub three_hr_pressure_tendency_mb: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub max_t_c: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub min_t_c: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub precip_in: Option, } diff --git a/ui/src/api/metar.types.ts b/ui/src/api/metar.types.ts index 631b1c7..848f91f 100644 --- a/ui/src/api/metar.types.ts +++ b/ui/src/api/metar.types.ts @@ -37,7 +37,7 @@ export interface Metar { sky_condition: SkyCondition[]; flight_category: 'VFR' | 'MVFR' | 'LIFR' | 'IFR' | 'UNKN'; three_hr_pressure_tendency_mb: number; - maxT_c: number; - minT_c: number; + max_t_c: number; + min_t_c: number; precip_in: number; } diff --git a/ui/src/components/Metars/MapTiles.tsx b/ui/src/components/Metars/MapTiles.tsx index 50ff4aa..1e159d1 100644 --- a/ui/src/components/Metars/MapTiles.tsx +++ b/ui/src/components/Metars/MapTiles.tsx @@ -70,7 +70,7 @@ export default function MapTiles() { } function metarIcon(airport: Airport) { - function innerIcon({ tag, color, size = 'sm' }: { tag: string; color: string; size?: string }) { + function innerIcon({ tag, color, size = 'xs' }: { tag: string; color: string; size?: string }) { return new DivIcon({ html: ReactDOMServer.renderToString( diff --git a/ui/src/components/Metars/MetarModal.tsx b/ui/src/components/Metars/MetarModal.tsx index 5fff48a..a393d11 100644 --- a/ui/src/components/Metars/MetarModal.tsx +++ b/ui/src/components/Metars/MetarModal.tsx @@ -48,7 +48,13 @@ export default function MetarModal({ airport, isOpen, onClose }: MetarModalProps } return ( - + {airport.icao} {airport.full_name} @@ -163,13 +169,14 @@ function MetarInfo({ metar }: { metar: Metar }) { - - {metar.weather_phenomena && - metar.weather_phenomena.map((wx) => ( - - - - ))} + + + + + + + + diff --git a/ui/src/components/Metars/metars.css b/ui/src/components/Metars/metars.css index 0755991..f145770 100644 --- a/ui/src/components/Metars/metars.css +++ b/ui/src/components/Metars/metars.css @@ -15,4 +15,4 @@ .modal .star { cursor: pointer; -} \ No newline at end of file +}