ForgeFlux/src/auth/adapter/out/db/postgres/oauth_state_exists.rs

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;
}
}