forked from jmug/stoatchat
40 lines
1.2 KiB
Rust
40 lines
1.2 KiB
Rust
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;
|
|
}
|
|
}
|