From 2ac1f2e29ec08c457781a7456cb30a80a2bdd1f4 Mon Sep 17 00:00:00 2001 From: Panagiotis Ganelis <50522617+PanGan21@users.noreply.github.com> Date: Mon, 3 Jul 2023 12:43:49 +0300 Subject: [PATCH] feat(db): implement `ConfigInterface` for `MockDb` (#1586) --- crates/router/src/db.rs | 2 + crates/router/src/db/configs.rs | 101 +++++++++++++++++++++------ crates/storage_models/src/configs.rs | 6 ++ 3 files changed, 89 insertions(+), 20 deletions(-) diff --git a/crates/router/src/db.rs b/crates/router/src/db.rs index 0694b5a302..0bc43e6d56 100644 --- a/crates/router/src/db.rs +++ b/crates/router/src/db.rs @@ -98,6 +98,7 @@ impl StorageInterface for Store {} #[derive(Clone)] pub struct MockDb { addresses: Arc>>, + configs: Arc>>, merchant_accounts: Arc>>, merchant_connector_accounts: Arc>>, payment_attempts: Arc>>, @@ -121,6 +122,7 @@ impl MockDb { pub async fn new(redis: &crate::configs::settings::Settings) -> Self { Self { addresses: Default::default(), + configs: Default::default(), merchant_accounts: Default::default(), merchant_connector_accounts: Default::default(), payment_attempts: Default::default(), diff --git a/crates/router/src/db/configs.rs b/crates/router/src/db/configs.rs index b169777370..95d249355d 100644 --- a/crates/router/src/db/configs.rs +++ b/crates/router/src/db/configs.rs @@ -1,4 +1,5 @@ use error_stack::IntoReport; +use storage_models::configs::ConfigUpdateInternal; use super::{cache, MockDb, Store}; use crate::{ @@ -113,47 +114,107 @@ impl ConfigInterface for Store { impl ConfigInterface for MockDb { async fn insert_config( &self, - _config: storage::ConfigNew, + config: storage::ConfigNew, ) -> CustomResult { - // [#172]: Implement function for `MockDb` - Err(errors::StorageError::MockDbError)? + let mut configs = self.configs.lock().await; + + let config_new = storage::Config { + #[allow(clippy::as_conversions)] + id: configs.len() as i32, + key: config.key, + config: config.config, + }; + configs.push(config_new.clone()); + Ok(config_new) } async fn find_config_by_key( &self, - _key: &str, + key: &str, ) -> CustomResult { - // [#172]: Implement function for `MockDb` - Err(errors::StorageError::MockDbError)? + let configs = self.configs.lock().await; + let config = configs.iter().find(|c| c.key == key).cloned(); + + config.ok_or_else(|| { + errors::StorageError::ValueNotFound("cannot find config".to_string()).into() + }) } async fn update_config_by_key( &self, - _key: &str, - _config_update: storage::ConfigUpdate, + key: &str, + config_update: storage::ConfigUpdate, ) -> CustomResult { - // [#172]: Implement function for `MockDb` - Err(errors::StorageError::MockDbError)? + let result = self + .configs + .lock() + .await + .iter_mut() + .find(|c| c.key == key) + .ok_or_else(|| { + errors::StorageError::ValueNotFound("cannot find config to update".to_string()) + .into() + }) + .map(|c| { + let config_updated = + ConfigUpdateInternal::from(config_update).create_config(c.clone()); + *c = config_updated.clone(); + config_updated + }); + + result } async fn update_config_cached( &self, - _key: &str, - _config_update: storage::ConfigUpdate, + key: &str, + config_update: storage::ConfigUpdate, ) -> CustomResult { - // [#172]: Implement function for `MockDb` - Err(errors::StorageError::MockDbError)? + let result = self + .configs + .lock() + .await + .iter_mut() + .find(|c| c.key == key) + .ok_or_else(|| { + errors::StorageError::ValueNotFound("cannot find config to update".to_string()) + .into() + }) + .map(|c| { + let config_updated = + ConfigUpdateInternal::from(config_update).create_config(c.clone()); + *c = config_updated.clone(); + config_updated + }); + + result } - async fn delete_config_by_key(&self, _key: &str) -> CustomResult { - // [#172]: Implement function for `MockDb` - Err(errors::StorageError::MockDbError)? + async fn delete_config_by_key(&self, key: &str) -> CustomResult { + let mut configs = self.configs.lock().await; + let result = configs + .iter() + .position(|c| c.key == key) + .map(|index| { + configs.remove(index); + true + }) + .ok_or_else(|| { + errors::StorageError::ValueNotFound("cannot find config to delete".to_string()) + .into() + }); + + result } async fn find_config_by_key_cached( &self, - _key: &str, + key: &str, ) -> CustomResult { - // [#172]: Implement function for `MockDb` - Err(errors::StorageError::MockDbError)? + let configs = self.configs.lock().await; + let config = configs.iter().find(|c| c.key == key).cloned(); + + config.ok_or_else(|| { + errors::StorageError::ValueNotFound("cannot find config".to_string()).into() + }) } } diff --git a/crates/storage_models/src/configs.rs b/crates/storage_models/src/configs.rs index f598866264..81322ebac3 100644 --- a/crates/storage_models/src/configs.rs +++ b/crates/storage_models/src/configs.rs @@ -34,6 +34,12 @@ pub struct ConfigUpdateInternal { config: Option, } +impl ConfigUpdateInternal { + pub fn create_config(self, source: Config) -> Config { + Config { ..source } + } +} + impl From for ConfigUpdateInternal { fn from(config_update: ConfigUpdate) -> Self { match config_update {