[fractal] API: Remove m_direct from BackendData and BackendData itself



commit 7c177a3adc28d1c6890af184095cab362656d6b4
Author: Alejandro Domínguez <adomu net-c com>
Date:   Sat Jun 6 03:08:25 2020 +0200

    API: Remove m_direct from BackendData and BackendData itself

 fractal-gtk/src/app/backend_loop.rs     |  6 +--
 fractal-gtk/src/appop/room.rs           |  8 ++-
 fractal-gtk/src/appop/start_chat.rs     | 33 +++++++++---
 fractal-matrix-api/src/backend/mod.rs   | 16 ------
 fractal-matrix-api/src/backend/room.rs  | 93 +++++++++++++--------------------
 fractal-matrix-api/src/backend/sync.rs  |  4 --
 fractal-matrix-api/src/backend/types.rs |  9 +---
 7 files changed, 67 insertions(+), 102 deletions(-)
---
diff --git a/fractal-gtk/src/app/backend_loop.rs b/fractal-gtk/src/app/backend_loop.rs
index e67270bb..fb35823e 100644
--- a/fractal-gtk/src/app/backend_loop.rs
+++ b/fractal-gtk/src/app/backend_loop.rs
@@ -83,10 +83,6 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                 BKResponse::AttachedFile(Ok(msg)) => {
                     APPOP!(attached_file, (msg));
                 }
-                BKResponse::NewRoom(Ok(r), internal_id) => {
-                    let id = Some(internal_id);
-                    APPOP!(new_room, (r, id));
-                }
 
                 // errors
                 BKResponse::AccountDestructionError(err) => {
@@ -151,7 +147,7 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     );
                     APPOP!(show_error_dialog_in_settings, (error));
                 }
