use crate::error::ApiResult; use serde::Deserialize; use sqlx::{Pool, Postgres}; const TABLE_NAME: &str = "user_airport_favorites"; #[derive(Debug, Deserialize, sqlx::FromRow)] pub struct UserFavorite { pub username: String, pub icao: String, } impl UserFavorite { pub async fn select_all(pool: &Pool, username: &str) -> ApiResult> { let user_favorites: Vec = sqlx::query_as::<_, UserFavorite>(&format!( r#" SELECT * FROM {} WHERE username = $1 "#, TABLE_NAME )) .bind(username) .fetch_all(pool) .await?; let favorites = user_favorites.iter().map(|uf| uf.icao.clone()).collect(); Ok(favorites) } pub async fn insert(pool: &Pool, username: &str, icao: &str) -> ApiResult<()> { sqlx::query(&format!( r#" INSERT INTO {} ( username, icao ) VALUES ($1, $2) "#, TABLE_NAME )) .bind(username) .bind(icao) .execute(pool) .await?; Ok(()) } pub async fn delete(pool: &Pool, username: &str, icao: &str) -> ApiResult<()> { sqlx::query(&format!( r#" DELETE FROM {} WHERE username = $1 AND icao = $2 "#, TABLE_NAME )) .bind(username) .bind(icao) .execute(pool) .await?; Ok(()) } }