use super::RefreshTokenStoreOperations;
use crate::biome::refresh_tokens::store::{
diesel::{models::RefreshToken, schema::refresh_tokens},
RefreshTokenError,
};
use diesel::{prelude::*, result::Error::NotFound};
pub(in crate::biome) trait RefreshTokenStoreFetchTokenOperation {
fn fetch_token(&self, user_id: &str) -> Result<String, RefreshTokenError>;
}
impl<'a, C> RefreshTokenStoreFetchTokenOperation 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 fetch_token(&self, user_id: &str) -> Result<String, RefreshTokenError> {
refresh_tokens::table
.select(refresh_tokens::all_columns)
.filter(refresh_tokens::user_id.eq(user_id))
.first::<RefreshToken>(self.conn)
.map(|t| t.token)
.map_err(|err| {
if err == NotFound {
RefreshTokenError::NotFoundError(format!(
"No refresh token for user {} found",
user_id
))
} else {
RefreshTokenError::OperationError {
context: format!("Failed to retrieve refresh token for user {}", user_id),
source: Box::new(err),
}
}
})
}
}