From 37e03007f098ce1d52773bd33816d4468bcbe303 Mon Sep 17 00:00:00 2001
From: naskya <m@naskya.net>
Date: Sat, 4 May 2024 13:14:01 +0900
Subject: [PATCH] refactor (backend-rs): misc/redis_cache -> database/cache

---
 .../redis_cache.rs => database/cache.rs}      | 32 +++++++++----------
 packages/backend-rs/src/database/mod.rs       |  1 +
 .../backend-rs/src/misc/get_image_size.rs     | 28 ++++++++--------
 packages/backend-rs/src/misc/mod.rs           |  1 -
 4 files changed, 30 insertions(+), 32 deletions(-)
 rename packages/backend-rs/src/{misc/redis_cache.rs => database/cache.rs} (68%)

diff --git a/packages/backend-rs/src/misc/redis_cache.rs b/packages/backend-rs/src/database/cache.rs
similarity index 68%
rename from packages/backend-rs/src/misc/redis_cache.rs
rename to packages/backend-rs/src/database/cache.rs
index 81ac840b8d..aaf89bde86 100644
--- a/packages/backend-rs/src/misc/redis_cache.rs
+++ b/packages/backend-rs/src/database/cache.rs
@@ -3,7 +3,7 @@ use redis::{Commands, RedisError};
 use serde::{Deserialize, Serialize};
 
 #[derive(thiserror::Error, Debug)]
