use sqlx::SqlitePool;
use crate::device::storage::sql_common::{SqlDeviceStoreError, SweepCutoffs};
use crate::device::store::SweepCounts;
pub(super) async fn run(
pool: &SqlitePool,
tenant: &str,
cutoffs: &SweepCutoffs,
) -> Result<SweepCounts, SqlDeviceStoreError> {
let trusted_demoted = sqlx::query(
"UPDATE devices SET trust_level = 'Seen', demoted_at = ?3 \
WHERE tenant_id = ?1 \
AND trust_level = 'Trusted' \
AND last_seen_at < ?2",
)
.bind(tenant)
.bind(cutoffs.trusted)
.bind(cutoffs.now)
.execute(pool)
.await?
.rows_affected();
let seen_demoted = sqlx::query(
"UPDATE devices SET trust_level = 'Revoked', revoked_at = ?3, demoted_at = NULL \
WHERE tenant_id = ?1 \
AND trust_level = 'Seen' \
AND last_seen_at < ?2 \
AND (demoted_at IS NULL OR demoted_at < ?2)",
)
.bind(tenant)
.bind(cutoffs.seen)
.bind(cutoffs.now)
.execute(pool)
.await?
.rows_affected();
let purged = sqlx::query(
"DELETE FROM devices \
WHERE tenant_id = ?1 \
AND trust_level = 'Revoked' \
AND revoked_at IS NOT NULL \
AND revoked_at < ?2",
)
.bind(tenant)
.bind(cutoffs.grace)
.execute(pool)
.await?
.rows_affected();
Ok(SweepCounts {
trusted_to_seen: trusted_demoted,
seen_to_revoked: seen_demoted,
revoked_purged: purged,
})
}