diff --git a/Cargo.lock b/Cargo.lock index 3962284..05f2a35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,8 +44,6 @@ dependencies = [ "axum", "dotenvy", "futures-util", - "log", - "pretty_env_logger", "reqwest", "sea-orm", "serde", @@ -564,19 +562,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -872,12 +857,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -957,12 +936,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" - [[package]] name = "hyper" version = "1.6.0" @@ -1223,17 +1196,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "itoa" version = "1.0.15" @@ -1677,16 +1639,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "pretty_env_logger" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" -dependencies = [ - "env_logger", - "log", -] - [[package]] name = "proc-macro-crate" version = "3.3.0" @@ -2336,9 +2288,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "itoa", "memchr", @@ -2807,15 +2759,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "2.0.12" diff --git a/Cargo.toml b/Cargo.toml index 0ac3985..052dc7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,4 @@ utoipa-axum = "0.2.0" utoipa-swagger-ui = { version = "9", features = ["axum", "reqwest"] } utoipa-redoc = { version = "6", features = ["axum"] } futures-util = "0.3.31" -log = "0.4.27" -pretty_env_logger = "0.5.0" diff --git a/src/main.rs b/src/main.rs index 0c6b35f..9ab5ac9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,16 @@ -use std::{net::SocketAddr, sync::Arc}; +use std::{net::SocketAddr, sync::Arc, time::Duration}; use axum::{extract::State, http::HeaderMap, routing::get}; use reqwest::{header::USER_AGENT}; use sea_orm::{ConnectionTrait, Database, DatabaseConnection, EntityTrait, PaginatorTrait, Schema}; -use tokio::{sync::broadcast::{self, Sender}}; +use tokio::{sync::broadcast::{self, Sender}, task, time}; use utoipa::openapi::{ContactBuilder, InfoBuilder, LicenseBuilder}; use utoipa_axum::router::OpenApiRouter; use utoipa_redoc::{Redoc, Servable}; use utoipa_swagger_ui::{Config, SwaggerUi}; use utoipa_axum::routes; -use crate::{entities::prelude::BookInstance, utils::events::Event}; +use crate::{entities::{owner, prelude::BookInstance}, utils::events::Event}; pub mod entities; pub mod utils; @@ -38,26 +38,41 @@ async fn index( #[tokio::main] async fn main() { - pretty_env_logger::init(); - let db: Arc = Arc::new(Database::connect(String::from("sqlite://./alexandria.db?mode=rwc")).await.unwrap()); let builder = db.get_database_backend(); let schema = Schema::new(builder); if let Err(err) = db.execute(builder.build(schema.create_table_from_entity(crate::entities::prelude::Book).if_not_exists())).await { - log::error!(target: "database", "Error while creating book table: {err:?}"); + println!("Error while creating book table: {err:?}"); return; } if let Err(err) = db.execute(builder.build(schema.create_table_from_entity(crate::entities::prelude::BookInstance).if_not_exists())).await { - log::error!(target: "database", "Error while creating book_instance table: {err:?}"); + println!("Error while creating book_instance table: {err:?}"); return; } if let Err(err) = db.execute(builder.build(schema.create_table_from_entity(crate::entities::prelude::Owner).if_not_exists())).await { - log::error!(target: "database", "Error while creating owner table: {err:?}"); + println!("Error while creating owner table: {err:?}"); return; } let (event_bus, _) = broadcast::channel(16); + + let ntx = event_bus.clone(); + let _forever = task::spawn(async move { + let mut interval = time::interval(Duration::from_secs(5)); + + let mut id = 1; + loop { + interval.tick().await; + let _ = ntx.send(Event::WebsocketBroadcast(utils::events::WebsocketMessage::NewOwner(Arc::new(owner::Model { + id, + first_name: "Avril".to_string(), + last_name: "Papillon".to_string(), + contact: "avril.papillon@proton.me".to_string() + })))); + id += 1; + } + }); let mut default_headers = HeaderMap::new(); default_headers.append(USER_AGENT, "Alexandria/1.0 (unionetudianteauvergne@gmail.com)".parse().unwrap()); @@ -103,7 +118,7 @@ async fn main() { let router = router.merge(swagger); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); - log::info!("Running on http://{}", listener.local_addr().unwrap()); + println!("Running on http://{}", listener.local_addr().unwrap()); axum::serve( listener, router.into_make_service_with_connect_info::() diff --git a/src/routes/book_instance.rs b/src/routes/book_instance.rs index eb635a8..5b08e79 100644 --- a/src/routes/book_instance.rs +++ b/src/routes/book_instance.rs @@ -73,7 +73,7 @@ pub async fn create_book_instance( let b = book_instance.save(state.db_conn.as_ref()).await; match b { Err(e) => { - log::error!(target: "api", "Error while inserting new book instance: {:#?}", e); + println!("Error while inserting new book instance: {:#?}", e); (StatusCode::BAD_REQUEST, Json(None)) }, Ok(res) => (StatusCode::OK, Json(Some(res.try_into_model().expect("All fields should be set once the book instance is saved")))) diff --git a/src/routes/owner.rs b/src/routes/owner.rs index 85bee5f..9a63d24 100644 --- a/src/routes/owner.rs +++ b/src/routes/owner.rs @@ -6,7 +6,7 @@ use sea_orm::{ActiveModelTrait, ActiveValue::{NotSet, Set}, EntityTrait, TryInto use serde::{Deserialize, Serialize}; use utoipa::IntoParams; -use crate::{entities::{owner, prelude::Owner}, utils::events::{Event, WebsocketMessage}, AppState}; +use crate::{entities::{owner, prelude::Owner}, AppState}; #[derive(IntoParams)] @@ -62,23 +62,19 @@ pub async fn create_owner( Json(instance_payload): Json, ) -> (StatusCode, Json>) { - let owner = owner::ActiveModel { + let book_instance = owner::ActiveModel { first_name: Set(instance_payload.first_name), last_name: Set(instance_payload.last_name), contact: Set(instance_payload.contact), id: NotSet }; - let o = owner.insert(state.db_conn.as_ref()).await; - match o { + let b = book_instance.save(state.db_conn.as_ref()).await; + match b { Err(e) => { - log::error!(target: "api", "Error while inserting new owner from api: {:#?}", e); + println!("Error while inserting new owner: {:#?}", e); (StatusCode::BAD_REQUEST, Json(None)) }, - Ok(res) => { - let model = res.try_into_model().expect("All fields should be set once the owner is saved"); - let _ = state.event_bus.send(Event::WebsocketBroadcast(WebsocketMessage::NewOwner(Arc::new(model.clone())))); - (StatusCode::OK, Json(Some(model))) - } + Ok(res) => (StatusCode::OK, Json(Some(res.try_into_model().expect("All fields should be set once the book instance is saved")))) } } diff --git a/src/routes/websocket.rs b/src/routes/websocket.rs index 9d9c601..f9faa94 100644 --- a/src/routes/websocket.rs +++ b/src/routes/websocket.rs @@ -9,6 +9,7 @@ use axum::{ }, response::IntoResponse }; +use serde_json::json; use crate::{utils::events, AppState}; @@ -20,7 +21,9 @@ pub async fn ws_handler( ConnectInfo(addr): ConnectInfo, State(state): State> ) -> impl IntoResponse { - log::debug!(target: "websocket", "{addr} connected."); + println!("`{addr} connected."); + // finalize the upgrade process by returning upgrade callback. + // we can customize the callback by sending additional info such as address. ws.on_upgrade(move |socket| handle_socket(socket, addr, state)) } @@ -31,9 +34,9 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr, state: Arc>> Pinged {who}..."); } else { - log::debug!(target: "websocket", "Could not send ping to {who}!"); + println!("WS >>> Could not send ping {who}!"); return; } @@ -43,7 +46,7 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr, state: Arc>> Client {who} abruptly disconnected"); return; } } @@ -75,15 +78,15 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr, state: Arc { match rv_a { - Ok(()) => log::debug!(target: "websocket", "Sender connection with {who} gracefully shut down"), - Err(a) => log::debug!(target: "websocket", "Error sending messages {a:?}") + Ok(()) => println!("WS >>> Sender connection with {who} gracefully shut down"), + Err(a) => println!("WS >>> Error sending messages {a:?}") } recv_task.abort(); }, rv_b = (&mut recv_task) => { match rv_b { - Ok(()) => log::debug!(target: "websocket", "Receiver connection with {who} gracefully shut down"), - Err(b) => log::debug!(target: "websocket", "Error receiving messages {b:?}") + Ok(()) => println!("WS >>> Receiver connection with {who} gracefully shut down"), + Err(b) => println!("WS >>> Error receiving messages {b:?}") } send_task.abort(); } @@ -93,27 +96,28 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr, state: Arc ControlFlow<(), ()> { match msg { Message::Text(t) => { - log::debug!(target: "websocket", "{who} sent str: {t:?}"); + println!("WS >>> {who} sent str: {t:?}"); } Message::Binary(d) => { - log::debug!(target: "websocket", "{who} sent {} bytes: {d:?}", d.len()); + println!("WS >>> {who} sent {} bytes: {d:?}", d.len()); } Message::Close(c) => { if let Some(cf) = c { - log::debug!(target: "websocket", - "{who} sent close with code {} and reason `{}`", + println!( + "WS >>> {who} sent close with code {} and reason `{}`", cf.code, cf.reason ); } else { - log::debug!(target: "websocket", "{who} somehow sent close message without CloseFrame"); + println!("WS >>> {who} somehow sent close message without CloseFrame"); } return ControlFlow::Break(()); } - Message::Pong(_v) => { - //log::debug!(target: "websocket", "{who} sent pong with {v:?}"); + + Message::Pong(v) => { + println!("WS >>> {who} sent pong with {v:?}"); } - Message::Ping(_v) => { - //log::debug!(target: "websocket", "{who} sent ping with {v:?}"); + Message::Ping(v) => { + println!("WS >>> {who} sent ping with {v:?}"); } } ControlFlow::Continue(()) diff --git a/src/utils/open_library.rs b/src/utils/open_library.rs index d1b9af1..dace055 100644 --- a/src/utils/open_library.rs +++ b/src/utils/open_library.rs @@ -30,7 +30,7 @@ pub async fn fetch_book_by_ean(web_client: &reqwest::Client, ean: &String) -> Op match body.status() { StatusCode::OK => { let res = body.text().await.unwrap(); - log::trace!(target: "api", "OpenLibrary book fetch result: {res:#?}"); + println!("Res: {res:#?}"); let v: Value = serde_json::from_str(&res).unwrap(); Some(FetchedBook { ean: ean.to_string(),