mod api; mod auth; mod dtos; mod models; mod schema; use crate::api::hit; use crate::api::image; use crate::api::tracker; use crate::models::AppState; use chrono::Local; use diesel::{Connection, PgConnection}; use rocket::State; use rocket::fs::NamedFile; use rocket::http::Status; use std::env; use std::path::Path; use std::str::FromStr; #[macro_use] extern crate rocket; #[get("/")] async fn index(state: &State) -> Result { NamedFile::open(Path::new(state.static_dir.as_str()).join("index.html")) .await .map_err(|_| Status::InternalServerError) } fn setup_logging() -> Result<(), fern::InitError> { let level_raw = env::var("LOG_LEVEL").unwrap_or("INFO".to_string()); let level = log::LevelFilter::from_str(&level_raw).expect("LOG_LEVEL invalid"); fern::Dispatch::new() .format(|out, message, record| { out.finish(format_args!( "{} {} [{}] {}", Local::now().format("%Y-%m-%d %H:%M:%S"), record.level(), record.target(), message )) }) .level(level) .chain(std::io::stdout()) .apply()?; Ok(()) } #[launch] fn rocket() -> _ { dotenv::dotenv().ok(); setup_logging().expect("Failed to setup logging"); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let static_dir = env::var("STATIC_DIR").expect("STATIC_DIR must be set"); let db = PgConnection::establish(&database_url) .expect(&format!("Error connecting to {}", database_url)); let app_data = AppState::new(db, static_dir); rocket::build() .manage(app_data) .mount("/", routes![index]) .mount( "/tracker", routes![ tracker::index, tracker::get, tracker::create, tracker::delete ], ) .mount("/hit", routes![hit::index, hit::get, hit::delete]) .mount("/image", routes![image::get]) }