89 lines
3.3 KiB
Rust

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};
#[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 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_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()))
.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(api::write::confirm_validation_key)),
)
.service(Files::new("/", "./terminwahl_front/dist/").index_file("index.html"))
})
.bind(("127.0.0.1", 8080))?
.workers(2)
.run()
.await
}