mod app; mod middleware; mod service; mod static_files; mod testing; mod tls_config; mod website; use actix_files::Files; use actix_web::{web, App, HttpServer}; use actix_web_lab::middleware::RedirectHttps; use app::AppState; use middleware::AuthService; use static_files::StaticFilesManager; use tls_config::tls_config; use website::WebSiteBuilder; #[actix_web::main] async fn main() -> std::io::Result<()> { let app_state = AppState::new(); env_logger::Builder::from_env( env_logger::Env::default().default_filter_or(&app_state.config.get_log_level()), ) .init(); let website = WebSiteBuilder::load(&app_state.config) .with_static_files_manager(StaticFilesManager::new(&app_state).unwrap().build()) .build(); let host = app_state.config.host.clone(); let port = app_state.config.port; let port_tls = app_state.config.port_tls; let srv_conf = tls_config(&app_state.config); let static_dir = website.static_files_manager.dir.clone(); let mut_app_state = std::sync::Mutex::new(app_state); let app_state = web::Data::new(mut_app_state); let mut_website = web::Data::new(std::sync::Mutex::new(website)); HttpServer::new(move || { App::new() .wrap(actix_web::middleware::Logger::default()) .wrap(actix_web::middleware::Compress::default()) .wrap(RedirectHttps::default().to_port(port_tls)) .app_data(web::Data::clone(&app_state)) .app_data(web::Data::clone(&mut_website)) .service(Files::new("/static/", &static_dir)) .service( web::scope("/admin") .service(service::admin_login) .service(service::admin_authenticate) .service( web::scope("/auth") .wrap(AuthService {}) .service(service::admin_workspace), ), ) .service(service::files::favicon) .service(service::page) }) .bind(format!("{}:{}", host, port))? .bind_rustls(format!("{}:{}", host, port_tls), srv_conf)? .run() .await }