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 diesel::{dsl::delete, prelude::*};
pub(in crate::biome::user) trait UserStoreDeleteUserOperation {
fn delete_user(&self, user_id: &str) -> Result<(), UserStoreError>;
}
impl<'a, C> UserStoreDeleteUserOperation 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 delete_user(&self, user_id: &str) -> Result<(), UserStoreError> {
let user = splinter_user::table
.find(&user_id)
.first::<UserModel>(self.conn)
.map(Some)
.map_err(|err| UserStoreError::OperationError {
context: "Failed to fetch user".to_string(),
source: Box::new(err),
})?;
if user.is_none() {
return Err(UserStoreError::NotFoundError(format!(
"Failed to find user: {}",
&user_id
)));
}
delete(splinter_user::table.filter(splinter_user::id.eq(&user_id)))
.execute(self.conn)
.map(|_| ())
.map_err(|err| UserStoreError::OperationError {
context: "Failed to delete user".to_string(),
source: Box::new(err),
})?;
Ok(())
}
}