use super::RefreshTokenStoreOperations;
use crate::biome::refresh_tokens::store::{diesel::schema::refresh_tokens, RefreshTokenError};
use diesel::{dsl::delete, prelude::*, result::Error::NotFound};
pub(in crate::biome) trait RefreshTokenStoreRemoveTokenOperation {
fn remove_token(&self, user_id: &str) -> Result<(), RefreshTokenError>;
}
impl<'a, C> RefreshTokenStoreRemoveTokenOperation for RefreshTokenStoreOperations<'a, C>
where
C: diesel::Connection,
i64: diesel::deserialize::FromSql<diesel::sql_types::BigInt, C::Backend>,
String: diesel::deserialize::FromSql<diesel::sql_types::Text, C::Backend>,
{
fn remove_token(&self, user_id: &str) -> Result<(), RefreshTokenError> {
delete(refresh_tokens::table)
.filter(refresh_tokens::user_id.eq(&user_id))
.execute(self.conn)
.map_err(|err| {
if err == NotFound {
RefreshTokenError::NotFoundError(format!(
"No refresh token for user {} found",
user_id
))
} else {
RefreshTokenError::OperationError {
context: format!("Failed to delete token for user {}", user_id),
source: Box::new(err),
}
}
})?;
Ok(())
}
}