about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/database/mod.rs18
-rw-r--r--src/database/redis/mod.rs10
2 files changed, 28 insertions, 0 deletions
diff --git a/src/database/mod.rs b/src/database/mod.rs
index 943a1ad..98c2cae 100644
--- a/src/database/mod.rs
+++ b/src/database/mod.rs
@@ -160,6 +160,12 @@ pub trait Storage: Clone + Send + Sync {
 
     /// Deletes a post from the database irreversibly. 'nuff said. Must be idempotent.
     async fn delete_post<'a>(&self, url: &'a str) -> Result<()>;
+
+    /// Gets a setting from the setting store and passes the result.
+    async fn get_setting<'a>(&self, setting: &'a str, user: &'a str) -> Result<String>;
+
+    /// Commits a setting to the setting store.
+    async fn set_setting<'a>(&self, setting: &'a str, user: &'a str, value: &'a str) -> Result<()>;
 }
 
 #[cfg(test)]
@@ -220,6 +226,11 @@ mod tests {
         assert_eq!(chans[0], MicropubChannel { uid: "https://fireburn.ru/feeds/main".to_string(), name: "Main Page".to_string() });
     }
 
+    async fn test_backend_settings<Backend: Storage>(backend: Backend) {
+        backend.set_setting("site_name", "https://fireburn.ru/", "Vika's Hideout").await.unwrap();
+        assert_eq!(backend.get_setting("site_name", "https://fireburn.ru/").await.unwrap(), "Vika's Hideout");
+    }
+
     #[async_std::test]
     async fn test_redis_storage_basic_operations() {
         let redis_instance = get_redis_instance().await;
@@ -232,4 +243,11 @@ mod tests {
         let backend = super::RedisStorage::new(redis_instance.uri().to_string()).await.unwrap();
         test_backend_get_channel_list(backend).await;
     }
+
+    #[async_std::test]
+    async fn test_redis_settings() {
+        let redis_instance = get_redis_instance().await;
+        let backend = super::RedisStorage::new(redis_instance.uri().to_string()).await.unwrap();
+        test_backend_settings(backend).await;
+    }
 }
diff --git a/src/database/redis/mod.rs b/src/database/redis/mod.rs
index 4ab4ce0..352cece 100644
--- a/src/database/redis/mod.rs
+++ b/src/database/redis/mod.rs
@@ -82,6 +82,16 @@ fn filter_post(mut post: serde_json::Value, user: &'_ Option<String>) -> Option<
 
 #[async_trait]
 impl Storage for RedisStorage {
+    async fn get_setting<'a>(&self, setting: &'a str, user: &'a str) -> Result<String> {
+        let mut conn = self.redis.get().await?;
+        Ok(conn.hget::<String, &str, String>(format!("settings_{}", user), setting).await?)
+    }
+
+    async fn set_setting<'a>(&self, setting: &'a str, user: &'a str, value: &'a str) -> Result<()> {
+        let mut conn = self.redis.get().await?;
+        Ok(conn.hset::<String, &str, &str, ()>(format!("settings_{}", user), setting, value).await?)
+    }
+
     async fn delete_post<'a>(&self, url: &'a str) -> Result<()> {
         let mut conn = self.redis.get().await?;
         Ok(conn.hdel::<&str, &str, ()>("posts", url).await?)