use crate::errors::AppError;
use rusqlite::{params, Connection};
pub fn find_by_name_any_state(
conn: &Connection,
namespace: &str,
name: &str,
) -> Result<Option<(i64, bool)>, AppError> {
let mut stmt = conn.prepare_cached(
"SELECT id, (deleted_at IS NOT NULL) AS is_deleted
FROM memories WHERE namespace = ?1 AND name = ?2",
)?;
let result = stmt.query_row(params![namespace, name], |r| {
Ok((r.get::<_, i64>(0)?, r.get::<_, bool>(1)?))
});
match result {
Ok(row) => Ok(Some(row)),
Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None),
Err(e) => Err(AppError::Database(e)),
}
}
pub fn clear_deleted_at(conn: &Connection, memory_id: i64) -> Result<(), AppError> {
conn.execute(
"UPDATE memories SET deleted_at = NULL WHERE id = ?1",
params![memory_id],
)?;
Ok(())
}
pub fn soft_delete(conn: &Connection, namespace: &str, name: &str) -> Result<bool, AppError> {
let affected = conn.execute(
"UPDATE memories SET deleted_at = unixepoch() WHERE namespace=?1 AND name=?2 AND deleted_at IS NULL",
params![namespace, name],
)?;
Ok(affected == 1)
}
pub fn list_deleted_before(
conn: &Connection,
namespace: &str,
before_ts: i64,
) -> Result<Vec<i64>, AppError> {
let mut stmt = conn.prepare_cached(
"SELECT id FROM memories WHERE namespace = ?1 AND deleted_at IS NOT NULL AND deleted_at < ?2",
)?;
let ids = stmt
.query_map(params![namespace, before_ts], |r| r.get::<_, i64>(0))?
.collect::<Result<Vec<_>, _>>()?;
Ok(ids)
}