Adding latest_metars to airport queries
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user