diff --git a/rotom_core/src/repository/mod.rs b/rotom_core/src/repository/mod.rs index 46f31f8..6014f82 100644 --- a/rotom_core/src/repository/mod.rs +++ b/rotom_core/src/repository/mod.rs @@ -10,7 +10,7 @@ pub trait RepositoryProvider { where Self: 'a; - async fn get(&self) -> Result, Self::BackendError>; + async fn get(&self) -> Result, RepositoryError>; } pub trait Repository @@ -19,3 +19,6 @@ where { type BackendError: std::error::Error; } + +#[derive(Debug)] +pub struct RepositoryError(pub E); diff --git a/rotom_core/src/repository/user_repository.rs b/rotom_core/src/repository/user_repository.rs index 03df4f3..00f3597 100644 --- a/rotom_core/src/repository/user_repository.rs +++ b/rotom_core/src/repository/user_repository.rs @@ -1,14 +1,16 @@ +use super::RepositoryError; + #[async_trait::async_trait] pub trait UserRepository { type BackendError: std::error::Error; - async fn user(&mut self, id: i32) -> Result, Self::BackendError>; + async fn user(&mut self, id: i32) -> Result, RepositoryError>; - async fn insert_user(&mut self, new_user: NewUser) -> Result; + async fn insert_user(&mut self, new_user: NewUser) -> Result>; - async fn update_user(&mut self, user: User) -> Result, Self::BackendError>; + async fn update_user(&mut self, user: User) -> Result, RepositoryError>; - async fn remove_user(&mut self, id: i32) -> Result, Self::BackendError>; + async fn remove_user(&mut self, id: i32) -> Result, RepositoryError>; } pub struct User { diff --git a/rotom_database/src/mysql/repository/mod.rs b/rotom_database/src/mysql/repository/mod.rs index ad03523..fb9e5d7 100644 --- a/rotom_database/src/mysql/repository/mod.rs +++ b/rotom_database/src/mysql/repository/mod.rs @@ -2,6 +2,7 @@ use diesel_async::pooled_connection::bb8::Pool; use diesel_async::pooled_connection::bb8::PooledConnection; use diesel_async::AsyncMysqlConnection; use rotom_core::repository::Repository; +use rotom_core::repository::RepositoryError; use rotom_core::repository::RepositoryProvider; use crate::BackendError; @@ -38,7 +39,11 @@ impl RepositoryProvider for MysqlRepositoryProvider { type Repository<'a> = MysqlRepository<'a>; - async fn get(&self) -> Result, Self::BackendError> { - self.pool.get().await.map(MysqlRepository::new).map_err(BackendError::from) + async fn get(&self) -> Result, RepositoryError> { + self.pool + .get() + .await + .map(MysqlRepository::new) + .map_err(|err| RepositoryError(BackendError::from(err))) } } diff --git a/rotom_database/src/mysql/repository/user_repository.rs b/rotom_database/src/mysql/repository/user_repository.rs index 7093549..2887d59 100644 --- a/rotom_database/src/mysql/repository/user_repository.rs +++ b/rotom_database/src/mysql/repository/user_repository.rs @@ -5,6 +5,7 @@ use diesel_async::RunQueryDsl; use rotom_core::repository::user_repository::NewUser; use rotom_core::repository::user_repository::User; use rotom_core::repository::user_repository::UserRepository; +use rotom_core::repository::RepositoryError; use crate::mysql::schema::users; use crate::BackendError; @@ -16,16 +17,16 @@ use super::MysqlRepository; impl UserRepository for MysqlRepository<'_> { type BackendError = BackendError; - async fn user(&mut self, id: i32) -> Result, Self::BackendError> { + async fn user(&mut self, id: i32) -> Result, RepositoryError> { users::dsl::users.find(id) .first::(&mut self.conn) .await .optional() .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn insert_user(&mut self, new_user: NewUser) -> Result { + async fn insert_user(&mut self, new_user: NewUser) -> Result> { let model_new_user = ModelNewUser::from(new_user); self.conn @@ -43,10 +44,10 @@ impl UserRepository for MysqlRepository<'_> { }.scope_boxed()) .await .map(User::from) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn update_user(&mut self, user: User) -> Result, Self::BackendError> { + async fn update_user(&mut self, user: User) -> Result, RepositoryError> { let model_user = ModelUser::from(user); self.conn @@ -71,10 +72,10 @@ impl UserRepository for MysqlRepository<'_> { }.scope_boxed()) .await .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn remove_user(&mut self, id: i32) -> Result, Self::BackendError> { + async fn remove_user(&mut self, id: i32) -> Result, RepositoryError> { self.conn .transaction::<_, diesel::result::Error, _>(move |conn| async move { let option_removed = users::dsl::users.find(id) @@ -97,7 +98,7 @@ impl UserRepository for MysqlRepository<'_> { }.scope_boxed()) .await .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } } diff --git a/rotom_database/src/postgres/repository/mod.rs b/rotom_database/src/postgres/repository/mod.rs index 5447413..805c622 100644 --- a/rotom_database/src/postgres/repository/mod.rs +++ b/rotom_database/src/postgres/repository/mod.rs @@ -2,6 +2,7 @@ use diesel_async::pooled_connection::bb8::Pool; use diesel_async::pooled_connection::bb8::PooledConnection; use diesel_async::AsyncPgConnection; use rotom_core::repository::Repository; +use rotom_core::repository::RepositoryError; use rotom_core::repository::RepositoryProvider; use crate::BackendError; @@ -38,7 +39,11 @@ impl RepositoryProvider for PostgresRepositoryProvider { type Repository<'a> = PostgresRepository<'a>; - async fn get(&self) -> Result, Self::BackendError> { - self.pool.get().await.map(PostgresRepository::new).map_err(BackendError::from) + async fn get(&self) -> Result, RepositoryError> { + self.pool + .get() + .await + .map(PostgresRepository::new) + .map_err(|err| RepositoryError(BackendError::from(err))) } } diff --git a/rotom_database/src/postgres/repository/user_repository.rs b/rotom_database/src/postgres/repository/user_repository.rs index 99ccfc2..d92a3e9 100644 --- a/rotom_database/src/postgres/repository/user_repository.rs +++ b/rotom_database/src/postgres/repository/user_repository.rs @@ -5,6 +5,7 @@ use diesel_async::RunQueryDsl; use rotom_core::repository::user_repository::NewUser; use rotom_core::repository::user_repository::User; use rotom_core::repository::user_repository::UserRepository; +use rotom_core::repository::RepositoryError; use crate::postgres::schema::users; use crate::BackendError; @@ -16,16 +17,16 @@ use super::PostgresRepository; impl UserRepository for PostgresRepository<'_> { type BackendError = BackendError; - async fn user(&mut self, id: i32) -> Result, Self::BackendError> { + async fn user(&mut self, id: i32) -> Result, RepositoryError> { users::dsl::users.find(id) .first::(&mut self.conn) .await .optional() .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn insert_user(&mut self, new_user: NewUser) -> Result { + async fn insert_user(&mut self, new_user: NewUser) -> Result> { let model_new_user = ModelNewUser::from(new_user); self.conn @@ -38,10 +39,10 @@ impl UserRepository for PostgresRepository<'_> { }.scope_boxed()) .await .map(User::from) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn update_user(&mut self, user: User) -> Result, Self::BackendError> { + async fn update_user(&mut self, user: User) -> Result, RepositoryError> { let model_user = ModelUser::from(user); self.conn @@ -66,10 +67,10 @@ impl UserRepository for PostgresRepository<'_> { }.scope_boxed()) .await .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn remove_user(&mut self, id: i32) -> Result, Self::BackendError> { + async fn remove_user(&mut self, id: i32) -> Result, RepositoryError> { self.conn .transaction::<_, diesel::result::Error, _>(move |conn| async move { diesel::delete(users::dsl::users.find(id)) @@ -80,7 +81,7 @@ impl UserRepository for PostgresRepository<'_> { }.scope_boxed()) .await .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } } diff --git a/rotom_database/src/sqlite/repository/mod.rs b/rotom_database/src/sqlite/repository/mod.rs index a1eb278..df99f8e 100644 --- a/rotom_database/src/sqlite/repository/mod.rs +++ b/rotom_database/src/sqlite/repository/mod.rs @@ -3,6 +3,7 @@ use diesel_async::pooled_connection::bb8::Pool; use diesel_async::pooled_connection::bb8::PooledConnection; use diesel_async::sync_connection_wrapper::SyncConnectionWrapper; use rotom_core::repository::Repository; +use rotom_core::repository::RepositoryError; use rotom_core::repository::RepositoryProvider; use crate::BackendError; @@ -39,7 +40,11 @@ impl RepositoryProvider for SqliteRepositoryProvider { type Repository<'a> = SqliteRepository<'a>; - async fn get(&self) -> Result, Self::BackendError> { - self.pool.get().await.map(SqliteRepository::new).map_err(BackendError::from) + async fn get(&self) -> Result, RepositoryError> { + self.pool + .get() + .await + .map(SqliteRepository::new) + .map_err(|err| RepositoryError(BackendError::from(err))) } } diff --git a/rotom_database/src/sqlite/repository/user_repository.rs b/rotom_database/src/sqlite/repository/user_repository.rs index c7411e9..6462703 100644 --- a/rotom_database/src/sqlite/repository/user_repository.rs +++ b/rotom_database/src/sqlite/repository/user_repository.rs @@ -5,6 +5,7 @@ use diesel_async::RunQueryDsl; use rotom_core::repository::user_repository::NewUser; use rotom_core::repository::user_repository::User; use rotom_core::repository::user_repository::UserRepository; +use rotom_core::repository::RepositoryError; use crate::sqlite::schema::users; use crate::BackendError; @@ -16,16 +17,16 @@ use super::SqliteRepository; impl UserRepository for SqliteRepository<'_> { type BackendError = BackendError; - async fn user(&mut self, id: i32) -> Result, Self::BackendError> { + async fn user(&mut self, id: i32) -> Result, RepositoryError> { users::dsl::users.find(id) .first::(&mut self.conn) .await .optional() .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn insert_user(&mut self, new_user: NewUser) -> Result { + async fn insert_user(&mut self, new_user: NewUser) -> Result> { let model_new_user = ModelNewUser::from(new_user); self.conn @@ -38,10 +39,10 @@ impl UserRepository for SqliteRepository<'_> { }.scope_boxed()) .await .map(User::from) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn update_user(&mut self, user: User) -> Result, Self::BackendError> { + async fn update_user(&mut self, user: User) -> Result, RepositoryError> { let model_user = ModelUser::from(user); self.conn @@ -66,10 +67,10 @@ impl UserRepository for SqliteRepository<'_> { }.scope_boxed()) .await .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } - async fn remove_user(&mut self, id: i32) -> Result, Self::BackendError> { + async fn remove_user(&mut self, id: i32) -> Result, RepositoryError> { self.conn .transaction::<_, diesel::result::Error, _>(move |conn| async move { diesel::delete(users::dsl::users.find(id)) @@ -80,7 +81,7 @@ impl UserRepository for SqliteRepository<'_> { }.scope_boxed()) .await .map(|option| option.map(User::from)) - .map_err(BackendError::from) + .map_err(|err| RepositoryError(BackendError::from(err))) } }