Adding latest_metars to airport queries
This commit is contained in:
@@ -160,7 +160,7 @@ impl From<AirportRow> for Airport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl 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 pool = db::pool();
|
||||||
|
|
||||||
let airport_fut = async {
|
let airport_fut = async {
|
||||||
@@ -170,11 +170,25 @@ impl Airport {
|
|||||||
.await
|
.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 runways_fut = Runway::select_all(icao);
|
||||||
let frequencies_fut = Frequency::select_all(icao);
|
let frequencies_fut = Frequency::select_all(icao);
|
||||||
|
|
||||||
let (airport_result, runways_result, frequencies_result) =
|
let (airport_result, runways_result, frequencies_result, metar_result) =
|
||||||
tokio::join!(airport_fut, runways_fut, frequencies_fut);
|
tokio::join!(airport_fut, runways_fut, frequencies_fut, metar_fut);
|
||||||
|
|
||||||
let airport_row: Option<AirportRow> = match airport_result {
|
let airport_row: Option<AirportRow> = match airport_result {
|
||||||
Ok(opt) => opt,
|
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| {
|
airport_row.map(|row| {
|
||||||
let mut airport: Airport = row.into();
|
let mut airport: Airport = row.into();
|
||||||
airport.runways = runways;
|
airport.runways = runways;
|
||||||
airport.frequencies = frequencies;
|
airport.frequencies = frequencies;
|
||||||
|
airport.latest_metar = metar;
|
||||||
airport
|
airport
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -262,10 +285,19 @@ impl Airport {
|
|||||||
if !airports.is_empty() {
|
if !airports.is_empty() {
|
||||||
let icaos: Vec<String> = airports.iter().map(|a| a.icao.clone()).collect();
|
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 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() {
|
for airport in airports.iter_mut() {
|
||||||
airport.runways = runway_map.remove(&airport.icao).unwrap_or_default();
|
airport.runways = runway_map.remove(&airport.icao).unwrap_or_default();
|
||||||
airport.frequencies = frequency_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}")]
|
#[get("/{icao}")]
|
||||||
async fn get_airport(icao: web::Path<String>) -> HttpResponse {
|
async fn get_airport(icao: web::Path<String>, req: HttpRequest) -> HttpResponse {
|
||||||
match Airport::select(&icao.into_inner()).await {
|
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),
|
Some(airport) => HttpResponse::Ok().json(airport),
|
||||||
None => HttpResponse::NotFound().finish(),
|
None => HttpResponse::NotFound().finish(),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -981,5 +981,7 @@ SLP125 P0003 60009 T00640036 10066 21012 58033 TSNO $".to_string();
|
|||||||
.to_string();
|
.to_string();
|
||||||
let metar = Metar::parse(&metar_string).unwrap();
|
let metar = Metar::parse(&metar_string).unwrap();
|
||||||
// dbg!(&metar);
|
// dbg!(&metar);
|
||||||
|
|
||||||
|
// metar_string = "KHEF 092356Z 13009KT 10SM CLR 08/M03 A3022 RMK AO2 SLP239 6//// T00831033 10133 20078 53002 PNO $".to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,11 @@ meta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get {
|
get {
|
||||||
url: {{BASE_URL}}/airports/KHEF
|
url: {{BASE_URL}}/airports/KHEF?metars=true
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: none
|
||||||
}
|
}
|
||||||
|
|
||||||
|
params:query {
|
||||||
|
metars: true
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ meta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get {
|
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
|
body: none
|
||||||
auth: none
|
auth: none
|
||||||
}
|
}
|
||||||
@@ -13,6 +13,6 @@ get {
|
|||||||
params:query {
|
params:query {
|
||||||
page: 1
|
page: 1
|
||||||
limit: 1000
|
limit: 1000
|
||||||
icaos: KHEF
|
icaos: KHEF,KJYO,KMRB,KOKV
|
||||||
metarss: true
|
metars: true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user