From e2c04505ac2550486d8ec65be5da7de0decb1449 Mon Sep 17 00:00:00 2001 From: Romain Mallard Date: Thu, 25 Sep 2025 12:41:52 +0200 Subject: [PATCH] add user to conv endpoint --- db/1.sqlite | Bin 32768 -> 40960 bytes src/chat/extractor.rs | 23 ++++++++++++++++++ src/chat/handlers.rs | 54 ++++++++++++++++++++++++++++++++++++++---- src/chat/routes.rs | 8 +++++-- 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/db/1.sqlite b/db/1.sqlite index 1258c17a35da95dbf6a60939f6005e4d901551e9..c2779feb148c89d8e37bdddd348dbf57e4e75f81 100644 GIT binary patch delta 584 zcmZo@U}`wPG(lQWl!1YP3y9f(mi!$g{74q^vVPNOJ$iT0}f0pk8&ubno zK1S|~+$XtDZfq>zGH8t8U>DcbWo$|=NleN~P0r6NOD!r+EXmBzi!aG7K<9H#*5#FE z21-m;<13haoL831o|8>HSeKE(oOAL_J~KwH&0IXU7}fcIFvyClsxmeyBN^Km0&V#u7{{j2u{HHb2jo z6c7NJ#=^f1>Qeq~K=YRI8>+AZ9jI!YT$GwvlA5BBSfXH$X10Zuu^Ez&CO`L= +} + +pub struct AddUserConversationPayload(pub AddUserConversationValues); + +impl FromRequest for AddUserConversationPayload +where S: Send + Sync, +{ + type Rejection = (StatusCode, String); + + async fn from_request(req: Request, state: &S) -> Result { + let Json(payload) = Json::::from_request(req, state) + .await + .map_err(|err| (StatusCode::BAD_REQUEST, format!("Invalid body: {}", err)))?; + + Ok(AddUserConversationPayload(payload)) + + } +} \ No newline at end of file diff --git a/src/chat/handlers.rs b/src/chat/handlers.rs index 12113ec..3bfbc9b 100644 --- a/src/chat/handlers.rs +++ b/src/chat/handlers.rs @@ -2,15 +2,13 @@ use axum::{ extract::{ FromRequest,FromRequestParts, State, - }, - response::IntoResponse, - http::StatusCode, + }, http::StatusCode, response::{sse::KeepAlive, IntoResponse} }; use rusqlite::params; use crate::chat::extractor::{ -CreateConversationPayload, +AddUserConversationPayload, CreateConversationPayload }; use crate::utils::db_pool::{AppState}; use crate::utils::auth::AuthClaims; @@ -41,4 +39,52 @@ pub async fn create_conversation( Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error when creating the conversation : {err}")), } +} + +pub async fn add_user_to_conv( + State(state): State, + AuthClaims {user_id, hotel_id,username}: AuthClaims, + AddUserConversationPayload(payload):AddUserConversationPayload +) -> impl IntoResponse { + + let pool = state.hotel_pools.get_pool(hotel_id); + + let conn = match pool.get(){ + Ok(conn) => conn, + Err(err) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Pool error")) + }; + + let mut statement = match conn.prepare( + "SELECT 1 FROM conversation WHERE creator_id = ?1 AND id = ?2" , + ){ + Ok(statement) => statement, + Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "prepare failed".to_string()) + }; + + if !statement.exists(params![user_id, payload.conv_id ]) + .map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Query failed".to_string())).unwrap() + { + // Early exit if not creator + return ((StatusCode::FORBIDDEN, "Not the creator".to_string())); + } + + + for target_id in &payload.users { + let rows_inserted = match conn.execute( + "INSERT INTO conversation_participants (conversation_id, user_id) VALUES (?1, ?2)", + params![payload.conv_id, target_id], + ) { + Ok(n) => n, + Err(err) => { + return (StatusCode::INTERNAL_SERVER_ERROR, format!("Err adding user {}: {}", target_id, err)); + } + }; + + if rows_inserted == 0 { + return (StatusCode::NOT_FOUND, format!("Could not add user {}", target_id)); + } + } + + return (StatusCode::OK, "ok".to_string()); + } \ No newline at end of file diff --git a/src/chat/routes.rs b/src/chat/routes.rs index d867310..3c03755 100644 --- a/src/chat/routes.rs +++ b/src/chat/routes.rs @@ -4,7 +4,9 @@ use axum::{ }; use crate::utils::db_pool::AppState; -use crate::chat::handlers::create_conversation; +use crate::chat::handlers::{ + create_conversation,add_user_to_conv, +}; @@ -14,4 +16,6 @@ pub fn chat_routes() -> Router { Router::new() .route("/create_conversation", put (create_conversation)) -} \ No newline at end of file + .route("/add_users_conv", put(add_user_to_conv)) + + } \ No newline at end of file