diff --git a/api/src/airports/model/airport.rs b/api/src/airports/model/airport.rs index a03f36c..98ac600 100644 --- a/api/src/airports/model/airport.rs +++ b/api/src/airports/model/airport.rs @@ -160,7 +160,7 @@ impl From for Airport { } impl Airport { - pub async fn select(icao: &str) -> Option { + pub async fn select(icao: &str, metar: bool) -> Option { let pool = db::pool(); let airport_fut = async { @@ -170,11 +170,25 @@ impl Airport { .await }; + let metar_fut = async { + if metar { + match Metar::find_all(&[icao]).await { + Ok(m) => Some(m.into_iter().nth(0)), + Err(err) => { + log::error!("{}", err); + None + } + } + } else { + None + } + }; + let runways_fut = Runway::select_all(icao); let frequencies_fut = Frequency::select_all(icao); - let (airport_result, runways_result, frequencies_result) = - tokio::join!(airport_fut, runways_fut, frequencies_fut); + let (airport_result, runways_result, frequencies_result, metar_result) = + tokio::join!(airport_fut, runways_fut, frequencies_fut, metar_fut); let airport_row: Option = match airport_result { Ok(opt) => opt, @@ -204,10 +218,19 @@ impl Airport { } }; + let metar: Option = match metar_result { + Some(m_option) => match m_option { + Some(m) => Some(m), + None => None, + }, + None => None + }; + airport_row.map(|row| { let mut airport: Airport = row.into(); airport.runways = runways; airport.frequencies = frequencies; + airport.latest_metar = metar; airport }) } @@ -262,10 +285,19 @@ impl Airport { if !airports.is_empty() { let icaos: Vec = airports.iter().map(|a| a.icao.clone()).collect(); let mut runway_map = Runway::select_all_map(icaos.clone()).await?; - let mut frequency_map = Frequency::select_all_map(icaos).await?; + let mut frequency_map = Frequency::select_all_map(icaos.clone()).await?; + let mut metar_map: HashMap = HashMap::new(); + if query.metars.unwrap_or_else(|| false) { + let icaos_list: Vec<&str> = icaos.iter().map(|x| &**x).collect(); + let metars = Metar::find_all(&icaos_list).await?; + metar_map = metars.into_iter() + .map(|metar| (metar.station_id.clone(), metar)) + .collect(); + } for airport in airports.iter_mut() { airport.runways = runway_map.remove(&airport.icao).unwrap_or_default(); airport.frequencies = frequency_map.remove(&airport.icao).unwrap_or_default(); + airport.latest_metar = metar_map.remove(&airport.icao); } } diff --git a/api/src/airports/routes.rs b/api/src/airports/routes.rs index fb73fff..61c95a7 100644 --- a/api/src/airports/routes.rs +++ b/api/src/airports/routes.rs @@ -88,8 +88,16 @@ async fn get_airports(req: HttpRequest) -> HttpResponse { } #[get("/{icao}")] -async fn get_airport(icao: web::Path) -> HttpResponse { - match Airport::select(&icao.into_inner()).await { +async fn get_airport(icao: web::Path, req: HttpRequest) -> HttpResponse { + let metar = match web::Query::::from_query(req.query_string()) { + Ok(q) => q.metars.unwrap_or_else(|| false), + Err(err) => { + log::error!("{}", err); + false + } + }; + + match Airport::select(&icao.into_inner(), metar).await { Some(airport) => HttpResponse::Ok().json(airport), None => HttpResponse::NotFound().finish(), } diff --git a/api/src/metars/model.rs b/api/src/metars/model.rs index 1cf7ac7..74dbe3c 100644 --- a/api/src/metars/model.rs +++ b/api/src/metars/model.rs @@ -981,5 +981,7 @@ SLP125 P0003 60009 T00640036 10066 21012 58033 TSNO $".to_string(); .to_string(); let metar = Metar::parse(&metar_string).unwrap(); // dbg!(&metar); + + // metar_string = "KHEF 092356Z 13009KT 10SM CLR 08/M03 A3022 RMK AO2 SLP239 6//// T00831033 10133 20078 53002 PNO $".to_string(); } } diff --git a/bruno/Airports/Get Airport.bru b/bruno/Airports/Get Airport.bru index 3a40a4b..c25954e 100644 --- a/bruno/Airports/Get Airport.bru +++ b/bruno/Airports/Get Airport.bru @@ -5,7 +5,11 @@ meta { } get { - url: {{BASE_URL}}/airports/KHEF + url: {{BASE_URL}}/airports/KHEF?metars=true body: none auth: none } + +params:query { + metars: true +} diff --git a/bruno/Airports/Get All Airports.bru b/bruno/Airports/Get All Airports.bru index 966717c..b5890bc 100644 --- a/bruno/Airports/Get All Airports.bru +++ b/bruno/Airports/Get All Airports.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{BASE_URL}}/airports?page=1&limit=1000&icaos=KHEF&metarss=true + url: {{BASE_URL}}/airports?page=1&limit=1000&icaos=KHEF,KJYO,KMRB,KOKV&metars=true body: none auth: none } @@ -13,6 +13,6 @@ get { params:query { page: 1 limit: 1000 - icaos: KHEF - metarss: true + icaos: KHEF,KJYO,KMRB,KOKV + metars: true }