Working on queries to get latest metar airports first

This commit is contained in:
2025-04-15 22:48:05 -04:00
parent d81f7bcedb
commit f5446ac0eb
8 changed files with 209 additions and 86 deletions

View File

@@ -1,5 +1,6 @@
use std::collections::HashMap;
use std::str::FromStr;
use chrono::{DateTime, Utc};
use futures_util::try_join;
use reqwest::Client;
use serde::{Deserialize, Serialize};
@@ -121,6 +122,7 @@ struct AirportRow {
pub has_tower: Option<bool>,
pub has_beacon: Option<bool>,
pub public: bool,
pub metar_observation_time: Option<DateTime<Utc>>,
}
#[derive(Debug, Deserialize)]
@@ -141,6 +143,7 @@ pub struct UpdateAirport {
pub runways: Option<Vec<UpdateRunway>>,
pub frequencies: Option<Vec<UpdateFrequency>>,
pub public: Option<bool>,
pub latest_metar_observation: Option<DateTime<Utc>>,
}
impl Into<AirportRow> for Airport {
@@ -160,6 +163,10 @@ impl Into<AirportRow> for Airport {
has_tower: self.has_tower,
has_beacon: self.has_beacon,
public: self.public,
metar_observation_time: match self.latest_metar {
Some(m) => Some(m.observation_time),
None => None,
},
}
}
}
@@ -303,7 +310,8 @@ impl Airport {
Self::push_condition_bounds(&mut builder, &mut has_where, &query.bounds)?;
// Order by AircraftCategory
builder.push(" ORDER BY CASE category ");
builder.push(" ORDER BY (metar_observation_time IS NULL), ");
builder.push(" CASE category ");
builder.push(" WHEN 'large_airport' THEN 1 ");
builder.push(" WHEN 'medium_airport' THEN 2 ");
builder.push(" WHEN 'small_airport' THEN 3 ");
@@ -516,7 +524,20 @@ impl Airport {
}
// TODO
pub async fn update(_icao: &str, _airport: &UpdateAirport) -> ApiResult<()> {
pub async fn update(icao: &str, airport: &UpdateAirport) -> ApiResult<()> {
let pool = db::pool();
let mut query_builder: QueryBuilder<Postgres> =
QueryBuilder::new(format!("UPDATE {} SET ", TABLE_NAME));
if let Some(latest_metar_observation) = airport.latest_metar_observation {
query_builder.push("metar_observation_time = ");
query_builder.push_bind(latest_metar_observation);
}
query_builder.push(" WHERE icao = ").push_bind(icao);
let query = query_builder.build();
query.execute(pool).await?;
Ok(())
}