77 lines
2.0 KiB
Rust
77 lines
2.0 KiB
Rust
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<AppState>) -> Result<NamedFile, Status> {
|
|
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])
|
|
}
|