66 lines
2.3 KiB
Rust
66 lines
2.3 KiB
Rust
use std::sync::Arc;
|
|
|
|
use actix_web::{get, http::header, post, web, HttpResponse};
|
|
use url::Url;
|
|
|
|
use crate::auth::adapter::input::web::routes::RoutesRepository;
|
|
use crate::auth::adapter::out::forge::SupportedForges;
|
|
use crate::auth::application::port::input::ui::{
|
|
errors::*, login::RequestAuthorizationInterface,
|
|
};
|
|
use crate::auth::application::port::out::db::save_oauth_state::SaveOAuthState;
|
|
|
|
use super::template::{LoginCtxFactory, LoginPageInterface};
|
|
use crate::ForgeRepository;
|
|
|
|
#[get("/login")]
|
|
#[tracing::instrument(name = "login page handler", skip(forges, routes, template))]
|
|
async fn login_page(
|
|
forges: web::Data<Arc<ForgeRepository>>,
|
|
routes: web::Data<Arc<RoutesRepository>>,
|
|
template: web::Data<Arc<dyn LoginPageInterface>>,
|
|
) -> InUIResult<HttpResponse> {
|
|
let template_ctx = LoginCtxFactory::get_ctx(forges.get_supported_forges(), &routes);
|
|
let page = template.get_login_page(template_ctx).unwrap();
|
|
Ok(HttpResponse::Ok()
|
|
.append_header((header::CONTENT_TYPE, "text/html; charset=UTF-8"))
|
|
.body(page))
|
|
}
|
|
|
|
#[post("/oauth/forgejo/login")]
|
|
async fn request_oauth_authorization_forgejo(
|
|
forge_name: web::Path<String>,
|
|
forges: web::Data<Arc<ForgeRepository>>,
|
|
save_oauth_state_adapter: web::Data<Arc<dyn SaveOAuthState>>,
|
|
routes: web::Data<Arc<RoutesRepository>>,
|
|
settings: web::Data<crate::settings::Settings>,
|
|
) -> InUIResult<HttpResponse> {
|
|
let oauth_auth_req_uri_adapter = &forges
|
|
.get_forge(&SupportedForges::Forgejo)
|
|
.unwrap()
|
|
.oauth_auth_req_uri_adapter;
|
|
|
|
let process_authorization_response_redirect_uri = Url::parse(&format!(
|
|
"{}://{}{}",
|
|
"http",
|
|
&settings.server.domain,
|
|
&routes.process_oauth_authorization_response(&SupportedForges::Forgejo)
|
|
))
|
|
.map_err(|_| InUIError::InternalServerError)?;
|
|
|
|
let web_adapter = super::adapter::RequestAuthorizationHandler::new(
|
|
save_oauth_state_adapter.as_ref().to_owned(),
|
|
oauth_auth_req_uri_adapter.clone(),
|
|
process_authorization_response_redirect_uri,
|
|
);
|
|
|
|
web_adapter
|
|
.request_oauth_authorization(forge_name.into_inner())
|
|
.await
|
|
}
|
|
|
|
pub fn services(cfg: &mut web::ServiceConfig) {
|
|
cfg.service(login_page);
|
|
cfg.service(request_oauth_authorization_forgejo);
|
|
}
|