summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api/chat.rs17
-rw-r--r--src/database/chat.rs30
-rw-r--r--src/main.rs2
-rw-r--r--src/types/chat.rs4
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")]