1+ use std:: collections:: HashMap ;
2+
13use crate :: {
24 data:: { CLIENTS , CONVERSATIONS , GROUPS } ,
35 types:: { DmChat , GroupChat } ,
@@ -75,10 +77,23 @@ async fn create_new_session(payload: Vec<u8>, client_id: String) -> ServerRespon
7577 session_key = dm. session_key . clone ( ) ;
7678 }
7779 None => {
80+ let mut members: HashMap < String , bool > = HashMap :: new ( ) ;
81+ members. insert ( client_id. clone ( ) , true ) ;
82+ members. insert ( new_session. id . clone ( ) , true ) ;
83+
84+ for member in members. keys ( ) {
85+ let mut guard = CLIENTS . lock ( ) . await ;
86+ if let Some ( client) = guard. get_mut ( member) {
87+ if !client. dms . contains ( & session_id) {
88+ client. dms . push ( session_id. clone ( ) ) ;
89+ }
90+ }
91+ }
92+
7893 let dm_chat = DmChat {
7994 dm_id : session_id. clone ( ) ,
8095 session_key : session_key. clone ( ) ,
81- members : ( client_id . clone ( ) , new_session . id . clone ( ) ) ,
96+ members,
8297 } ;
8398
8499 conversations
@@ -101,7 +116,7 @@ async fn create_new_session(payload: Vec<u8>, client_id: String) -> ServerRespon
101116 }
102117 } ;
103118
104- if !group. members . contains ( & client_id) {
119+ if !group. members . contains_key ( & client_id) {
105120 response. success = false ;
106121 response. error = Some ( "You are not a member of this group" . to_string ( ) ) ;
107122
@@ -110,6 +125,22 @@ async fn create_new_session(payload: Vec<u8>, client_id: String) -> ServerRespon
110125
111126 let session_id = group. group_id . clone ( ) ;
112127 let session_key = group. session_key . clone ( ) ;
128+
129+ {
130+ let mut guard = CLIENTS . lock ( ) . await ;
131+ if let Some ( client) = guard. get_mut ( & client_id) {
132+ if !client. groups . contains ( & session_id) {
133+ client. groups . push ( session_id. clone ( ) ) ;
134+ }
135+ }
136+ }
137+ {
138+ let mut groups = GROUPS . lock ( ) . await ;
139+ if let Some ( group) = groups. get_mut ( & session_id) {
140+ group. members . insert ( client_id. clone ( ) , true ) ;
141+ }
142+ }
143+
113144 ( session_id, session_key)
114145 }
115146 } ;
@@ -136,7 +167,7 @@ async fn create_new_group(payload: Vec<u8>, client_id: String) -> ServerResponse
136167 error : None ,
137168 } ;
138169
139- let mut members: Vec < String > = Vec :: new ( ) ;
170+ let mut members: HashMap < String , bool > = HashMap :: new ( ) ;
140171
141172 let ( group_info, _) : ( NewGroupPayload , usize ) =
142173 match bincode:: decode_from_slice ( & payload, bincode:: config:: standard ( ) ) {
@@ -149,10 +180,10 @@ async fn create_new_group(payload: Vec<u8>, client_id: String) -> ServerResponse
149180 }
150181 } ;
151182
152- members. extend_from_slice ( & group_info. members ) ;
153- if !members. contains ( & client_id) {
154- members. push ( client_id. clone ( ) ) ;
183+ for member in & group_info. members {
184+ members. insert ( member. clone ( ) , false ) ;
155185 }
186+ members. insert ( client_id. clone ( ) , true ) ;
156187
157188 let group_id = group_info
158189 . group_id
@@ -162,7 +193,7 @@ async fn create_new_group(payload: Vec<u8>, client_id: String) -> ServerResponse
162193 group_id : group_id. clone ( ) ,
163194 session_key : session_key. clone ( ) ,
164195 admin : client_id. clone ( ) ,
165- members,
196+ members : members . clone ( ) ,
166197 } ;
167198
168199 {
@@ -186,6 +217,15 @@ async fn create_new_group(payload: Vec<u8>, client_id: String) -> ServerResponse
186217 }
187218 }
188219
220+ for member in members. keys ( ) {
221+ let mut guard = CLIENTS . lock ( ) . await ;
222+ if let Some ( client) = guard. get_mut ( member) {
223+ if !client. groups . contains ( & group_id) {
224+ client. groups . push ( group_id. clone ( ) ) ;
225+ }
226+ }
227+ }
228+
189229 let res_payload = NewGroupResponse {
190230 group_id,
191231 session_key,
@@ -231,19 +271,20 @@ async fn add_group_member(payload: Vec<u8>, client_id: String) -> ServerResponse
231271 return response;
232272 }
233273
234- let member = match CLIENTS . lock ( ) . await . get ( & data. member_id ) {
235- Some ( member) => member. clone ( ) ,
274+ match CLIENTS . lock ( ) . await . get ( & data. member_id ) . cloned ( ) {
275+ Some ( mut member) => {
276+ if !group. members . contains_key ( & member. user_id ) {
277+ group. members . insert ( member. user_id . clone ( ) , true ) ;
278+ }
279+ member. groups . push ( group. group_id . clone ( ) ) ;
280+ }
236281 None => {
237- response . success = false ;
238- response . error = Some ( "Member not found" . to_string ( ) ) ;
239- return response ;
282+ if !group . members . contains_key ( & data . member_id ) {
283+ group . members . insert ( data . member_id . clone ( ) , false ) ;
284+ }
240285 }
241286 } ;
242287
243- if !group. members . contains ( & member. user_id ) {
244- group. members . push ( member. user_id . clone ( ) ) ;
245- }
246-
247288 response. payload = Some (
248289 bincode:: encode_to_vec ( "Member Added successfully" , bincode:: config:: standard ( ) ) . unwrap ( ) ,
249290 ) ;
0 commit comments