use diesel::{dsl::delete, prelude::*};
use crate::biome::oauth::store::{
diesel::{models::OAuthUserSessionModel, schema::oauth_user_sessions},
OAuthUserSessionStoreError,
};
use crate::error::InvalidStateError;
use super::OAuthUserSessionStoreOperations;
pub trait OAuthUserSessionStoreRemoveSession {
fn remove_session(&self, splinter_access_token: &str)
-> Result<(), OAuthUserSessionStoreError>;
}
impl<'a, C> OAuthUserSessionStoreRemoveSession for OAuthUserSessionStoreOperations<'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_session(
&self,
splinter_access_token: &str,
) -> Result<(), OAuthUserSessionStoreError> {
self.conn.transaction::<_, _, _>(|| {
match oauth_user_sessions::table
.find(splinter_access_token)
.first::<OAuthUserSessionModel>(self.conn)
.optional()?
{
Some(_) => delete(oauth_user_sessions::table.find(splinter_access_token))
.execute(self.conn)
.map(|_| ())
.map_err(OAuthUserSessionStoreError::from),
None => Err(OAuthUserSessionStoreError::InvalidState(
InvalidStateError::with_message(
"An OAuth user session for the given Splinter access token does not exist"
.to_string(),
),
)),
}
})
}
}