ForgeFlux/src/forge/auth/adapter/input/web/login/adapter.rs
2024-05-05 22:28:40 +05:30

56 lines
2.1 KiB
Rust

use std::sync::Arc;
use actix_web::{http::header, HttpResponse};
use url::Url;
use crate::forge::auth::application::port::input::ui::{
errors::*, login::RequestAuthorizationInterface,
};
use crate::forge::auth::application::port::out::db::save_oauth_state::SaveOAuthState;
use crate::forge::auth::application::port::out::forge::oauth_auth_req_uri::OAuthAuthReqUri;
use crate::forge::auth::application::services::request_authorization::{
command::RequestAuthorizationCommand, service::RequestAuthorizationService,
RequestAuthorizationUserCase,
};
//use crate::forge::auth::application::services::request_authorization::command::RequestAuthorizationCommand;
pub struct RequestAuthorizationHandler {
save_oauth_state_adapter: Arc<dyn SaveOAuthState>,
oauth_auth_req_uri_adapter: Arc<dyn OAuthAuthReqUri>,
process_authorization_response_redirect_uri: Url,
}
impl RequestAuthorizationHandler {
pub fn new(
save_oauth_state_adapter: Arc<dyn SaveOAuthState>,
oauth_auth_req_uri_adapter: Arc<dyn OAuthAuthReqUri>,
process_authorization_response_redirect_uri: Url,
) -> Self {
Self {
save_oauth_state_adapter,
oauth_auth_req_uri_adapter,
process_authorization_response_redirect_uri,
}
}
}
#[async_trait::async_trait]
impl RequestAuthorizationInterface for RequestAuthorizationHandler {
#[tracing::instrument(name = "web adapter request_oauth_authorization", skip(self))]
async fn request_oauth_authorization(&self, forge_name: String) -> InUIResult<HttpResponse> {
let service = RequestAuthorizationService::new(
self.save_oauth_state_adapter.clone(),
self.oauth_auth_req_uri_adapter.clone(),
self.process_authorization_response_redirect_uri.clone(),
);
log::info!("service found");
let cmd = RequestAuthorizationCommand::new_command(forge_name)?;
let auth_page = service.request_authorization(cmd).await?;
Ok(HttpResponse::Found()
.insert_header((header::LOCATION, auth_page.as_str()))
.finish())
}
}