diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/api/chat.rs | 17 | ||||
-rw-r--r-- | src/database/chat.rs | 30 | ||||
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/types/chat.rs | 4 |
4 files changed, 30 insertions, 23 deletions
diff --git a/src/api/chat.rs b/src/api/chat.rs index 1e56c3e..02bdfbd 100644 --- a/src/api/chat.rs +++ b/src/api/chat.rs @@ -6,7 +6,7 @@ use tokio::sync::{Mutex, mpsc::{Sender, self}}; use crate::{ public::docs::{EndpointDocumentation, EndpointMethod}, types::{ - extract::{AuthorizedUser, Check, CheckResult, Database, Json}, + extract::{AuthorizedUser, Check, CheckResult, Database, Json, Log}, http::ResponseCode, chat::{ChatRoom, ChatEvent}, user::User, }, @@ -75,7 +75,8 @@ pub const CHAT_LIST: EndpointDocumentation = EndpointDocumentation { async fn list ( AuthorizedUser(user): AuthorizedUser, - Database(db): Database + Database(db): Database, + _: Log ) -> Response { let Ok(rooms) = ChatRoom::from_user_id(&db, user.user_id) else { return ResponseCode::InternalServerError.text("Failed to retrieve rooms") @@ -137,7 +138,7 @@ async fn create ( for user in &room.users { send_event(ChatEvent::Add { user_id: *user, - room_id: room.room_id + room: room.clone() }, &room).await; } @@ -191,10 +192,14 @@ async fn add ( return ResponseCode::BadRequest.text("User does not exist") }; - let Ok(room) = ChatRoom::from_user_and_room_id(&db, user.user_id, body.room_id) else { + let Ok(mut room) = ChatRoom::from_user_and_room_id(&db, user.user_id, body.room_id) else { return ResponseCode::BadRequest.text("Room doesnt exist or you are not in it") }; + if room.users.contains(&to_add.user_id) { + return ResponseCode::BadRequest.text("User is already in the room") + } + let Ok(success) = room.add_user(&db, to_add.user_id) else { return ResponseCode::InternalServerError.text("Failed to add user") }; @@ -202,10 +207,12 @@ async fn add ( if !success { return ResponseCode::BadRequest.text("User is already in the room") } + + room.users.push(to_add.user_id); send_event(ChatEvent::Add { user_id: to_add.user_id, - room_id: room.room_id + room: room.clone() }, &room).await; ResponseCode::Success.text("Successfully added user") diff --git a/src/database/chat.rs b/src/database/chat.rs index 7364211..99ec86c 100644 --- a/src/database/chat.rs +++ b/src/database/chat.rs @@ -61,9 +61,10 @@ impl Database { ); ", )?; + let row = stmt.query_map([user_id], |row| { - let room_id = row.get(0)?; - let name = row.get(1)?; + let room_id: u64 = row.get(0)?; + let name: String = row.get(1)?; let mut stmt2 = self.0.prepare( " @@ -72,20 +73,19 @@ impl Database { " )?; - let mut users = Vec::new(); - let _ = stmt2.query_map([room_id], |row2| { - let user_id = row2.get(0)?; - users.push(user_id); - Ok(()) - })?; + let users = stmt2.query_map([room_id], |row2| { + Ok(row2.get(0)?) + })?.into_iter().flatten().collect(); let room = ChatRoom { room_id, users, name }; + Ok(room) })?; + Ok(row.into_iter().flatten().collect()) } @@ -158,8 +158,8 @@ impl Database { let msg = stmt.query_row((user_id, room_id, date, content), |row| { let message_id = row.get(0)?; - let room_id = row.get(1)?; - let user_id = row.get(2)?; + let user_id = row.get(1)?; + let room_id = row.get(2)?; let date = row.get(3)?; let content = row.get(4)?; @@ -182,17 +182,17 @@ impl Database { " SELECT * FROM chat_messages WHERE room_id = ? - AND message_id < newest_message - ORDER BY message_id ASC + AND message_id < ? + ORDER BY message_id DESC LIMIT ? OFFSET ? " )?; - let messages = stmt.query_map((room_id, 20, 20 * page), |row| { + let messages = stmt.query_map((room_id, newest_message, 20, 20 * page), |row| { let message_id = row.get(0)?; - let room_id = row.get(1)?; - let user_id = row.get(2)?; + let user_id = row.get(1)?; + let room_id = row.get(2)?; let date = row.get(3)?; let content = row.get(4)?; diff --git a/src/main.rs b/src/main.rs index 817f8ac..cc8a61e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,7 +46,7 @@ async fn main() { tracing_subscriber::registry() .with( fmt_layer - .with_filter(LevelFilter::TRACE) + .with_filter(LevelFilter::INFO) .with_filter(filter_fn(|metadata| { metadata.target().starts_with("xssbook") })), diff --git a/src/types/chat.rs b/src/types/chat.rs index ab3390c..8413f77 100644 --- a/src/types/chat.rs +++ b/src/types/chat.rs @@ -2,7 +2,7 @@ use serde::{Serialize, Deserialize}; use tracing::instrument; use crate::{types::http::{ResponseCode, Result}, database::Database}; -#[derive(Serialize, Clone, Debug)] +#[derive(Deserialize, Serialize, Clone, Debug)] pub struct ChatRoom { pub room_id: u64, pub users: Vec<u64>, @@ -33,7 +33,7 @@ pub enum ChatEvent { #[serde(rename = "add")] Add { user_id: u64, - room_id: u64 + room: ChatRoom }, #[serde(rename = "leave")] |