use actix_files::Files; use actix_session::{storage::CookieSessionStore, SessionMiddleware}; use actix_web::{ cookie::Key, http, middleware::{ErrorHandlers, Logger}, web, App, HttpServer, }; use dotenv::dotenv; use handlebars::Handlebars; use lettre::{transport::smtp::authentication::Credentials, SmtpTransport}; use log::debug; use std::env; use terminwahl_back::{api, db, handlebars_helper::TimeOfDate, views, CssPath}; #[actix_web::main] async fn main() -> std::io::Result<()> { dotenv().ok(); env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let pool = db::init_pool(&database_url) .await .expect("Failed to create pool"); let smtp_user = env::var("SMTP_USER").expect("Failed to get smtp user"); let smtp_password = env::var("SMTP_PASSWORD").expect("Failed to get smtp password"); let wasm_statics = env::var("PATH_TO_STATICS").expect("Failed to get statics path"); let port: u16 = env::var("PORT") .expect("Failed to get port") .parse() .expect("Not a Portnumber"); let credentials = Credentials::new(smtp_user, smtp_password); let smtp_pool = SmtpTransport::relay("smtp.1und1.de") .expect("Failed to connect to smtp") // Add credentials for authentication .credentials(credentials) // Connection pool settings .build(); let mut handlebars = Handlebars::new(); handlebars.register_helper("time_of", Box::new(TimeOfDate)); handlebars .register_templates_directory(".hbs", "terminwahl_back/templates") .unwrap(); log::info!("starting HTTP server at http://localhost:8080"); debug!("{:?}", handlebars.get_templates()); HttpServer::new(move || { log::debug!("Constructing the App"); let session_store = SessionMiddleware::new(CookieSessionStore::default(), Key::generate()); let error_handlers = ErrorHandlers::new() .handler( http::StatusCode::INTERNAL_SERVER_ERROR, api::errors::internal_server_error, ) .handler(http::StatusCode::BAD_REQUEST, api::errors::bad_request) .handler(http::StatusCode::NOT_FOUND, api::errors::not_found); App::new() .app_data(web::Data::new(pool.clone())) .app_data(web::Data::new(smtp_pool.clone())) .app_data(web::Data::new(handlebars.clone())) .app_data(web::Data::new(CssPath::default())) .wrap(Logger::default()) .wrap(session_store) .wrap(error_handlers) .service( web::resource("/get/teachers").route(web::get().to(api::read::get_teachers_json)), ) .service( web::resource("/get/subjects").route(web::get().to(api::read::get_subjects_json)), ) .service(web::resource("/get/slots").route(web::get().to(api::read::get_slots_json))) .service( web::resource("/get/unavailable") .route(web::get().to(api::read::get_unavailable_json)), ) .service( web::resource("/send/appointments") .route(web::post().to(api::write::save_appointments_json)), ) .service( web::resource("/confirm/{validation_key}") .route(web::get().to(views::confirm_validation_key)), ) .service( web::resource("/cancel/{teacher_id}/{slot_id}/{validation_key}") .route(web::get().to(views::delete_appointment)), ) .service(Files::new("/", wasm_statics.clone()).index_file("index.html")) }) .bind(("127.0.0.1", port))? .workers(2) .run() .await }