use std::time::Duration; use log::info; use revolt_database::Database; use revolt_files::delete_from_s3; use revolt_result::Result; use tokio::time::sleep; pub async fn task(db: Database) -> Result<()> { loop { let files = db.fetch_deleted_attachments().await?; for file in files { let count = db .count_file_hash_references(file.hash.as_ref().expect("no `hash` present")) .await?; // No other files reference this file on disk anymore if count <= 1 { let file_hash = db .fetch_attachment_hash(file.hash.as_ref().expect("no `hash` present")) .await?; // Delete from S3 delete_from_s3(&file_hash.bucket_id, &file_hash.path).await?; // Delete the hash db.delete_attachment_hash(&file_hash.id).await?; info!("Deleted file hash {}", file_hash.id); } // Delete the file db.delete_attachment(&file.id).await?; info!("Deleted file {}", file.id); } sleep(Duration::from_secs(60)).await; } }