use crate::db::models::Command; use sqlx::SqlitePool; pub async fn list_all(pool: &SqlitePool) -> anyhow::Result> { let commands = sqlx::query_as::<_, Command>("SELECT * FROM commands ORDER BY received_at DESC") .fetch_all(pool) .await?; Ok(commands) } pub async fn list_by_status(pool: &SqlitePool, status: &str) -> anyhow::Result> { let commands = sqlx::query_as::<_, Command>( "SELECT * FROM commands WHERE status = ? ORDER BY received_at DESC", ) .bind(status) .fetch_all(pool) .await?; Ok(commands) } pub async fn find_by_id(pool: &SqlitePool, id: i64) -> anyhow::Result> { let command = sqlx::query_as::<_, Command>("SELECT * FROM commands WHERE id = ?") .bind(id) .fetch_optional(pool) .await?; Ok(command) } pub async fn insert(pool: &SqlitePool, command_json: &str, status: &str) -> anyhow::Result { let result = sqlx::query("INSERT INTO commands (command_json, status) VALUES (?, ?)") .bind(command_json) .bind(status) .execute(pool) .await?; Ok(result.last_insert_rowid()) } pub async fn update_status( pool: &SqlitePool, id: i64, status: &str, notes: Option<&str>, ) -> anyhow::Result<()> { sqlx::query( "UPDATE commands SET status = ?, processed_at = CURRENT_TIMESTAMP, notes = ? WHERE id = ?", ) .bind(status) .bind(notes) .bind(id) .execute(pool) .await?; Ok(()) } pub async fn delete_old(pool: &SqlitePool, days: i64) -> anyhow::Result { let result = sqlx::query( "DELETE FROM commands WHERE status IN ('verified', 'rejected') AND processed_at < datetime('now', '-' || ? || ' days')", ) .bind(days) .execute(pool) .await?; Ok(result.rows_affected()) } pub async fn clear_verified(pool: &SqlitePool) -> anyhow::Result<()> { sqlx::query("DELETE FROM commands WHERE status = 'verified'") .execute(pool) .await?; Ok(()) }