implement cache/clean api

This commit is contained in:
postscriptum 2026-03-23 08:47:47 +02:00
parent 0603fdf4a6
commit 461f838cc0
4 changed files with 35 additions and 3 deletions

View file

@ -90,4 +90,9 @@ impl List {
self.cache.block(rule).await?;
Ok(self.index.write().await.remove(&Item::from_line(rule)))
}
/// Privately clean `--cache` file collected, return deleted rules
/// * we can implement `self.index` update at this step @TODO
pub async fn cache_clean(&self) -> Result<Option<Vec<String>>> {
self.cache.clean().await
}
}

View file

@ -49,6 +49,22 @@ impl Cache {
}
Ok(())
}
/// Clean `--cache` file collected, return deleted rules
pub async fn clean(&self) -> Result<Option<Vec<String>>> {
match self.0 {
Some(ref p) => {
init_file(p).await?;
let mut rules = Vec::new();
let lines = fs::read_to_string(p).await?;
for line in lines.lines() {
rules.push(line.into());
}
fs::write(p, "").await?;
Ok(Some(rules))
}
None => Ok(None),
}
}
}
/// Make sure that cache file is always exist (e.g. user may remove it when the daemon is running)

View file

@ -56,6 +56,16 @@ async fn api_block(
})?))
}
#[rocket::get("/api/cache/clean")]
async fn api_cache_clean(list: &State<Arc<List>>) -> Result<Json<Option<Vec<String>>>, Status> {
let result = list.cache_clean().await;
info!("Clean cache file: {result:?}");
Ok(Json(result.map_err(|e| {
error!("Could not handle cache clean request: `{e}`");
Status::InternalServerError
})?))
}
#[rocket::launch]
async fn rocket() -> _ {
env_logger::init();
@ -91,7 +101,7 @@ async fn rocket() -> _ {
.manage(Instant::now())
.mount(
"/",
rocket::routes![index, api_totals, api_allow, api_block],
rocket::routes![index, api_totals, api_allow, api_block, api_cache_clean],
)
}