-pub enum CacheError {
+pub enum Error {
     #[error("Redis error: {0}")]
     RedisError(#[from] RedisError),
     #[error("Data serialization error: {0}")]
@@ -16,11 +16,11 @@ fn prefix_key(key: &str) -> String {
     redis_key(format!("cache:{}", key))
 }
 
-pub fn set_cache<V: for<'a> Deserialize<'a> + Serialize>(
+pub fn set<V: for<'a> Deserialize<'a> + Serialize>(
     key: &str,
     value: &V,
     expire_seconds: u64,
-) -> Result<(), CacheError> {
+) -> Result<(), Error> {
     redis_conn()?.set_ex(
         prefix_key(key),
         rmp_serde::encode::to_vec(&value)?,
@@ -29,9 +29,7 @@ pub fn set_cache<V: for<'a> Deserialize<'a> + Serialize>(
     Ok(())
 }
 
-pub fn get_cache<V: for<'a> Deserialize<'a> + Serialize>(
-    key: &str,
-) -> Result<Option<V>, CacheError> {
+pub fn get<V: for<'a> Deserialize<'a> + Serialize>(key: &str) -> Result<Option<V>, Error> {
     let serialized_value: Option<Vec<u8>> = redis_conn()?.get(prefix_key(key))?;
     Ok(match serialized_value {
         Some(v) => Some(rmp_serde::from_slice::<V>(v.as_ref())?),
@@ -39,13 +37,13 @@ pub fn get_cache<V: for<'a> Deserialize<'a> + Serialize>(
     })
 }
 
-pub fn delete_cache(key: &str) -> Result<(), CacheError> {
+pub fn delete(key: &str) -> Result<(), Error> {
     Ok(redis_conn()?.del(prefix_key(key))?)
 }
 
 #[cfg(test)]
 mod unit_test {
-    use super::{get_cache, set_cache};
+    use super::{get, set};
     use pretty_assertions::assert_eq;
 
     #[test]
@@ -68,13 +66,13 @@ mod unit_test {
             kind: "prime number".to_string(),
         };
 
-        set_cache(key_1, &value_1, 1).unwrap();
-        set_cache(key_2, &value_2, 1).unwrap();
-        set_cache(key_3, &value_3, 1).unwrap();
+        set(key_1, &value_1, 1).unwrap();
+        set(key_2, &value_2, 1).unwrap();
+        set(key_3, &value_3, 1).unwrap();
 
-        let cached_value_1: Vec<i32> = get_cache(key_1).unwrap().unwrap();
-        let cached_value_2: String = get_cache(key_2).unwrap().unwrap();
-        let cached_value_3: Data = get_cache(key_3).unwrap().unwrap();
+        let cached_value_1: Vec<i32> = get(key_1).unwrap().unwrap();
+        let cached_value_2: String = get(key_2).unwrap().unwrap();
+        let cached_value_3: Data = get(key_3).unwrap().unwrap();
 
         assert_eq!(value_1, cached_value_1);
         assert_eq!(value_2, cached_value_2);
@@ -83,9 +81,9 @@ mod unit_test {
         // wait for the cache to expire
         std::thread::sleep(std::time::Duration::from_millis(1100));
 
-        let expired_value_1: Option<Vec<i32>> = get_cache(key_1).unwrap();
-        let expired_value_2: Option<Vec<i32>> = get_cache(key_2).unwrap();
-        let expired_value_3: Option<Vec<i32>> = get_cache(key_3).unwrap();
+        let expired_value_1: Option<Vec<i32>> = get(key_1).unwrap();
+        let expired_value_2: Option<Vec<i32>> = get(key_2).unwrap();
+        let expired_value_3: Option<Vec<i32>> = get(key_3).unwrap();
 
         assert!(expired_value_1.is_none());
         assert!(expired_value_2.is_none());
diff --git a/packages/backend-rs/src/database/mod.rs b/packages/backend-rs/src/database/mod.rs
index 7a6277068b..f657a540af 100644
--- a/packages/backend-rs/src/database/mod.rs
+++ b/packages/backend-rs/src/database/mod.rs
@@ -2,5 +2,6 @@ pub use postgresql::db_conn;
 pub use redis::key as redis_key;
 pub use redis::redis_conn;
 
+pub mod cache;
 pub mod postgresql;
 pub mod redis;
diff --git a/packages/backend-rs/src/misc/get_image_size.rs b/packages/backend-rs/src/misc/get_image_size.rs
index 9c55846424..ef8b7db79f 100644
--- a/packages/backend-rs/src/misc/get_image_size.rs
+++ b/packages/backend-rs/src/misc/get_image_size.rs
@@ -1,4 +1,4 @@
-use crate::misc::redis_cache::{get_cache, set_cache, CacheError};
+use crate::database::cache;
 use crate::util::http_client;
 use image::{io::Reader, ImageError, ImageFormat};
 use nom_exif::{parse_jpeg_exif, EntryValue, ExifTag};
@@ -8,7 +8,7 @@ use tokio::sync::Mutex;
 #[derive(thiserror::Error, Debug)]
 pub enum Error {
     #[error("Redis cache error: {0}")]
-    CacheErr(#[from] CacheError),
+    CacheErr(#[from] cache::Error),
     #[error("Reqwest error: {0}")]
     ReqwestErr(#[from] reqwest::Error),
     #[error("Image decoding error: {0}")]
@@ -51,10 +51,10 @@ pub async fn get_image_size_from_url(url: &str) -> Result<ImageSize, Error> {
         let _ = MTX_GUARD.lock().await;
 
         let key = format!("fetchImage:{}", url);
-        attempted = get_cache::<bool>(&key)?.is_some();
+        attempted = cache::get::<bool>(&key)?.is_some();
 
         if !attempted {
-            set_cache(&key, &true, 10 * 60)?;
+            cache::set(&key, &true, 10 * 60)?;
         }
     }
 
@@ -109,7 +109,7 @@ pub async fn get_image_size_from_url(url: &str) -> Result<ImageSize, Error> {
 #[cfg(test)]
 mod unit_test {
     use super::{get_image_size_from_url, ImageSize};
-    use crate::misc::redis_cache::delete_cache;
+    use crate::database::cache;
     use pretty_assertions::assert_eq;
 
     #[tokio::test]
@@ -126,15 +126,15 @@ mod unit_test {
 
         // Delete caches in case you run this test multiple times
         // (should be disabled in CI tasks)
-        delete_cache(&format!("fetchImage:{}", png_url_1)).unwrap();
-        delete_cache(&format!("fetchImage:{}", png_url_2)).unwrap();
-        delete_cache(&format!("fetchImage:{}", png_url_3)).unwrap();
-        delete_cache(&format!("fetchImage:{}", rotated_jpeg_url)).unwrap();
-        delete_cache(&format!("fetchImage:{}", webp_url_1)).unwrap();
-        delete_cache(&format!("fetchImage:{}", webp_url_2)).unwrap();
-        delete_cache(&format!("fetchImage:{}", ico_url)).unwrap();
-        delete_cache(&format!("fetchImage:{}", gif_url)).unwrap();
-        delete_cache(&format!("fetchImage:{}", mp3_url)).unwrap();
+        cache::delete(&format!("fetchImage:{}", png_url_1)).unwrap();
+        cache::delete(&format!("fetchImage:{}", png_url_2)).unwrap();
+        cache::delete(&format!("fetchImage:{}", png_url_3)).unwrap();
+        cache::delete(&format!("fetchImage:{}", rotated_jpeg_url)).unwrap();
+        cache::delete(&format!("fetchImage:{}", webp_url_1)).unwrap();
+        cache::delete(&format!("fetchImage:{}", webp_url_2)).unwrap();
+        cache::delete(&format!("fetchImage:{}", ico_url)).unwrap();
+        cache::delete(&format!("fetchImage:{}", gif_url)).unwrap();
+        cache::delete(&format!("fetchImage:{}", mp3_url)).unwrap();
 
         let png_size_1 = ImageSize {
             width: 1024,
diff --git a/packages/backend-rs/src/misc/mod.rs b/packages/backend-rs/src/misc/mod.rs
index 0ba15dc8e4..7e8301ddeb 100644
--- a/packages/backend-rs/src/misc/mod.rs
+++ b/packages/backend-rs/src/misc/mod.rs
@@ -13,5 +13,4 @@ pub mod meta;
 pub mod nyaify;
 pub mod password;
 pub mod reaction;
-pub mod redis_cache;
 pub mod remove_old_attestation_challenges;