diff --git a/crates/frontend/src/lib.rs b/crates/frontend/src/lib.rs index c1cc618..ac6670d 100644 --- a/crates/frontend/src/lib.rs +++ b/crates/frontend/src/lib.rs @@ -7,7 +7,7 @@ use actix_web::{ http::{Method, StatusCode}, middleware::{ErrorHandlerResponse, ErrorHandlers}, web::{self, Data, Path}, - HttpResponse, Responder, + HttpRequest, HttpResponse, Responder, }; use askama::Template; use assets::{Assets, EmbedService}; @@ -62,6 +62,20 @@ async fn route_calendar( } } +async fn route_root(user: Option, req: HttpRequest) -> impl Responder { + let redirect_url = match user { + Some(user) => req + .resource_map() + .url_for(&req, "frontend_user", &[user.id]) + .unwrap(), + None => req + .resource_map() + .url_for::<[_; 0], String>(&req, "frontend_login", []) + .unwrap(), + }; + web::Redirect::to(redirect_url.to_string()).permanent() +} + fn unauthorized_handler(res: ServiceResponse) -> actix_web::Result> { let (req, _) = res.into_parts(); let login_url = req.url_for_static("frontend_login").unwrap().to_string(); @@ -110,8 +124,11 @@ pub fn configure_frontend .app_data(Data::from(auth_provider)) .app_data(Data::from(store.clone())) .service(EmbedService::::new("/assets".to_owned())) + .service(web::resource("").route(web::method(Method::GET).to(route_root))) .service( - web::resource("/user/{user}").route(web::method(Method::GET).to(route_user::)), + web::resource("/user/{user}") + .route(web::method(Method::GET).to(route_user::)) + .name("frontend_user"), ) .service( web::resource("/user/{user}/{calendar}")