79 lines
2 KiB
Rust
79 lines
2 KiB
Rust
use url::Url;
|
|
|
|
use super::DBOutPostgresAdapter;
|
|
use crate::auth::application::port::out::db::{
|
|
errors::OutDBPortResult, oauth_state_exists::OAuthStateExists,
|
|
};
|
|
|
|
#[async_trait::async_trait]
|
|
impl OAuthStateExists for DBOutPostgresAdapter {
|
|
async fn oauth_state_exists(
|
|
&self,
|
|
state: &str,
|
|
oauth_provider: &str,
|
|
redirect_uri: &Url,
|
|
) -> OutDBPortResult<bool> {
|
|
let res = sqlx::query!(
|
|
"SELECT EXISTS (
|
|
SELECT 1
|
|
FROM oauth_state
|
|
WHERE
|
|
state = $1
|
|
AND
|
|
oauth_provider = $2
|
|
AND
|
|
redirect_uri = $3
|
|
);",
|
|
state,
|
|
oauth_provider,
|
|
redirect_uri.as_str()
|
|
)
|
|
.fetch_one(&self.pool)
|
|
.await?;
|
|
if let Some(x) = res.exists {
|
|
Ok(x)
|
|
} else {
|
|
Ok(false)
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::auth::application::port::out::db::save_oauth_state::SaveOAuthState;
|
|
|
|
#[actix_rt::test]
|
|
async fn test_postgres_oauth_state_exists() {
|
|
let state = "oauthstateexists";
|
|
let oauth_provider = "oauthprovitestpostgres";
|
|
let redirect_uri = Url::parse("https://oauthprovitestpostgres").unwrap();
|
|
|
|
let settings = crate::settings::tests::get_settings().await;
|
|
|
|
let db = super::DBOutPostgresAdapter::new(
|
|
sqlx::postgres::PgPool::connect(&settings.database.url)
|
|
.await
|
|
.unwrap(),
|
|
);
|
|
|
|
// state doesn't exist
|
|
assert!(!db
|
|
.oauth_state_exists(state, oauth_provider, &redirect_uri)
|
|
.await
|
|
.unwrap());
|
|
|
|
db.save_oauth_state(state, oauth_provider, &redirect_uri)
|
|
.await
|
|
.unwrap();
|
|
|
|
// state exists
|
|
assert!(db
|
|
.oauth_state_exists(state, oauth_provider, &redirect_uri)
|
|
.await
|
|
.unwrap());
|
|
|
|
settings.drop_db().await;
|
|
}
|
|
}
|