diff --git a/Cargo.lock b/Cargo.lock index 499386f..9345c97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -364,6 +364,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + [[package]] name = "figment" version = "0.10.19" @@ -1245,6 +1254,8 @@ dependencies = [ "chrono", "diesel", "dotenv", + "fern", + "log", "rocket", "serde", "uuid", diff --git a/Cargo.toml b/Cargo.toml index 2038aaa..8c90100 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,5 @@ dotenv = "0.15.0" uuid = { version = "1.18.1", features = ["v4", "serde"] } diesel = { version = "2.3.2", features = ["postgres", "uuid", "chrono"] } chrono = "0.4.42" +log = "0.4.28" +fern = "0.7.1" diff --git a/src/api/hit.rs b/src/api/hit.rs index cc2c2e3..4e75f55 100644 --- a/src/api/hit.rs +++ b/src/api/hit.rs @@ -35,10 +35,10 @@ pub fn index( } #[get("/")] -pub fn get(id: String, state: &State) -> Result, Status> { +pub fn get(id: &str, state: &State) -> Result, Status> { let mut db = state.db.lock().unwrap(); - let id = match Uuid::parse_str(id.as_str()).ok() { + let id = match Uuid::parse_str(id).ok() { Some(id) => id, None => return Err(Status::BadRequest), }; @@ -55,10 +55,10 @@ pub fn get(id: String, state: &State) -> Result, Status> } #[delete("/")] -pub fn delete(id: String, state: &State) -> Result { +pub fn delete(id: &str, state: &State) -> Result { let mut db = state.db.lock().unwrap(); - let id = match Uuid::parse_str(id.as_str()).ok() { + let id = match Uuid::parse_str(id).ok() { Some(id) => id, None => return Err(Status::BadRequest), }; diff --git a/src/api/image.rs b/src/api/image.rs index b7de390..e049645 100644 --- a/src/api/image.rs +++ b/src/api/image.rs @@ -45,8 +45,8 @@ impl<'r> FromRequest<'r> for ReqMeta { } #[get("/")] -pub async fn get(id: String, meta: ReqMeta, state: &State) -> Result { - let id = match Uuid::parse_str(id.as_str()).ok() { +pub async fn get(id: &str, meta: ReqMeta, state: &State) -> Result { + let id = match Uuid::parse_str(id).ok() { Some(id) => id, None => return Err(Status::BadRequest), }; diff --git a/src/api/tracker.rs b/src/api/tracker.rs index d662cd4..5b92431 100644 --- a/src/api/tracker.rs +++ b/src/api/tracker.rs @@ -35,10 +35,10 @@ pub fn index( } #[get("/")] -pub fn get(id: String, state: &State) -> Result, Status> { +pub fn get(id: &str, state: &State) -> Result, Status> { let mut db = state.db.lock().unwrap(); - let id = match Uuid::parse_str(id.as_str()).ok() { + let id = match Uuid::parse_str(id).ok() { Some(id) => id, None => return Err(Status::BadRequest), }; @@ -75,10 +75,10 @@ pub fn create(state: &State) -> Result, Status> { } #[delete("/")] -pub fn delete(id: String, state: &State) -> Result { +pub fn delete(id: &str, state: &State) -> Result { let mut db = state.db.lock().unwrap(); - let id = match Uuid::parse_str(id.as_str()).ok() { + let id = match Uuid::parse_str(id).ok() { Some(id) => id, None => return Err(Status::BadRequest), }; diff --git a/src/main.rs b/src/main.rs index a28256d..4971bb8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,10 @@ mod schema; use crate::api::hit; use crate::api::image; use crate::api::tracker; +use chrono::Local; use diesel::{Connection, PgConnection}; use std::env; +use std::str::FromStr; #[macro_use] extern crate rocket; @@ -17,12 +19,33 @@ fn index() -> &'static str { "Hello world!" } -// TODO: add logging // TODO: add auth +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 image_path = env::var("IMAGE_PATH").expect("IMAGE_PATH must be set");