use super::UserStoreOperations;
use crate::biome::user::store::diesel::models::UserModel;
use crate::biome::user::store::diesel::schema::splinter_user;
use crate::biome::user::store::error::UserStoreError;
use crate::biome::user::store::SplinterUser;
use diesel::{prelude::*, result::Error::NotFound};
pub(in crate::biome::user) trait UserStoreFetchUserOperation {
fn fetch_user(&self, user_id: &str) -> Result<SplinterUser, UserStoreError>;
}
impl<'a, C> UserStoreFetchUserOperation for UserStoreOperations<'a, C>
where
C: diesel::Connection,
<C as diesel::Connection>::Backend: diesel::backend::SupportsDefaultKeyword,
<C as diesel::Connection>::Backend: 'static,
String: diesel::deserialize::FromSql<diesel::sql_types::Text, C::Backend>,
{
fn fetch_user(&self, user_id: &str) -> Result<SplinterUser, UserStoreError> {
let user = splinter_user::table
.find(user_id)
.first::<UserModel>(self.conn)
.map(Some)
.or_else(|err| if err == NotFound { Ok(None) } else { Err(err) })
.map_err(|err| UserStoreError::OperationError {
context: "Failed to fetch user".to_string(),
source: Box::new(err),
})?
.ok_or_else(|| {
UserStoreError::NotFoundError(format!("Failed to find user: {}", user_id))
})?;
Ok(SplinterUser::from(user))
}
}