89 lines
3.3 KiB
Rust
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
|
|
}
|