Adding latest_metars to airport queries

This commit is contained in:
2025-04-09 21:15:25 -04:00
parent 4aa3190783
commit d04f5d0414
5 changed files with 56 additions and 10 deletions

View File

@@ -160,7 +160,7 @@ impl From<AirportRow> for Airport {
}
impl Airport {
pub async fn select(icao: &str) -> Option<Self> {
pub async fn select(icao: &str, metar: bool) -> Option<Self> {
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<AirportRow> = match airport_result {
Ok(opt) => opt,
@@ -204,10 +218,19 @@ impl Airport {
}
};
let metar: Option<Metar> = 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<String> = 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<String, Metar> = 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);
}
}

View File

@@ -88,8 +88,16 @@ async fn get_airports(req: HttpRequest) -> HttpResponse {
}
#[get("/{icao}")]
async fn get_airport(icao: web::Path<String>) -> HttpResponse {
match Airport::select(&icao.into_inner()).await {
async fn get_airport(icao: web::Path<String>, req: HttpRequest) -> HttpResponse {
let metar = match web::Query::<AirportQuery>::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(),
}

View File

@@ -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();
}
}