use diesel::prelude::*;
use crate::oauth::store::{
diesel::{models::OAuthInflightRequest, schema::oauth_inflight_request},
InflightOAuthRequestStoreError,
};
use super::InflightOAuthRequestOperations;
pub(in crate::oauth::store::diesel) trait InflightOAuthRequestStoreRemoveRequestOperation {
fn remove_request(
&self,
request_id: &str,
) -> Result<Option<OAuthInflightRequest>, InflightOAuthRequestStoreError>;
}
impl<'a, C> InflightOAuthRequestStoreRemoveRequestOperation
for InflightOAuthRequestOperations<'a, C>
where
C: diesel::Connection,
String: diesel::deserialize::FromSql<diesel::sql_types::Text, C::Backend>,
{
fn remove_request(
&self,
request_id: &str,
) -> Result<Option<OAuthInflightRequest>, InflightOAuthRequestStoreError> {
self.conn
.transaction::<Option<OAuthInflightRequest>, diesel::result::Error, _>(|| {
let request = oauth_inflight_request::table
.filter(oauth_inflight_request::id.eq(request_id))
.first::<OAuthInflightRequest>(self.conn)
.optional()?;
if request.is_some() {
diesel::delete(
oauth_inflight_request::table
.filter(oauth_inflight_request::id.eq(request_id)),
)
.execute(self.conn)?;
}
Ok(request)
})
.map_err(InflightOAuthRequestStoreError::from)
}
}