//! WHOIS/domain-expiry check storage. use super::{Result, SqlitePool, WhoisResult}; use tracing::instrument; #[derive(Debug, Clone, sqlx::FromRow, serde::Serialize)] pub struct WhoisCheckRow { pub id: i64, pub target: String, pub domain: String, pub registrar: Option, pub expiry_date: Option, pub days_remaining: Option, pub nameservers: Option, pub checked_at: String, pub error: Option, } #[instrument(skip_all)] pub async fn insert_whois_check(pool: &SqlitePool, result: &WhoisResult) -> Result { let nameservers = serde_json::to_string(&result.nameservers).unwrap_or_default(); let row = sqlx::query( "INSERT INTO whois_checks (target, domain, registrar, expiry_date, days_remaining, nameservers, checked_at, error) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", ) .bind(&result.target) .bind(&result.domain) .bind(&result.registrar) .bind(&result.expiry_date) .bind(result.days_remaining) .bind(&nameservers) .bind(&result.checked_at) .bind(&result.error) .execute(pool) .await?; Ok(row.last_insert_rowid()) } #[instrument(skip_all)] pub async fn get_latest_whois_check( pool: &SqlitePool, target: &str, ) -> Result> { Ok(sqlx::query_as::<_, WhoisCheckRow>( "SELECT id, target, domain, registrar, expiry_date, days_remaining, nameservers, checked_at, error FROM whois_checks WHERE target = ? ORDER BY id DESC LIMIT 1", ) .bind(target) .fetch_optional(pool) .await?) }