From c0d70077d7fd7bc38d79e5f9da9ab916ae8a6288 Mon Sep 17 00:00:00 2001 From: Romain Mallard Date: Thu, 1 Jan 2026 15:29:20 +0100 Subject: [PATCH] add user to conv & conv create fix --- db/1.sqlite-shm | Bin 32768 -> 32768 bytes db/1.sqlite-wal | Bin 41232 -> 177192 bytes src/chat/extractor.rs | 2 +- src/chat/handlers.rs | 91 +++++++++++++++++++++++++++++------------- 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/db/1.sqlite-shm b/db/1.sqlite-shm index b2face39d1bf44bba0ef8a7861e221d8c3136ed9..a0e293166880742ff681425de514fdc694a5df81 100644 GIT binary patch literal 32768 zcmeI)NiIcE5C-61-}CfO-}g+c!BlL66UVpoR;}!o5_U?wZch$RW=}7Vdyj7S4|dOLH~0PL7f%n*hmZ9i=2x|= zRn>j@uo^GRqxbF5RbsWTO7E|BNonL(cfWJ4>Q=d*)HC1PKpvBK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk J1PC-s;1!wtHGTj9 delta 167 zcmZo@U}|V!s+V}A%K!pgK+MR%AONB_voJ8M<2uh}6!q2bijj*>v%rxj={w$w%|2|s zl2r8|vq1o4?tdfz7Gz*xVqloqsK42SG0S6e0AtJKd7c8BofuuXnHd?FHajwMYXbmN Cv@yE? diff --git a/db/1.sqlite-wal b/db/1.sqlite-wal index 7af4a3a68e74e8d3d49e0a655b9aca8641254229..d35d8df1a8327295bf5be687b9e08079a7ed4d4e 100644 GIT binary patch literal 177192 zcmeI*e{7s}9l-JD*>lhR>e_EZhU<3L-ZIG`-NEzRb9ZeYWCG5F5kQSLaUj;)INHXx zhj+JOfkfQ+O9R71Kx&2zK~qVX{18#WC|%6NMHa+v8Z*Q#8qqOC!4N_He6PFiZtb>~ zjc#q<50{7C^Zh=*UeEQ9``qXA{kDB6xXDQTsmU-J4ZXaWT)lF0ud<_) zk%RcDr0;aBu%)Hd>&cgLeO=un!viD3g>2s>hmcDQMPf!vz&0XdSCT4UNh(o$D&4O- zE^txd&%aBbKlE?n0w;RNv?G830tg_000IagfB*srAaD$UGb=7|I6`r(xIp01>bStC zcMU}rbiKU2UT)1+YYoX2ct#DWo8_M@2q1s}0tg_000IagfB*srATU*dxNV#Ajoez- zm({Pa-~N*cN4}mreyZJfo#ue_INP(=6*lx7)!gPMy=9hdnlUf1pgQe9|Ja|2J4tEx z)5-V(+mvj8fbKE&wLe{z4v_X8uf?>(HF1GT2gmbM8Q*J@m_SWj;FgBn4|o2?tRpTk z)dx*K1Q0*~0R#|0009ILKmY**CJ~syxIpj}#s#i;>Vj)t-FoXG9Ty0yRaN-{@`eQg z1Q0*~0R#|0009ILKmY**ssxq<j+kd+>w!|gU{B>tp#i20;`A%@YjF<0tg_000IagfB*srATSRFjuRJH5}sH` zkn%m5QLz1_>j*^pG{gnGOEz9^Zm|BP;{xM#1Y`LEtJJo6`1HAD1Q0*~0R#|0009IL zKmdXHE^zwd0wKv4SQ?RO38ac)LG>60<=BJUc6dI5Q<*OieLnigRc~CKoTQF`xWIh> zOW^(yKmY**5I_I{1Q0*~f%z$LoVdVbbp)q4Utosg0&B8^Z#~xkL{R4o1k~EGaRZ>UkVMLntRSNqkV?#Y4x0tg_000IagfB*srAb#*J^Zk_#b#groNBY$T zteDxKD;BfexyHt*bgn*AC}LWR%exmX*)OE;r4kny-tB$%tq|KmY**5I_I{1Q0*~0R#|0pd!!|vW;-PCw2dsgyYI9?s~rG`6;Kxl9rfP z$`wmq+#MSjz)d96ao6#^cHhf18`5EMxr0+~b~>t?n}X78=p&~St{gcd2k}!fnqkKZ zTUuJZo_s0S*VR2TJTNj`$o5Tg2)W2mBxbY(#;+t*zLHd;_Egd@Y8ZjXD{+C}wjQec z?k%5cmW>h@*k`D>)tl-y^@=(mZ&(mO009ILKmY**5I_I{1Q0-A775svX@)|29SrKV zZR>R)px2fx;jr9HO&!5k9{j`F$DQZ*Q%5k19y6DU00IagfB*srAbXBM7NwHFX5?mIVO>5I_I{1Q0*~0R#|00D<`>&=i(T{0Y?p z8Q*p1WF5iwLl@t)EW7C&x{e?uv4QG30(r}V00IagfB*srAbImMtY}6fH zzih9rBM7S(j;bS&4J-&CfB*srAb z*~EeX0tg_000IagfB*srAb`Lu5m*tG@_<$^JHFg>UG}Eyl1?&{a9nxCUC;MAd?!U6 zL2~uV&5b(_{PxLTHJ|s~tyx`15K+4()Dg%g76cGL009ILKmY**5I_I{1Q0j_1$6B| zG&=1%g7R2`FCLBy{O^wQ?)}5{Z~d`eh8PS_$QNkXN4~%r_~5xD1Q0*~0R#|0009IL zKmdVb2uwL&K(gkShU>kfG70A4xPyORvtiHY9<*PH$`FI$iTMJ%$QL-qM~%%0Ab7ea#}1I)*$AUa>bGtcO?lSop9Ym zG97mv-)r~1OtT>!7MD9XknNk~5P}qn#Eh1}_?4u}SCUH9o=W=3Py&I+D|G~4&F|Q>`|0{m=zM`tZN9)> zCD{Vx3ryqVM^^+8KmY**5I_I{1Q0*~0R(1HU@Tui?K_e$ASVxoLV9~JsMofw*MWdu zTe5`1(xWC{pz~W_G#~qB;%S{P5Uj};7|RwQUtk6wD5pXI0R#|0009ILKmY**5I9MJ zspkvqHLjZO_yTh>U*Nv*wp+jc``y>-e1TwXzCbx!fP8_I{7AAp0tg_000IagfB*sr zAbqSr?5yzqgE;|@0LQ!5#F@T8wR2S5M;1Q0*~0R#|0 z009ILm_dQ*)DfI>!a9N#b>%_-))eDwO7V~M<+20utMWI>pnsW!$zVsLS8=gLtu2(~bt=1aqCH0KDS*=wMs8wp)v@VCv2q1s}0tg_0 z00IagfB*sr%mslZA={K$0|R5z1|}29j<}oh9Y>}OlrPV*$b=?OW)y6X+p<^8v)1)x z^{cY8Bhv*seyZJfo#ue_INP(=6*lx7)!gPMJ)sMmF>mRTVEOcQljJ4D7uaSb<^}bH zh-1?brmLnQO#6=4V%p)uGbYw{aAZEkjPJEcOrRz%aPdgPZP&HGZ>f$81c(dFh0ibd zfB*srAbF0gzi;sUkf3;g`^9ao1AeeVa8%~Qzu0w?!DVs8Wx zKmY**5I_I{1Q0*~ftePV&iDc+o~Lj=j4yCs^oRcHgP++m={$vuFEG;|V9tjC0tg_0 z00IagfB*srAb`M>1;)o07@wzbD&q^(<_oCYqxaPP_*qDq216VAHeL zyuRn{x}CC7;sOT@^|pFby{2AK2V^b+@&(S2&o!5U00IagfB*srAbtm62cBxQKfYttmv5?9JB^^)VyHLNsM?~QRQId>YH;E?*@6H92q1s} z0tg_000IagfB*vTLSRwUN|@{O0~>RNVz$(qALuIe-w;%`)nfI^#(`44Flde*Tokr0 zh>UOO>gg@&hQ^R}j#j?HyM=*On`CKUi2q1s}0tg_000Iag zfWZ6{n7oc);X=JV7}RUq*6Tn(uPs@^VHsQC(dzL9e!cydv0HZi?NGfMlJNyv4HocDfB*srAb5@q} zuDs%|=cgqv!HF-h%}C4(9vN0JT{Wy=+IPGb(+<~+J6P%9cz!D5du>O@1#WzQ@0A~m z_IyXj1%eIlRK*1v-XSh9@BbD6KmY**5I_I{1Q0*~0R-ljz)JbXADPNG{baj*QJ<4> Gf&T+qS2wr- delta 9 QcmZ4Sf@{JdrVRoM0T+4%Pyhe` diff --git a/src/chat/extractor.rs b/src/chat/extractor.rs index 4041c4a..8d7fb45 100644 --- a/src/chat/extractor.rs +++ b/src/chat/extractor.rs @@ -13,7 +13,7 @@ use serde::Deserialize; #[derive(Deserialize, Debug)] pub struct CreateConversationValues{ //pub creator_id: i32, // already in token ? - pub title: String, + pub name: String, } pub struct CreateConversationPayload(pub CreateConversationValues); diff --git a/src/chat/handlers.rs b/src/chat/handlers.rs index 6945c7e..c60b24e 100644 --- a/src/chat/handlers.rs +++ b/src/chat/handlers.rs @@ -22,7 +22,8 @@ use crate::utils::db_pool::{AppState}; use crate::utils::auth::AuthClaims; - +//TODO: update conversation title +//FIXME: make a default title if empty pub async fn create_conversation( State(state): State, AuthClaims {user_id, hotel_id}: AuthClaims, @@ -37,18 +38,51 @@ pub async fn create_conversation( }; let result = conn.execute( - "INSERT INTO conversation (creator_id, title) VALUES (?1, ?2)", - params![&user_id, &payload.title], -); + "INSERT INTO conversation (creator_id, name) VALUES (?1, ?2)", + params![&user_id, &payload.name], + ); - match result { - Ok(rows) if rows > 0 => (StatusCode::OK, format!("Created conversation {}", payload.title)), - Ok(_) => (StatusCode::NOT_FOUND, "not able to create the conversation".to_string() ), - Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error when creating the conversation : {err}")), - + let rows = match result { + Ok(rows) => rows, + Err(err) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Error when creating the conversation: {err}") + ); + } + }; + + if rows == 0 { + return ( + StatusCode::NOT_FOUND, + "not able to create the conversation".to_string() + ); } + + + let conv_id = conn.last_insert_rowid(); + + let user_conv_rel = conn.execute( + "INSERT INTO conversation_participants (conversation_id, user_id, name) + VALUES (?1, ?2, ?3)", + params![conv_id, user_id, payload.name] + ); + + match user_conv_rel { + Ok(r) => return (StatusCode::OK, format!("Created conversation {}", payload.name)), + Err(err) => return ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Error when creating the conversation: {err}") + ) + } + + // extra logic here (more queries, validations, etc.) + + //(StatusCode::OK, format!("Created conversation {}", payload.name)) + } +//FIXME: add title to conv pub async fn add_user_to_conv( State(state): State, AuthClaims {user_id, hotel_id}: AuthClaims, @@ -62,16 +96,15 @@ pub async fn add_user_to_conv( Err(err) => return (StatusCode::INTERNAL_SERVER_ERROR, format!("Pool error")) }; - let is_creator = match conn + let creator_name: Option = match conn .query_row( - "SELECT 1 FROM conversation WHERE creator_id = ?1 AND id = ?2", + "SELECT name FROM conversation WHERE creator_id = ?1 AND id = ?2", params![user_id, payload.conv_id], - |_| Ok(()), + |row| row.get(0), ) - .optional() - { - Ok(Some(_)) => true, - Ok(None) => false, + .optional() { + Ok(name) => name, + //Ok(None) => false, Err(_) => { return ( StatusCode::INTERNAL_SERVER_ERROR, @@ -80,6 +113,8 @@ pub async fn add_user_to_conv( } }; + let is_creator = creator_name.is_some(); + if !is_creator { return ( StatusCode::FORBIDDEN, @@ -87,9 +122,8 @@ pub async fn add_user_to_conv( ); } - //fix this -let existing: HashSet = { + let existing: HashSet = { let mut stmt = match conn.prepare( "SELECT user_id FROM conversation_participants WHERE conversation_id = ?1", ) { @@ -104,14 +138,14 @@ let existing: HashSet = { match stmt.query_map(params![payload.conv_id], |row| row.get(0)) { Ok(rows) => rows.filter_map(Result::ok).collect(), - Err(_) => { - return ( - StatusCode::INTERNAL_SERVER_ERROR, - "Query participants failed".to_string(), - ) + Err(_) => { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "Query participants failed".to_string(), + ) + } } - } -}; // ← stmt dropped HERE + }; // ← stmt dropped HERE let payload_users: HashSet = payload.users.into_iter().collect(); @@ -137,9 +171,9 @@ let existing: HashSet = { for user_id in to_add { if let Err(err) = tx.execute( - "INSERT INTO conversation_participants (conversation_id, user_id) - VALUES (?1, ?2)", - params![payload.conv_id, user_id], + "INSERT INTO conversation_participants (conversation_id, user_id, name) + VALUES (?1, ?2, ?3)", + params![payload.conv_id, user_id, creator_name], ) { return ( StatusCode::INTERNAL_SERVER_ERROR, @@ -421,6 +455,7 @@ struct Conversation { title: String, } +//FIXME: allow null conv name ? default to persons name pub async fn get_convs( State(state): State, //Path((item_name, item_amount)): Path<(String, i32)>,