anvilsign in

collin/anvil

1//! Admin dashboard cache storage (disk usage, etc.)
2
3use toasty::create;
4
5use crate::{
6 error::Result,
7 models::AdminCache,
8};
9
10/// Store or update a cached value by key.
11pub async fn upsert(db: &toasty::Db, key: &str, value: &str) -> Result<()> {
12 let mut conn = db.clone();
13
14 // Try to find existing entry
15 let existing = AdminCache::filter(AdminCache::fields().key().eq(key))
16 .first()
17 .exec(&mut conn)
18 .await?;
19
20 let now = std::time::SystemTime::now()
21 .duration_since(std::time::UNIX_EPOCH)
22 .unwrap_or_default()
23 .as_secs() as i64;
24
25 if let Some(mut cache) = existing {
26 let mut conn = db.clone();
27 cache
28 .update()
29 .value(value)
30 .computed_at(now)
31 .exec(&mut conn)
32 .await?;
33 } else {
34 let mut conn = db.clone();
35 create!(AdminCache {
36 key: key.to_string(),
37 value: value.to_string(),
38 computed_at: now,
39 })
40 .exec(&mut conn)
41 .await?;
42 }
43
44 Ok(())
45}
46
47/// Retrieve a cached value by key.
48pub async fn get(db: &toasty::Db, key: &str) -> Result<Option<AdminCache>> {
49 let mut conn = db.clone();
50 let entry = AdminCache::filter(AdminCache::fields().key().eq(key))
51 .first()
52 .exec(&mut conn)
53 .await?;
54 Ok(entry)
55}