use actix_session::{storage::CookieSessionStore, SessionMiddleware}; use actix_web::{ cookie::Key, http::Method, web::{self, Data, Path}, Responder, }; use askama::Template; use routes::login::{route_get_login, route_post_login}; use rustical_store::{ auth::{AuthenticationMiddleware, AuthenticationProvider}, model::Calendar, CalendarStore, }; use std::sync::Arc; use tokio::sync::RwLock; mod config; mod routes; pub use config::FrontendConfig; #[derive(Template)] #[template(path = "pages/user.html")] struct UserPage { pub owner: String, pub calendars: Vec, } async fn route_user( path: Path, store: Data>, ) -> impl Responder { let store = store.read().await; let owner = path.into_inner(); UserPage { owner: owner.to_owned(), calendars: store.get_calendars(&owner).await.unwrap(), } } pub fn configure_frontend( cfg: &mut web::ServiceConfig, auth_provider: Arc, store: Arc>, ) { cfg.service( web::scope("") .wrap(AuthenticationMiddleware::new(auth_provider.clone())) .wrap( SessionMiddleware::builder(CookieSessionStore::default(), Key::from(&[0; 64])) .cookie_secure(true) .cookie_content_security(actix_session::config::CookieContentSecurity::Private) .build(), ) .app_data(Data::from(auth_provider)) .app_data(Data::from(store.clone())) .service( // TODO: Bundle assets in a neat way actix_files::Files::new("/assets", "crates/frontend/frontend/dist/assets") .prefer_utf8(true), ) .service( web::resource("/user/{user}").route(web::method(Method::GET).to(route_user::)), ) .service( web::resource("/login") .route(web::method(Method::GET).to(route_get_login)) .route(web::method(Method::POST).to(route_post_login::)), ), ); }