From 5f569b4bb7a2f5bd2efbfc64ed59db79fa9e1397 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Tue, 23 Dec 2025 16:25:46 +0100 Subject: [PATCH 1/7] Add user read chat functionality --- src/broadcast/notification.rs | 8 +++++- src/rooms/handler.rs | 10 ++++++++ src/rooms/room_service.rs | 46 ++++++++++++++++++++++++++++++++++- src/rooms/routes.rs | 3 ++- 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/broadcast/notification.rs b/src/broadcast/notification.rs index 6043732..f5663fe 100644 --- a/src/broadcast/notification.rs +++ b/src/broadcast/notification.rs @@ -50,7 +50,13 @@ pub enum NotificationEvent { * Sending this event to all users in a room where a member has left */ #[serde(rename_all = "camelCase")] - RoomChangeEvent {message: MessageDTO, room_preview_text: LastMessagePreviewText} + RoomChangeEvent {message: MessageDTO, room_preview_text: LastMessagePreviewText}, + + /** + * Sending this event to all users in a room when a user has read the latest message + */ + #[serde(rename_all = "camelCase")] + UserReadChat {user_id: Uuid, room_id: Uuid} } diff --git a/src/rooms/handler.rs b/src/rooms/handler.rs index fbab962..d22a8ed 100644 --- a/src/rooms/handler.rs +++ b/src/rooms/handler.rs @@ -200,4 +200,14 @@ pub async fn handle_save_room_image( } else { Err(AppError::ValidationError("Required field 'image' not found in the upload.".to_string())) } +} + +pub async fn handle_get_read_states( + Extension(token): Extension>, + State(state): State>, + Path(room_id): Path +) -> Result>, AppError> { + check_user_in_room(&state, &token.subject, &room_id).await?; + let read_states = RoomService::get_read_states(state, room_id).await?; + Ok(Json(read_states)) } \ No newline at end of file diff --git a/src/rooms/room_service.rs b/src/rooms/room_service.rs index eb98a3e..447fa36 100644 --- a/src/rooms/room_service.rs +++ b/src/rooms/room_service.rs @@ -4,7 +4,7 @@ use chrono::Utc; use log::{error}; use uuid::Uuid; use crate::broadcast::{BroadcastChannel, Notification}; -use crate::broadcast::NotificationEvent::{LeaveRoom, RoomChangeEvent}; +use crate::broadcast::NotificationEvent::{LeaveRoom, RoomChangeEvent, UserReadChat}; use crate::core::AppState; use crate::errors::{AppError}; use crate::messaging::model::{Message, MessageBody, RoomChangeBody}; @@ -44,9 +44,53 @@ impl RoomService { pub async fn mark_room_as_read(state: Arc, client_id: Uuid, room_id: Uuid) -> Result<(), AppError> { let pl = state.room_repository.get_connection(); state.room_repository.update_user_read_status(pl, &room_id, &client_id).await?; + + let room = state.room_repository.select_room(&room_id).await?; + if let Some(latest_msg_time) = room.latest_message { + let user = state.room_repository.select_joined_user_by_id(&room_id, &client_id).await?; + if let Some(read_time) = user.last_message_read_at { + if read_time >= latest_msg_time { + let users_in_room = state.room_repository.select_room_participants_ids(&room_id).await?; + BroadcastChannel::get().send_event_to_all( + users_in_room, + Notification { + body: UserReadChat { user_id: client_id, room_id }, + created_at: Utc::now() + } + ).await; + } + } + } else { + let users_in_room = state.room_repository.select_room_participants_ids(&room_id).await?; + BroadcastChannel::get().send_event_to_all( + users_in_room, + Notification { + body: UserReadChat { user_id: client_id, room_id }, + created_at: Utc::now() + } + ).await; + } + Ok(()) } + pub async fn get_read_states(state: Arc, room_id: Uuid) -> Result, AppError> { + let users = state.room_repository.select_joined_user_in_room(&room_id).await?; + let room = state.room_repository.select_room(&room_id).await?; + let read_users: Vec = users.into_iter().filter(|user| { + if let Some(latest_msg_time) = room.latest_message { + if let Some(read_time) = user.last_message_read_at { + read_time >= latest_msg_time + } else { + false + } + } else { + true + } + }).collect(); + Ok(read_users) + } + pub async fn create_room(state: Arc, client_id: Uuid, new_room: NewRoom) -> Result { let room_entity = state.room_repository.insert_room(new_room.clone()).await?; let users = new_room.invited_users; diff --git a/src/rooms/routes.rs b/src/rooms/routes.rs index c31b572..1f16367 100644 --- a/src/rooms/routes.rs +++ b/src/rooms/routes.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use axum::Router; use axum::routing::{get, post}; use crate::core::AppState; -use crate::rooms::handler::{handle_create_room, handle_get_joined_rooms, handle_get_room_list_item_by_id, handle_get_room_with_details, handle_get_users_in_room, handle_invite_to_room, handle_leave_room, handle_save_room_image, handle_scroll_chat_timeline, handle_search_existing_single_room, mark_room_as_read}; +use crate::rooms::handler::{handle_create_room, handle_get_joined_rooms, handle_get_room_list_item_by_id, handle_get_room_with_details, handle_get_users_in_room, handle_invite_to_room, handle_leave_room, handle_save_room_image, handle_scroll_chat_timeline, handle_search_existing_single_room, mark_room_as_read, handle_get_read_states}; pub fn create_room_routes() -> Router> { @@ -18,4 +18,5 @@ pub fn create_room_routes() -> Router> { .route("/api/rooms/{room_id}/invite/{user_id}", post(handle_invite_to_room)) .route("/api/rooms/{room_id}/upload-img", post(handle_save_room_image)) .route("/api/rooms", get(handle_get_joined_rooms)) + .route("/api/rooms/{room_id}/read-states", get(handle_get_read_states)) } From 83271efb4ae99eb4ff10fa5dcef4d20fd18719d1 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Sun, 28 Dec 2025 11:24:19 +0100 Subject: [PATCH 2/7] Add some tests --- src/broadcast/event_broadcast.rs | 41 ++++++++++++++++++ src/rooms/room_service.rs | 72 ++++++++++++++++++++++++++++---- 2 files changed, 104 insertions(+), 9 deletions(-) diff --git a/src/broadcast/event_broadcast.rs b/src/broadcast/event_broadcast.rs index 960d61a..e1716f4 100644 --- a/src/broadcast/event_broadcast.rs +++ b/src/broadcast/event_broadcast.rs @@ -35,6 +35,47 @@ pub struct BroadcastChannel { push_notification_producer: PushNotificationProducer } +#[cfg(test)] +mod tests { + use super::*; + use crate::cache::redis_cache::NoOpCache; + use crate::kafka::PushNotificationProducer; + use crate::core::KafkaConfig; + use crate::broadcast::Notification; + use crate::broadcast::NotificationEvent::UserReadChat; + use serde_json; + use std::sync::Arc; + + #[tokio::test] + async fn send_event_to_subscribed_user_delivers_notification() { + // initialize broadcast channel singleton with NoOpCache and logger producer + let cache: Arc = Arc::new(NoOpCache); + let kafka_cfg = KafkaConfig { bootstrap_host: String::from(""), bootstrap_port: 0, topic: String::from(""), client_id: String::from(""), partition: vec![], consumer_group: String::from("") }; + BroadcastChannel::init(cache, PushNotificationProducer::new(false, kafka_cfg)).await; + + let bc = BroadcastChannel::get(); + + let user_id = uuid::Uuid::new_v4(); + // subscribe + let mut rx = bc.subscribe_to_user_events(user_id).await; + + let notification = Notification { + body: UserReadChat { user_id, room_id: uuid::Uuid::new_v4() }, + created_at: chrono::Utc::now() + }; + + // send to all (only this user) + bc.send_event_to_all(vec![user_id], notification.clone()).await; + + // receive + let received = rx.recv().await.expect("Should receive notification"); + + let sent_json = serde_json::to_string(¬ification).expect("serialize sent"); + let recv_json = serde_json::to_string(&received).expect("serialize recv"); + assert_eq!(sent_json, recv_json); + } +} + type UserConnectionMap = RwLock>>; diff --git a/src/rooms/room_service.rs b/src/rooms/room_service.rs index 447fa36..cacc4cb 100644 --- a/src/rooms/room_service.rs +++ b/src/rooms/room_service.rs @@ -78,15 +78,7 @@ impl RoomService { let users = state.room_repository.select_joined_user_in_room(&room_id).await?; let room = state.room_repository.select_room(&room_id).await?; let read_users: Vec = users.into_iter().filter(|user| { - if let Some(latest_msg_time) = room.latest_message { - if let Some(read_time) = user.last_message_read_at { - read_time >= latest_msg_time - } else { - false - } - } else { - true - } + user_has_read(user, room.latest_message) }).collect(); Ok(read_users) } @@ -248,6 +240,68 @@ impl RoomService { } +// Helper used by `get_read_states` — extracted for easier unit testing of the read logic. +fn user_has_read(user: &RoomMember, room_latest: Option>) -> bool { + if let Some(latest_msg_time) = room_latest { + if let Some(read_time) = user.last_message_read_at { + read_time >= latest_msg_time + } else { + false + } + } else { + true + } +} + +#[cfg(test)] +mod tests { + use super::*; + use chrono::{Utc, Duration}; + use uuid::Uuid; + use crate::model::room_member::{RoomMember, MembershipStatus}; + + fn make_member(read_at: Option>) -> RoomMember { + RoomMember { + id: Uuid::new_v4(), + display_name: "test".to_string(), + profile_picture: None, + joined_at: Utc::now(), + last_message_read_at: read_at, + membership_status: MembershipStatus::Joined + } + } + + #[test] + fn user_has_read_when_no_latest_message() { + let user = make_member(None); + let result = user_has_read(&user, None); + assert!(result, "When room has no latest message, every user should be considered read"); + } + + #[test] + fn user_has_read_when_read_time_ge_latest() { + let latest = Utc::now(); + let read_time = latest + Duration::seconds(1); + let user = make_member(Some(read_time)); + assert!(user_has_read(&user, Some(latest))); + } + + #[test] + fn user_has_not_read_when_read_time_before_latest() { + let latest = Utc::now(); + let read_time = latest - Duration::seconds(10); + let user = make_member(Some(read_time)); + assert!(!user_has_read(&user, Some(latest))); + } + + #[test] + fn user_has_not_read_when_no_read_time_and_latest_present() { + let latest = Utc::now(); + let user = make_member(None); + assert!(!user_has_read(&user, Some(latest))); + } +} + async fn handle_leave_private_room(state: Arc, room: ChatRoomEntity, users: Vec) -> Result<(), AppError> { let mut tx = state.room_repository.start_transaction().await?; state.room_repository.delete_room(&mut *tx, &room.id).await?; From 2666eb13fcf731f06be399f6607a7b42ec9b274e Mon Sep 17 00:00:00 2001 From: timvosskuehler Date: Fri, 16 Jan 2026 23:54:55 +0100 Subject: [PATCH 3/7] reorganize tests, and streamline utility functions - Bumps versions for `axum`, `tracing`, `tracing-subscriber`, `redis`, and other dependencies to include the latest updates and fixes. - Restores and reorganizes previously removed test modules to maintain code coverage. - Refactors `user_has_read` utility with concise logic for better readability. - Fixes route reordering for `mark-read` API to improve definition clarity. --- Cargo.lock | 43 +++++++----- Cargo.toml | 10 +-- src/broadcast/event_broadcast.rs | 85 ++++++++++++------------ src/keycloak/action.rs | 1 + src/main.rs | 2 +- src/rooms/room_service.rs | 110 +++++++++++++++---------------- src/rooms/routes.rs | 2 +- 7 files changed, 134 insertions(+), 119 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bbfd5b6..f082939 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -251,9 +251,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ "axum-core", "bytes", @@ -3184,9 +3184,9 @@ dependencies = [ [[package]] name = "redis" -version = "1.0.0-rc.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3c1983f96fe1aa42d3e75d6eedc0374ba45f784fb86f130e2c8dac95817471" +checksum = "5dfe20977fe93830c0e9817a16fbf1ed1cfd8d4bba366087a1841d2c6033c251" dependencies = [ "arc-swap", "arcstr", @@ -3206,6 +3206,7 @@ dependencies = [ "tokio", "tokio-util", "url", + "xxhash-rust", ] [[package]] @@ -3642,15 +3643,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -4594,9 +4595,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -4606,9 +4607,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -4617,9 +4618,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -4638,9 +4639,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", @@ -5388,6 +5389,12 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + [[package]] name = "yaml-rust2" version = "0.10.4" @@ -5537,6 +5544,12 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "zmij" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" + [[package]] name = "zune-core" version = "0.4.12" diff --git a/Cargo.toml b/Cargo.toml index 725d3e8..6ef3ed9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" [dependencies] log = "0.4.28" -axum = { version = "0.8.6", features = ["multipart"] } +axum = { version = "0.8.8", features = ["multipart"] } tokio = {version = "1.48.0", features = ["full"]} tower = "0.5.2" config = "0.15.18" @@ -15,11 +15,11 @@ futures = "0.3.31" uuid = { version = "1.18.1", features = ["v4", "serde", "v7"] } chrono = { version = "0.4.42", features = ["serde"] } tower-http = { version = "0.6.6", features = ["cors", "trace"] } -tracing = "0.1.41" -tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } +tracing = "0.1.44" +tracing-subscriber = { version = "0.3.22", features = ["env-filter"] } sqlx = {version = "0.8.6", features = ["runtime-tokio", "postgres", "chrono", "uuid", "macros"]} dotenv = "0.15.0" -serde_json = "1.0.145" +serde_json = "1.0.149" tokio-stream = { version = "0.1.17", features = ["sync"] } rdkafka = { version = "0.38.0", features = ["cmake-build", "tokio"] } minio = { version = "0.3.0", features = ["default"] } @@ -27,7 +27,7 @@ image = { version = "0.25.8"} bytes = "1.10.1" base64 = "0.22.1" validator = { version = "0.20.0", features = ["derive"] } -redis = { version = "1.0.0-rc.3", features = ["tokio-comp", "connection-manager"] } +redis = { version = "1.0.2", features = ["tokio-comp", "connection-manager"] } #keycloak: diff --git a/src/broadcast/event_broadcast.rs b/src/broadcast/event_broadcast.rs index e1716f4..0efae62 100644 --- a/src/broadcast/event_broadcast.rs +++ b/src/broadcast/event_broadcast.rs @@ -35,46 +35,6 @@ pub struct BroadcastChannel { push_notification_producer: PushNotificationProducer } -#[cfg(test)] -mod tests { - use super::*; - use crate::cache::redis_cache::NoOpCache; - use crate::kafka::PushNotificationProducer; - use crate::core::KafkaConfig; - use crate::broadcast::Notification; - use crate::broadcast::NotificationEvent::UserReadChat; - use serde_json; - use std::sync::Arc; - - #[tokio::test] - async fn send_event_to_subscribed_user_delivers_notification() { - // initialize broadcast channel singleton with NoOpCache and logger producer - let cache: Arc = Arc::new(NoOpCache); - let kafka_cfg = KafkaConfig { bootstrap_host: String::from(""), bootstrap_port: 0, topic: String::from(""), client_id: String::from(""), partition: vec![], consumer_group: String::from("") }; - BroadcastChannel::init(cache, PushNotificationProducer::new(false, kafka_cfg)).await; - - let bc = BroadcastChannel::get(); - - let user_id = uuid::Uuid::new_v4(); - // subscribe - let mut rx = bc.subscribe_to_user_events(user_id).await; - - let notification = Notification { - body: UserReadChat { user_id, room_id: uuid::Uuid::new_v4() }, - created_at: chrono::Utc::now() - }; - - // send to all (only this user) - bc.send_event_to_all(vec![user_id], notification.clone()).await; - - // receive - let received = rx.recv().await.expect("Should receive notification"); - - let sent_json = serde_json::to_string(¬ification).expect("serialize sent"); - let recv_json = serde_json::to_string(&received).expect("serialize recv"); - assert_eq!(sent_json, recv_json); - } -} type UserConnectionMap = RwLock>>; @@ -185,5 +145,48 @@ impl BroadcastChannel { } } - } + + +#[cfg(test)] +mod tests { + use super::*; + use crate::cache::redis_cache::NoOpCache; + use crate::kafka::PushNotificationProducer; + use crate::core::KafkaConfig; + use crate::broadcast::Notification; + use crate::broadcast::NotificationEvent::UserReadChat; + use serde_json; + use std::sync::Arc; + + #[tokio::test] + async fn send_event_to_subscribed_user_delivers_notification() { + // initialize broadcast channel singleton with NoOpCache and logger producer + let cache: Arc = Arc::new(NoOpCache); + let kafka_cfg = KafkaConfig { bootstrap_host: String::from(""), bootstrap_port: 0, topic: String::from(""), client_id: String::from(""), partition: vec![], consumer_group: String::from("") }; + BroadcastChannel::init(cache, PushNotificationProducer::new(false, kafka_cfg)).await; + + let bc = BroadcastChannel::get(); + + let user_id = uuid::Uuid::new_v4(); + // subscribe + let mut rx = bc.subscribe_to_user_events(user_id).await; + + let notification = Notification { + body: UserReadChat { user_id, room_id: uuid::Uuid::new_v4() }, + created_at: chrono::Utc::now() + }; + + // send to all (only this user) + bc.send_event_to_all(vec![user_id], notification.clone()).await; + + // receive + let received = rx.recv().await.expect("Should receive notification"); + + let sent_json = serde_json::to_string(¬ification).expect("serialize sent"); + let recv_json = serde_json::to_string(&received).expect("serialize recv"); + println!("Sent: {}", sent_json); + println!("Received: {}", recv_json); + assert_eq!(sent_json, recv_json); + } +} \ No newline at end of file diff --git a/src/keycloak/action.rs b/src/keycloak/action.rs index 602e0b6..9f6de26 100644 --- a/src/keycloak/action.rs +++ b/src/keycloak/action.rs @@ -144,6 +144,7 @@ impl Action { } #[cfg(test)] +#[allow(unused)] mod test { use assertr::prelude::*; diff --git a/src/main.rs b/src/main.rs index 5d67592..7037836 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,7 @@ use ism::welcome::welcome; //learn to code rust axum here: //https://gitlab.com/famedly/conduit/-/tree/next?ref_type=heads //https://github.com/AarambhDevHub/rust-backend-axum -//https://github.com/rust-lang/crates.io/ +//https://github.com/rust-lang/crates.io/ <---- THE BEST! #[tokio::main(flavor = "multi_thread")] async fn main() { diff --git a/src/rooms/room_service.rs b/src/rooms/room_service.rs index cacc4cb..ad117f1 100644 --- a/src/rooms/room_service.rs +++ b/src/rooms/room_service.rs @@ -242,65 +242,13 @@ impl RoomService { // Helper used by `get_read_states` — extracted for easier unit testing of the read logic. fn user_has_read(user: &RoomMember, room_latest: Option>) -> bool { - if let Some(latest_msg_time) = room_latest { - if let Some(read_time) = user.last_message_read_at { - read_time >= latest_msg_time - } else { - false - } - } else { - true + match (room_latest, user.last_message_read_at) { + (Some(latest_msg_time), Some(read_time)) => read_time >= latest_msg_time, + (Some(_), None) => false, + (None, _) => true, } } -#[cfg(test)] -mod tests { - use super::*; - use chrono::{Utc, Duration}; - use uuid::Uuid; - use crate::model::room_member::{RoomMember, MembershipStatus}; - - fn make_member(read_at: Option>) -> RoomMember { - RoomMember { - id: Uuid::new_v4(), - display_name: "test".to_string(), - profile_picture: None, - joined_at: Utc::now(), - last_message_read_at: read_at, - membership_status: MembershipStatus::Joined - } - } - - #[test] - fn user_has_read_when_no_latest_message() { - let user = make_member(None); - let result = user_has_read(&user, None); - assert!(result, "When room has no latest message, every user should be considered read"); - } - - #[test] - fn user_has_read_when_read_time_ge_latest() { - let latest = Utc::now(); - let read_time = latest + Duration::seconds(1); - let user = make_member(Some(read_time)); - assert!(user_has_read(&user, Some(latest))); - } - - #[test] - fn user_has_not_read_when_read_time_before_latest() { - let latest = Utc::now(); - let read_time = latest - Duration::seconds(10); - let user = make_member(Some(read_time)); - assert!(!user_has_read(&user, Some(latest))); - } - - #[test] - fn user_has_not_read_when_no_read_time_and_latest_present() { - let latest = Utc::now(); - let user = make_member(None); - assert!(!user_has_read(&user, Some(latest))); - } -} async fn handle_leave_private_room(state: Arc, room: ChatRoomEntity, users: Vec) -> Result<(), AppError> { let mut tx = state.room_repository.start_transaction().await?; @@ -392,4 +340,54 @@ async fn save_room_change_message_and_broadcast(message: Message, state: &Arc>) -> RoomMember { + RoomMember { + id: Uuid::new_v4(), + display_name: "test".to_string(), + profile_picture: None, + joined_at: Utc::now(), + last_message_read_at: read_at, + membership_status: MembershipStatus::Joined + } + } + + #[test] + fn user_has_read_when_no_latest_message() { + let user = make_member(None); + let result = user_has_read(&user, None); + assert!(result, "When room has no latest message, every user should be considered read"); + } + + #[test] + fn user_has_read_when_read_time_ge_latest() { + let latest = Utc::now(); + let read_time = latest + Duration::seconds(1); + let user = make_member(Some(read_time)); + assert!(user_has_read(&user, Some(latest))); + } + + #[test] + fn user_has_not_read_when_read_time_before_latest() { + let latest = Utc::now(); + let read_time = latest - Duration::seconds(10); + let user = make_member(Some(read_time)); + assert!(!user_has_read(&user, Some(latest))); + } + + #[test] + fn user_has_not_read_when_no_read_time_and_latest_present() { + let latest = Utc::now(); + let user = make_member(None); + assert!(!user_has_read(&user, Some(latest))); + } } \ No newline at end of file diff --git a/src/rooms/routes.rs b/src/rooms/routes.rs index 1f16367..3846b18 100644 --- a/src/rooms/routes.rs +++ b/src/rooms/routes.rs @@ -11,12 +11,12 @@ pub fn create_room_routes() -> Router> { .route("/api/rooms/{room_id}/users", get(handle_get_users_in_room)) .route("/api/rooms/{room_id}/detailed", get(handle_get_room_with_details)) .route("/api/rooms/{room_id}/timeline", get(handle_scroll_chat_timeline)) - .route("/api/rooms/{room_id}/mark-read", post(mark_room_as_read)) .route("/api/rooms/{room_id}", get(handle_get_room_list_item_by_id)) .route("/api/rooms/{room_id}/leave", post(handle_leave_room)) .route("/api/rooms/search", get(handle_search_existing_single_room)) .route("/api/rooms/{room_id}/invite/{user_id}", post(handle_invite_to_room)) .route("/api/rooms/{room_id}/upload-img", post(handle_save_room_image)) .route("/api/rooms", get(handle_get_joined_rooms)) + .route("/api/rooms/{room_id}/mark-read", post(mark_room_as_read)) .route("/api/rooms/{room_id}/read-states", get(handle_get_read_states)) } From 9344d10dd53c232a6ebdfd2ba1311a9b4dffd4ac Mon Sep 17 00:00:00 2001 From: JrTimha Date: Sat, 17 Jan 2026 13:58:36 +0100 Subject: [PATCH 4/7] Refactor `KeycloakAuthLayer` to allow unused variables and migrate `jsonwebtoken` from `aws_lc_rs` to `rust_crypto`, replacing and updating dependencies in `Cargo.{toml,lock}` accordingly. --- Cargo.lock | 331 ++++++++++++++++++++++++++---------------- Cargo.toml | 2 +- src/keycloak/layer.rs | 1 + 3 files changed, 205 insertions(+), 129 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f082939..8097ef8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,30 +225,6 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "aws-lc-rs" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" -dependencies = [ - "aws-lc-sys", - "untrusted 0.7.1", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f7720b74ed28ca77f90769a71fd8c637a0137f6fae4ae947e1050229cff57f" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", -] - [[package]] name = "axum" version = "0.8.8" @@ -325,6 +301,12 @@ dependencies = [ "fastrand", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.21.7" @@ -343,29 +325,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.104", - "which", -] - [[package]] name = "bit_field" version = "0.10.2" @@ -475,15 +434,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-expr" version = "0.15.8" @@ -520,17 +470,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.5.31" @@ -782,6 +721,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -792,6 +743,33 @@ dependencies = [ "typenum", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "darling" version = "0.20.10" @@ -963,18 +941,50 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "dyn-clone" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + [[package]] name = "educe" version = "0.6.0" @@ -996,6 +1006,27 @@ dependencies = [ "serde", ] +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1173,6 +1204,22 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "filetime" version = "0.2.25" @@ -1242,12 +1289,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "futures" version = "0.3.31" @@ -1356,6 +1397,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1399,6 +1441,17 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" version = "0.4.7" @@ -2042,13 +2095,19 @@ version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d119c6924272d16f0ab9ce41f7aa0bfef9340c00b0bb7ca3dd3b263d4a9150b" dependencies = [ - "aws-lc-rs", "base64 0.22.1", + "ed25519-dalek", "getrandom 0.2.15", + "hmac", "js-sys", + "p256", + "p384", "pem", + "rand 0.8.5", + "rsa", "serde", "serde_json", + "sha2", "signature", "simple_asn1", ] @@ -2062,12 +2121,6 @@ dependencies = [ "spin", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "lebe" version = "0.5.2" @@ -2163,16 +2216,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - [[package]] name = "libm" version = "0.2.11" @@ -2665,6 +2708,30 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "parking" version = "2.2.1" @@ -2859,13 +2926,12 @@ dependencies = [ ] [[package]] -name = "prettyplease" -version = "0.2.27" +name = "primeorder" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ - "proc-macro2", - "syn 2.0.104", + "elliptic-curve", ] [[package]] @@ -2961,7 +3027,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.0", + "rustc-hash", "rustls", "socket2 0.5.10", "thiserror 2.0.9", @@ -2979,7 +3045,7 @@ dependencies = [ "getrandom 0.2.15", "rand 0.8.5", "ring", - "rustc-hash 2.1.0", + "rustc-hash", "rustls", "rustls-pki-types", "slab", @@ -3314,6 +3380,16 @@ dependencies = [ "webpki-roots 1.0.1", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "rgb" version = "0.8.52" @@ -3331,7 +3407,7 @@ dependencies = [ "getrandom 0.2.15", "libc", "spin", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] @@ -3379,15 +3455,18 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] -name = "rustc-hash" -version = "2.1.0" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] [[package]] name = "rustix" @@ -3446,7 +3525,7 @@ checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -3557,6 +3636,20 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -4758,12 +4851,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -5041,18 +5128,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.43", -] - [[package]] name = "whoami" version = "1.5.2" diff --git a/Cargo.toml b/Cargo.toml index 6ef3ed9..87b74d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ redis = { version = "1.0.2", features = ["tokio-comp", "connection-manager"] } atomic-time = "0.1.5" educe = { version = "0.6.0", default-features = false, features = ["Debug"] } http = "1.3.1" -jsonwebtoken = { version = "10.1.0", features = ["aws_lc_rs"] } +jsonwebtoken = { version = "10.1.0", features = ["rust_crypto"] } nonempty = { version = "0.12.0", features = ["std"] } reqwest = { version = "0.12.24", features = ["json"], default-features = false } serde-querystring = "0.3.0" diff --git a/src/keycloak/layer.rs b/src/keycloak/layer.rs index b959d45..55bef1a 100644 --- a/src/keycloak/layer.rs +++ b/src/keycloak/layer.rs @@ -21,6 +21,7 @@ extern crate alloc; /// Authentication happens by looking for the `Authorization` header on requests and parsing the contained JWT bearer token. /// See the crate level documentation for how this layer can be created and used. #[derive(Clone, TypedBuilder)] +#[allow(unused_variables)] pub struct KeycloakAuthLayer where R: Role, From d419ba229382317d8ec1e9c23852f7461cd57eb6 Mon Sep 17 00:00:00 2001 From: JrTimha Date: Sat, 31 Jan 2026 00:35:38 +0100 Subject: [PATCH 5/7] bump versions --- Cargo.lock | 328 ++++++++++++++++++++++++++--------------------------- Cargo.toml | 33 +++--- 2 files changed, 175 insertions(+), 186 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8097ef8..6039fbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.6.4" @@ -105,9 +114,12 @@ checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" [[package]] name = "arc-swap" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +dependencies = [ + "rustversion", +] [[package]] name = "arcstr" @@ -138,6 +150,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "assertr" version = "0.4.2" @@ -202,6 +223,26 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.18", + "v_frame", + "y4m", +] + [[package]] name = "av1-grain" version = "0.2.4" @@ -342,9 +383,12 @@ dependencies = [ [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] [[package]] name = "block-buffer" @@ -357,9 +401,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.7" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" @@ -434,16 +478,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -458,9 +492,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -579,7 +613,7 @@ dependencies = [ "serde-untagged", "serde_core", "serde_json", - "toml 0.9.8", + "toml", "winnow", "yaml-rust2", ] @@ -648,6 +682,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.16" @@ -1156,9 +1199,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -1427,9 +1470,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.3" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" dependencies = [ "color_quant", "weezl", @@ -1560,12 +1603,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1855,9 +1897,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.8" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", @@ -1873,8 +1915,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core", - "zune-jpeg", + "zune-core 0.5.1", + "zune-jpeg 0.5.12", ] [[package]] @@ -1966,7 +2008,7 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "ism" -version = "0.7.2" +version = "0.7.5" dependencies = [ "assertr", "async-trait", @@ -1996,7 +2038,7 @@ dependencies = [ "snafu", "sqlx", "sqlx-cli", - "thiserror 2.0.9", + "thiserror 2.0.18", "time", "tokio", "tokio-stream", @@ -2011,15 +2053,6 @@ dependencies = [ "validator", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -2091,9 +2124,9 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "10.1.0" +version = "10.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d119c6924272d16f0ab9ce41f7aa0bfef9340c00b0bb7ca3dd3b263d4a9150b" +checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -2286,9 +2319,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loop9" @@ -2767,6 +2800,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "pathdiff" version = "0.2.3" @@ -2805,7 +2844,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 2.0.9", + "thiserror 2.0.18", "ucd-trie", ] @@ -2940,7 +2979,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.7", + "toml_edit", ] [[package]] @@ -3030,7 +3069,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.10", - "thiserror 2.0.9", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -3049,7 +3088,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.9", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -3149,19 +3188,21 @@ dependencies = [ [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", - "itertools 0.12.1", + "itertools", "libc", "libfuzzer-sys", "log", @@ -3170,23 +3211,21 @@ dependencies = [ "noop_proc_macro", "num-derive", "num-traits", - "once_cell", "paste", "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.0", + "rand_chacha 0.9.0", "simd_helpers", - "system-deps", - "thiserror 1.0.69", + "thiserror 2.0.18", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.20" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" dependencies = [ "avif-serialize", "imgref", @@ -3219,9 +3258,9 @@ dependencies = [ [[package]] name = "rdkafka" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1856d72dbbbea0d2a5b2eaf6af7fb3847ef2746e883b11781446a51dbc85c0" +checksum = "d7956f9ac12b5712e50372d9749a3102f4810a8d42481c5eae3748d36d585bcf" dependencies = [ "futures-channel", "futures-util", @@ -3237,9 +3276,9 @@ dependencies = [ [[package]] name = "rdkafka-sys" -version = "4.9.0+2.10.0" +version = "4.10.0+2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5230dca48bc354d718269f3e4353280e188b610f7af7e2fcf54b7a79d5802872" +checksum = "e234cf318915c1059d4921ef7f75616b5219b10b46e9f3a511a15eb4b56a3f77" dependencies = [ "cmake", "libc", @@ -3250,9 +3289,9 @@ dependencies = [ [[package]] name = "redis" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfe20977fe93830c0e9817a16fbf1ed1cfd8d4bba366087a1841d2c6033c251" +checksum = "e969d1d702793536d5fda739a82b88ad7cbe7d04f8386ee8cd16ad3eff4854a5" dependencies = [ "arc-swap", "arcstr", @@ -3581,9 +3620,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scylla" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42cf9feea170a110c5644c013a4dc790c24c60dc802f43df2ca69acae5112a4" +checksum = "3321054d79dc75f9f3ca449111983ddc3f59aff4561cddb860af884504b4fbc9" dependencies = [ "arc-swap", "async-trait", @@ -3592,13 +3631,13 @@ dependencies = [ "dashmap", "futures", "hashbrown 0.15.2", - "itertools 0.14.0", + "itertools", "rand 0.9.0", "rand_pcg", "scylla-cql", "smallvec", "socket2 0.5.10", - "thiserror 2.0.9", + "thiserror 2.0.18", "tokio", "tracing", "uuid", @@ -3606,19 +3645,19 @@ dependencies = [ [[package]] name = "scylla-cql" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5139a271deeb8b3b8118c28d19bb3519421ec4a131e3a39533503c526d415dc2" +checksum = "aa54ff27320ff09e24c9edf2acef2fa4a2a9b60bfb5832454d1a1768f6c036b7" dependencies = [ "byteorder", "bytes", "chrono", - "itertools 0.14.0", + "itertools", "lz4_flex", "scylla-macros", "snap", "stable_deref_trait", - "thiserror 2.0.9", + "thiserror 2.0.18", "tokio", "uuid", "yoke 0.8.0", @@ -3626,9 +3665,9 @@ dependencies = [ [[package]] name = "scylla-macros" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162aed3aa5b6985d121d9e7e4137efebd49645dee204962b2e9ab85176349119" +checksum = "16c9e9660119726312cd6c7bd3e286ffc80fb06a9b6d0e214a16df00600829e9" dependencies = [ "darling 0.20.10", "proc-macro2", @@ -3757,15 +3796,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - [[package]] name = "serde_spanned" version = "1.0.3" @@ -4063,7 +4093,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.9", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -4148,7 +4178,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.9", + "thiserror 2.0.18", "tracing", "uuid", "whoami", @@ -4187,7 +4217,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.9", + "thiserror 2.0.18", "tracing", "uuid", "whoami", @@ -4213,7 +4243,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.9", + "thiserror 2.0.18", "tracing", "url", "uuid", @@ -4317,25 +4347,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml 0.8.23", - "version-compare", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "tempfile" version = "3.15.0" @@ -4371,11 +4382,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.18", ] [[package]] @@ -4391,9 +4402,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -4421,7 +4432,7 @@ dependencies = [ "half", "quick-error", "weezl", - "zune-jpeg", + "zune-jpeg 0.4.19", ] [[package]] @@ -4491,9 +4502,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -4539,9 +4550,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -4562,18 +4573,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - [[package]] name = "toml" version = "0.9.8" @@ -4581,21 +4580,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ "serde_core", - "serde_spanned 1.0.3", - "toml_datetime 0.7.3", + "serde_spanned", + "toml_datetime", "toml_parser", "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - [[package]] name = "toml_datetime" version = "0.7.3" @@ -4605,19 +4595,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.12.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "winnow", -] - [[package]] name = "toml_edit" version = "0.23.7" @@ -4625,7 +4602,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap 2.12.0", - "toml_datetime 0.7.3", + "toml_datetime", "toml_parser", "winnow", ] @@ -4641,9 +4618,9 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -4657,9 +4634,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "bitflags", "bytes", @@ -4895,13 +4872,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.1", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -4958,12 +4935,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - [[package]] name = "version_check" version = "0.9.5" @@ -5470,6 +5441,12 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yaml-rust2" version = "0.10.4" @@ -5631,6 +5608,12 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -5646,5 +5629,14 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c9e525af0a6a658e031e95f14b7f889976b74a11ba0eca5a5fc9ac8a1c43a6a" dependencies = [ - "zune-core", + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" +dependencies = [ + "zune-core 0.5.1", ] diff --git a/Cargo.toml b/Cargo.toml index 87b74d9..fd8c949 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,40 +1,40 @@ [package] name = "ism" -version = "0.7.2" +version = "0.7.5" edition = "2024" [dependencies] -log = "0.4.28" +log = "0.4.29" axum = { version = "0.8.8", features = ["multipart"] } -tokio = {version = "1.48.0", features = ["full"]} -tower = "0.5.2" +tokio = {version = "1.49.0", features = ["full"]} +tower = "0.5.3" config = "0.15.18" serde = "1.0.228" -scylla = { version = "1.3.1", features = ["chrono-04"] } +scylla = { version = "1.4.1", features = ["chrono-04"] } futures = "0.3.31" -uuid = { version = "1.18.1", features = ["v4", "serde", "v7"] } -chrono = { version = "0.4.42", features = ["serde"] } -tower-http = { version = "0.6.6", features = ["cors", "trace"] } +uuid = { version = "1.20.0", features = ["v4", "serde", "v7"] } +chrono = { version = "0.4.43", features = ["serde"] } +tower-http = { version = "0.6.8", features = ["cors", "trace"] } tracing = "0.1.44" tracing-subscriber = { version = "0.3.22", features = ["env-filter"] } sqlx = {version = "0.8.6", features = ["runtime-tokio", "postgres", "chrono", "uuid", "macros"]} dotenv = "0.15.0" serde_json = "1.0.149" -tokio-stream = { version = "0.1.17", features = ["sync"] } -rdkafka = { version = "0.38.0", features = ["cmake-build", "tokio"] } +tokio-stream = { version = "0.1.18", features = ["sync"] } +rdkafka = { version = "0.39.0", features = ["cmake-build", "tokio"] } minio = { version = "0.3.0", features = ["default"] } -image = { version = "0.25.8"} +image = { version = "0.25.9"} bytes = "1.10.1" base64 = "0.22.1" validator = { version = "0.20.0", features = ["derive"] } -redis = { version = "1.0.2", features = ["tokio-comp", "connection-manager"] } +redis = { version = "1.0.3", features = ["tokio-comp", "connection-manager"] } #keycloak: atomic-time = "0.1.5" educe = { version = "0.6.0", default-features = false, features = ["Debug"] } -http = "1.3.1" -jsonwebtoken = { version = "10.1.0", features = ["rust_crypto"] } +http = "1.4.0" +jsonwebtoken = { version = "10.3.0", features = ["rust_crypto"] } nonempty = { version = "0.12.0", features = ["std"] } reqwest = { version = "0.12.24", features = ["json"], default-features = false } serde-querystring = "0.3.0" @@ -45,7 +45,7 @@ try-again = "0.2.2" typed-builder = "0.23.0" url = "2.5.7" async-trait = "0.1.89" -thiserror = "2.0.9" +thiserror = "2.0.18" [features] default = ["default-tls", "reqwest/charset", "reqwest/http2", "reqwest/macos-system-configuration"] @@ -55,7 +55,4 @@ rustls-tls = ["reqwest/rustls-tls"] [dev-dependencies] assertr = "0.4.2" -tower-http = { version = "0.6.6", features = ["trace"] } -tracing-subscriber = "0.3.20" -uuid = { version = "1.18.1", features = ["v7", "serde"] } sqlx-cli = { version = "0.8.6", features = ["postgres", "rustls"] } \ No newline at end of file From 654b19e4429190159fb3c42aee4b520976e271b0 Mon Sep 17 00:00:00 2001 From: JrTimha Date: Sun, 8 Feb 2026 11:12:26 +0100 Subject: [PATCH 6/7] remove default keyspace for cassandra queries --- src/database/message_database.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/database/message_database.rs b/src/database/message_database.rs index 64f8de1..ecdfe45 100644 --- a/src/database/message_database.rs +++ b/src/database/message_database.rs @@ -38,25 +38,22 @@ impl MessageDatabase { if config.with_db_init { repository.create_keyspace_with_tables().await; } - - if let Err(err) = repository.change_keyspace(&config.db_keyspace).await { - panic!("Failed to use keyspace {:?}", err); - } + repository } pub async fn fetch_data(&self, timestamp: DateTime, room_id: Uuid) -> Result, Box> { let session = self.session.clone(); - let mut iter: TypedRowStream = session.query_iter("SELECT chat_room_id, message_id, sender_id, msg_body, created_at, msg_type FROM chat_messages WHERE chat_room_id = ? AND created_at < ? ORDER BY created_at DESC LIMIT 25", (room_id, timestamp)) + let mut iter: TypedRowStream = session.query_iter("SELECT chat_room_id, message_id, sender_id, msg_body, created_at, msg_type FROM messaging.chat_messages WHERE chat_room_id = ? AND created_at < ? ORDER BY created_at DESC LIMIT 25", (room_id, timestamp)) .await?.rows_stream::()?; let mut messages: Vec = Vec::new(); while let Some(next) = iter.try_next().await? { messages.push(next) } Ok(messages) } - pub async fn fetch_specific_message(&self, message_id: &Uuid, room_id: &Uuid, created: &DateTime) -> Result> { + pub async fn fetch_specific_message(&self, message_id: &Uuid, room_id: &Uuid, created: &DateTime) -> Result> { let session = self.session.clone(); - let mut iter = session.query_iter("SELECT chat_room_id, message_id, sender_id, msg_body, created_at, msg_type FROM chat_messages WHERE chat_room_id = ? AND created_at = ? AND message_id = ?", (room_id, created, message_id)) + let mut iter = session.query_iter("SELECT chat_room_id, message_id, sender_id, msg_body, created_at, msg_type FROM messaging.chat_messages WHERE chat_room_id = ? AND created_at = ? AND message_id = ?", (room_id, created, message_id)) .await?.rows_stream::()?; match iter.try_next().await? { Some(message) => Ok(message), @@ -67,7 +64,7 @@ impl MessageDatabase { pub async fn insert_data(&self, message: Message) -> Result { let session = self.session.clone(); session.query_unpaged( - "INSERT INTO chat_messages (chat_room_id, message_id, sender_id, msg_body, msg_type, created_at) VALUES (?, ?, ?, ?, ?, ?)", + "INSERT INTO messaging.chat_messages (chat_room_id, message_id, sender_id, msg_body, msg_type, created_at) VALUES (?, ?, ?, ?, ?, ?)", (message.chat_room_id, message.message_id, message.sender_id, message.msg_body, message.msg_type, message.created_at) ).await } @@ -96,7 +93,7 @@ impl MessageDatabase { pub async fn clear_chat_room_messages(&self, room_id: &Uuid) -> Result<(), ExecutionError> { let session = self.session.clone(); - session.query_unpaged("DELETE FROM chat_messages WHERE chat_room_id = ?", (room_id,)).await?; + session.query_unpaged("DELETE FROM messaging.chat_messages WHERE chat_room_id = ?", (room_id,)).await?; Ok(()) } From 7f41a039be3d5634ab7b1298d6803f955a21dce4 Mon Sep 17 00:00:00 2001 From: JrTimha Date: Sun, 8 Feb 2026 11:19:22 +0100 Subject: [PATCH 7/7] fixing docker build --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index b0be9e0..013e674 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ ENV SQLX_OFFLINE=true RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libssl-dev \ + libcurl4-openssl-dev \ pkg-config \ cmake