-                BKResponse::NewRoom(Err(err), internal_id) => {
+                BKResponse::NewRoomError(err, internal_id) => {
                     let err_str = format!("{:?}", err);
                     error!(
                         "{}",
diff --git a/fractal-gtk/src/appop/room.rs b/fractal-gtk/src/appop/room.rs
index 057eb210..5c8d381c 100644
--- a/fractal-gtk/src/appop/room.rs
+++ b/fractal-gtk/src/appop/room.rs
@@ -16,8 +16,7 @@ use crate::app::App;
 use crate::appop::AppOp;
 
 use crate::backend;
-use crate::backend::BKCommand;
-use crate::backend::BKResponse;
+use crate::backend::{BKCommand, BKResponse};
 use fractal_api::util::cache_dir_path;
 
 use crate::actions;
@@ -400,9 +399,8 @@ impl AppOp {
                     APPOP!(new_room, (r, id));
                 }
                 Err(err) => {
-                    tx.send(BKCommand::SendBKResponse(BKResponse::NewRoom(
-                        Err(err),
-                        int_id,
+                    tx.send(BKCommand::SendBKResponse(BKResponse::NewRoomError(
+                        err, int_id,
                     )))
                     .expect_log("Connection closed");
                 }
diff --git a/fractal-gtk/src/appop/start_chat.rs b/fractal-gtk/src/appop/start_chat.rs
index 3cba7936..148e5fd3 100644
--- a/fractal-gtk/src/appop/start_chat.rs
+++ b/fractal-gtk/src/appop/start_chat.rs
@@ -1,12 +1,16 @@
+use fractal_api::backend::room;
 use fractal_api::identifiers::RoomId;
+use fractal_api::util::ResultExpectLog;
 use gtk;
 use gtk::prelude::*;
+use std::thread;
 
 use crate::actions::AppState;
+use crate::app::App;
 use crate::appop::AppOp;
 use crate::appop::SearchType;
 
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 use crate::types::{Room, RoomMembership, RoomTag};
 
 impl AppOp {
@@ -20,15 +24,30 @@ impl AppOp {
 
         let internal_id = RoomId::new(&login_data.server_url.to_string())
             .expect("The server domain should have been validated");
-        self.backend
-            .send(BKCommand::DirectChat(
+
+        let int_id = internal_id.clone();
+        let member = user.0.clone();
+        let tx = self.backend.clone();
+        thread::spawn(move || {
+            match room::direct_chat(
                 login_data.server_url,
                 login_data.access_token,
                 login_data.uid,
-                user.0.clone(),
-                internal_id.clone(),
-            ))
-            .unwrap();
+                member,
+            ) {
+                Ok(r) => {
+                    let id = Some(int_id);
+                    APPOP!(new_room, (r, id));
+                }
+                Err(err) => {
+                    tx.send(BKCommand::SendBKResponse(BKResponse::NewRoomError(
+                        err, int_id,
+                    )))
+                    .expect_log("Connection closed");
+                }
+            }
+        });
+
         self.close_direct_chat_dialog();
 
         let fakeroom = Room {
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index 07b9515c..ed99aae0 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -1,8 +1,6 @@
-use std::collections::HashMap;
 use std::sync::mpsc::channel;
 use std::sync::mpsc::RecvError;
 use std::sync::mpsc::{Receiver, Sender};
-use std::sync::{Arc, Mutex};
 use std::thread;
 
 use crate::util::ResultExpectLog;
@@ -22,17 +20,12 @@ pub mod user;
 pub use self::types::BKCommand;
 pub use self::types::BKResponse;
 pub use self::types::Backend;
-pub use self::types::BackendData;
 pub use self::types::RoomType;
 
 impl Backend {
     pub fn new(tx: Sender<BKResponse>) -> Backend {
-        let data = BackendData {
-            m_direct: HashMap::new(),
-        };
         Backend {
             tx,
-            data: Arc::new(Mutex::new(data)),
             user_info_cache: CacheMap::new().timeout(60 * 60),
             thread_pool: ThreadPool::new(20),
         }
@@ -94,15 +87,6 @@ impl Backend {
                 let r = room::attach_file(self, server, access_token, msg);
                 bkerror!(r, tx, BKResponse::AttachedFile);
             }
-            Ok(BKCommand::DirectChat(server, access_token, uid, user, internal_id)) => {
-                let data = self.data.clone();
-
-                thread::spawn(move || {
-                    let room_res = room::direct_chat(data, server, access_token, uid, user);
-                    tx.send(BKResponse::NewRoom(room_res, internal_id))
-                        .expect_log("Connection closed");
-                });
-            }
 
             // Media module
             Ok(BKCommand::GetThumbAsync(server, media, ctx)) => {
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index 2d2a98bf..b1905572 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -7,7 +7,6 @@ use url::Url;
 
 use std::collections::HashMap;
 use std::convert::TryFrom;
-use std::sync::{Arc, Mutex};
 use std::time::Duration;
 
 use crate::error::Error;
@@ -23,7 +22,6 @@ use crate::util::HTTP_CLIENT;
 
 use crate::backend::types::BKResponse;
 use crate::backend::types::Backend;
-use crate::backend::types::BackendData;
 use crate::backend::types::RoomType;
 
 use crate::r0::config::get_global_account_data::request as get_global_account_data;
@@ -524,74 +522,51 @@ pub fn new_room(
 }
 
 fn update_direct_chats(
-    data: Arc<Mutex<BackendData>>,
     base: Url,
     access_token: AccessToken,
     user_id: UserId,
     room_id: RoomId,
     user: Member,
-) {
+) -> Result<(), Error> {
     let params = GetGlobalAccountDataParameters {
         access_token: access_token.clone(),
     };
 
-    let directs = get_global_account_data(base.clone(), &params, &user_id, "m.direct")
-        .map_err::<Error, _>(Into::into)
-        .and_then(|request| {
-            let response = HTTP_CLIENT
-                .get_client()?
-                .execute(request)?
-                .json::<JsonValue>()?;
+    let request = get_global_account_data(base.clone(), &params, &user_id, "m.direct")?;
+    let response: JsonValue = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-            response
-                .as_object()
-                .into_iter()
-                .flatten()
-                .map(|(uid, rooms)| {
-                    let roomlist = rooms
-                        .as_array()
-                        .unwrap()
-                        .iter()
-                        .map(|x| RoomId::try_from(x.as_str().unwrap_or_default()))
-                        .collect::<Result<Vec<RoomId>, IdError>>()?;
-                    Ok((UserId::try_from(uid.as_str())?, roomlist))
-                })
-                .collect::<Result<HashMap<UserId, Vec<RoomId>>, IdError>>()
-                .map_err(Into::into)
-        });
+    let mut directs = response
+        .as_object()
+        .into_iter()
+        .flatten()
+        .map(|(uid, rooms)| {
+            let roomlist = rooms
+                .as_array()
+                .unwrap()
+                .iter()
+                .map(|x| RoomId::try_from(x.as_str().unwrap_or_default()))
+                .collect::<Result<Vec<RoomId>, IdError>>()?;
+            Ok((UserId::try_from(uid.as_str())?, roomlist))
+        })
+        .collect::<Result<HashMap<UserId, Vec<RoomId>>, IdError>>()?;
 
-    match directs {
-        Ok(mut directs) => {
-            if let Some(v) = directs.get_mut(&user.uid) {
-                v.push(room_id);
-            } else {
-                directs.insert(user.uid, vec![room_id]);
-            }
-            data.lock().unwrap().m_direct = directs.clone();
-
-            let params = SetGlobalAccountDataParameters {
-                access_token: access_token.clone(),
-            };
-
-            if let Err(err) =
-                set_global_account_data(base, &params, &json!(directs), &user_id, "m.direct")
-                    .map_err::<Error, _>(Into::into)
-                    .and_then(|request| {
-                        HTTP_CLIENT
-                            .get_client()?
-                            .execute(request)
-                            .map_err(Into::into)
-                    })
-            {
-                error!("{:?}", err);
-            };
-        }
-        Err(err) => error!("Can't set m.direct: {:?}", err),
+    if let Some(v) = directs.get_mut(&user.uid) {
+        v.push(room_id);
+    } else {
+        directs.insert(user.uid, vec![room_id]);
+    }
+
+    let params = SetGlobalAccountDataParameters {
+        access_token: access_token.clone(),
     };
+
+    let request = set_global_account_data(base, &params, &json!(directs), &user_id, "m.direct")?;
+    HTTP_CLIENT.get_client()?.execute(request)?;
+
+    Ok(())
 }
 
 pub fn direct_chat(
-    data: Arc<Mutex<BackendData>>,
     base: Url,
     access_token: AccessToken,
     user_id: UserId,
@@ -618,8 +593,7 @@ pub fn direct_chat(
     let request = create_room(base.clone(), &params, &body)?;
     let response: CreateRoomResponse = HTTP_CLIENT.get_client()?.execute(request)?.json()?;
 
-    update_direct_chats(
-        data,
+    let directs = update_direct_chats(
         base,
         access_token,
         user_id,
@@ -627,6 +601,11 @@ pub fn direct_chat(
         user.clone(),
     );
 
+    if let Err(err) = directs {
+        error!("Can't set m.direct: {:?}", err);
+        return Err(err);
+    }
+
     Ok(Room {
         name: user.alias.clone(),
         direct: true,
diff --git a/fractal-matrix-api/src/backend/sync.rs b/fractal-matrix-api/src/backend/sync.rs
index 5dccccec..ef66e4fb 100644
--- a/fractal-matrix-api/src/backend/sync.rs
+++ b/fractal-matrix-api/src/backend/sync.rs
@@ -20,7 +20,6 @@ use crate::types::Room;
 use crate::types::RoomMembership;
 use crate::types::RoomTag;
 use crate::util::matrix_response;
-use crate::util::parse_m_direct;
 use crate::util::ResultExpectLog;
 
 use log::error;
@@ -45,7 +44,6 @@ pub fn sync(
     number_tries: u64,
 ) {
     let tx = bk.tx.clone();
-    let data = bk.data.clone();
 
     let (timeout, filter) = if !initial {
         (time::Duration::from_secs(30), Default::default())
@@ -246,8 +244,6 @@ pub fn sync(
                             }
                         });
                 } else {
-                    data.lock().unwrap().m_direct = parse_m_direct(&response.account_data.events);
-
                     let rooms_def = Room::from_sync_response(&response, user_id, base)
                         .map(|rooms| {
                             let def = join_to_room
diff --git a/fractal-matrix-api/src/backend/types.rs b/fractal-matrix-api/src/backend/types.rs
index fea331c6..4f8e1e7d 100644
--- a/fractal-matrix-api/src/backend/types.rs
+++ b/fractal-matrix-api/src/backend/types.rs
@@ -1,5 +1,4 @@
 use ruma_identifiers::{EventId, RoomId, UserId};
-use std::collections::HashMap;
 use std::sync::mpsc::Sender;
 use std::sync::{Arc, Condvar, Mutex};
 use std::thread;
@@ -44,7 +43,6 @@ pub enum BKCommand {
     SetRoom(Url, AccessToken, RoomId),
     ShutDown,
     AttachFile(Url, AccessToken, Message),
-    DirectChat(Url, AccessToken, UserId, Member, RoomId),
     SendBKResponse(BKResponse),
 }
 
@@ -67,7 +65,6 @@ pub enum BKResponse {
     RoomTopic(RoomId, String),
     MediaUrl(Url),
     AttachedFile(Result<Message, Error>),
-    NewRoom(Result<Room, Error>, RoomId),
     RoomNotifications(RoomId, i32, i32),
 
     //errors
@@ -104,6 +101,7 @@ pub enum BKResponse {
     SentMsgRedactionError(Error),
     JoinRoomError(Error),
     DirectorySearchError(Error),
+    NewRoomError(Error, RoomId),
 }
 
 #[derive(Debug, Clone, Copy)]
@@ -154,13 +152,8 @@ impl ThreadPool {
     }
 }
 
-pub struct BackendData {
-    pub m_direct: HashMap<UserId, Vec<RoomId>>,
-}
-
 pub struct Backend {
     pub tx: Sender<BKResponse>,
-    pub data: Arc<Mutex<BackendData>>,
 
     // user info cache, uid -> (name, avatar)
     pub user_info_cache: CacheMap<UserId, Arc<Mutex<(String, String)>>>,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]