[fractal] API, user: Call functions directly instead of using the loop



commit de1c9ecd713e35278dad4528df96024aa83b78b8
Author: Alejandro DomĂ­nguez <adomu net-c com>
Date:   Fri Apr 17 08:08:12 2020 +0200

    API, user: Call functions directly instead of using the loop

 fractal-gtk/src/actions/account_settings.rs |  30 +++---
 fractal-gtk/src/app/backend_loop.rs         |   6 +-
 fractal-gtk/src/app/connect/account.rs      |   2 +-
 fractal-gtk/src/app/connect/direct.rs       |   9 +-
 fractal-gtk/src/app/connect/invite.rs       |   8 +-
 fractal-gtk/src/appop/account.rs            | 137 ++++++++++++++++++----------
 fractal-gtk/src/appop/member.rs             |  23 ++---
 fractal-gtk/src/appop/mod.rs                |   3 +-
 fractal-gtk/src/appop/user.rs               |  35 ++++---
 fractal-gtk/src/cache/mod.rs                |  23 +++--
 fractal-gtk/src/widgets/address.rs          |  94 +++++++++----------
 fractal-gtk/src/widgets/message.rs          |   2 -
 fractal-matrix-api/src/backend/mod.rs       | 114 +----------------------
 fractal-matrix-api/src/backend/types.rs     |  22 +----
 fractal-matrix-api/src/backend/user.rs      |   9 +-
 15 files changed, 215 insertions(+), 302 deletions(-)
---
diff --git a/fractal-gtk/src/actions/account_settings.rs b/fractal-gtk/src/actions/account_settings.rs
index 5add2060..0a128cf8 100644
--- a/fractal-gtk/src/actions/account_settings.rs
+++ b/fractal-gtk/src/actions/account_settings.rs
@@ -1,16 +1,18 @@
 use crate::i18n::i18n;
+use fractal_api::backend::user;
 use fractal_api::identifiers::UserId;
 use fractal_api::r0::AccessToken;
 use fractal_api::url::Url;
+use fractal_api::util::ResultExpectLog;
 use gio::prelude::*;
 use gio::SimpleAction;
 use gio::SimpleActionGroup;
 use gtk;
 use std::sync::mpsc::Sender;
+use std::thread;
 
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 
-use crate::widgets::ErrorDialog;
 use crate::widgets::FileDialog::open;
 
 use crate::actions::ButtonState;
@@ -18,7 +20,7 @@ use crate::actions::ButtonState;
 // This creates all actions a user can perform in the account settings
 pub fn new(
     window: &gtk::Window,
-    backend: &Sender<BKCommand>,
+    tx: Sender<BKCommand>,
     server_url: Url,
     access_token: AccessToken,
     uid: UserId,
@@ -31,24 +33,22 @@ pub fn new(
     actions.add_action(&change_avatar);
 
     let window_weak = window.downgrade();
-    let backend = backend.clone();
     change_avatar.connect_activate(move |a, _| {
         let window = upgrade_weak!(window_weak);
         let filter = gtk::FileFilter::new();
         filter.add_mime_type("image/*");
         filter.set_name(Some(i18n("Images").as_str()));
         if let Some(path) = open(&window, i18n("Select a new avatar").as_str(), &[filter]) {
-            if let Some(file) = path.to_str() {
-                a.change_state(&ButtonState::Insensitive.into());
-                let _ = backend.send(BKCommand::SetUserAvatar(
-                    server_url.clone(),
-                    access_token.clone(),
-                    uid.clone(),
-                    file.to_string(),
-                ));
-            } else {
-                ErrorDialog::new(false, &i18n("Couldn’t open file"));
-            }
+            a.change_state(&ButtonState::Insensitive.into());
+            let tx = tx.clone();
+            let server_url = server_url.clone();
+            let access_token = access_token.clone();
+            let uid = uid.clone();
+            thread::spawn(move || {
+                let query = user::set_user_avatar(server_url, access_token, uid, path);
+                tx.send(BKCommand::SendBKResponse(BKResponse::SetUserAvatar(query)))
+                    .expect_log("Connection closed");
+            });
         }
     });
 
diff --git a/fractal-gtk/src/app/backend_loop.rs b/fractal-gtk/src/app/backend_loop.rs
index 45385047..326c9e65 100644
--- a/fractal-gtk/src/app/backend_loop.rs
+++ b/fractal-gtk/src/app/backend_loop.rs
@@ -83,12 +83,10 @@ pub fn backend_loop(rx: Receiver<BKResponse>) {
                     APPOP!(account_destruction_logoff);
                 }
                 BKResponse::Avatar(Ok(path)) => {
-                    let av = Some(path);
-                    APPOP!(set_avatar, (av));
+                    APPOP!(set_avatar, (path));
                 }
                 BKResponse::SetUserAvatar(Ok(path)) => {
-                    let av = Some(path);
-                    APPOP!(show_new_avatar, (av));
+                    APPOP!(show_new_avatar, (path));
                 }
                 BKResponse::Sync(Ok(since)) => {
                     info!("SYNC");
diff --git a/fractal-gtk/src/app/connect/account.rs b/fractal-gtk/src/app/connect/account.rs
index 0daeb2f9..a759e65c 100644
--- a/fractal-gtk/src/app/connect/account.rs
+++ b/fractal-gtk/src/app/connect/account.rs
@@ -79,7 +79,7 @@ impl App {
         let window = self.main_window.upcast_ref::<gtk::Window>();
         let actions = AccountSettings::new(
             &window,
-            &backend,
+            backend,
             login_data.server_url,
             login_data.access_token,
             login_data.uid,
diff --git a/fractal-gtk/src/app/connect/direct.rs b/fractal-gtk/src/app/connect/direct.rs
index 2a19bbd9..c55789fa 100644
--- a/fractal-gtk/src/app/connect/direct.rs
+++ b/fractal-gtk/src/app/connect/direct.rs
@@ -70,10 +70,11 @@ impl App {
                     let start = buffer.get_start_iter();
                     let end = buffer.get_end_iter();
 
-                    let text = buffer.get_text(&start, &end, false)
-                        .map_or(None, |gstr| Some(gstr.to_string()));
-
-                    op.lock().unwrap().search_invite_user(text);
+                    if let Some(text) =
+                        buffer.get_text(&start, &end, false).map(|gstr| gstr.to_string())
+                    {
+                        op.lock().unwrap().search_invite_user(text);
+                    }
                 }
 
                 *(source_id.lock().unwrap()) = None;
diff --git a/fractal-gtk/src/app/connect/invite.rs b/fractal-gtk/src/app/connect/invite.rs
index 4ddb2110..4f64b208 100644
--- a/fractal-gtk/src/app/connect/invite.rs
+++ b/fractal-gtk/src/app/connect/invite.rs
@@ -104,11 +104,9 @@ impl App {
                     let start = buffer.get_start_iter();
                     let end = buffer.get_end_iter();
 
-                    let text = buffer.get_text(&start, &end, false);
-
-                    op.lock().unwrap().search_invite_user(
-                        text.map_or(None, |gstr| Some(gstr.to_string()))
-                    );
+                    if let Some(text) = buffer.get_text(&start, &end, false).map(|gstr| gstr.to_string()) {
+                        op.lock().unwrap().search_invite_user(text);
+                    }
                 }
 
                 *(source_id.lock().unwrap()) = None;
diff --git a/fractal-gtk/src/appop/account.rs b/fractal-gtk/src/appop/account.rs
index c5b102e8..778b856b 100644
--- a/fractal-gtk/src/appop/account.rs
+++ b/fractal-gtk/src/appop/account.rs
@@ -1,11 +1,15 @@
+use fractal_api::backend::user;
+use fractal_api::util::ResultExpectLog;
 use gtk;
 use gtk::prelude::*;
 use log::info;
+use std::path::PathBuf;
+use std::thread;
 
 use crate::appop::AppOp;
 use crate::appop::AppState;
 
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 use crate::i18n::i18n;
 use crate::widgets;
 use crate::widgets::AvatarExt;
@@ -23,12 +27,12 @@ impl AppOp {
 
     pub fn get_three_pid(&self) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
-        self.backend
-            .send(BKCommand::GetThreePID(
-                login_data.server_url,
-                login_data.access_token,
-            ))
-            .unwrap();
+        let tx = self.backend.clone();
+        thread::spawn(move || {
+            let query = user::get_threepid(login_data.server_url, login_data.access_token);
+            tx.send(BKCommand::SendBKResponse(BKResponse::GetThreePID(query)))
+                .expect_log("Connection closed");
+        });
     }
 
     pub fn added_three_pid(&self) {
@@ -39,13 +43,18 @@ impl AppOp {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         if let Some(sid) = sid {
             if let Some(secret) = secret {
-                let _ = self.backend.send(BKCommand::AddThreePID(
-                    login_data.server_url,
-                    login_data.access_token,
-                    login_data.identity_url,
-                    secret.clone(),
-                    sid.clone(),
-                ));
+                let tx = self.backend.clone();
+                thread::spawn(move || {
+                    let query = user::add_threepid(
+                        login_data.server_url,
+                        login_data.access_token,
+                        login_data.identity_url,
+                        secret,
+                        sid,
+                    );
+                    tx.send(BKCommand::SendBKResponse(BKResponse::AddThreePID(query)))
+                        .expect_log("Connection closed");
+                });
             }
         } else {
             self.show_error_dialog_in_settings(i18n("The validation code is not correct."));
@@ -100,13 +109,18 @@ impl AppOp {
         dialog.connect_response(move |w, r| {
             match gtk::ResponseType::from(r) {
                 gtk::ResponseType::Ok => {
-                    if let Some(token) = value.get_text() {
-                        let _ = backend.send(BKCommand::SubmitPhoneToken(
-                            login_data.server_url.clone(),
-                            secret.clone(),
-                            sid.clone(),
-                            token.to_string(),
-                        ));
+                    if let Some(token) = value.get_text().map(|gstr| gstr.to_string()) {
+                        let server_url = login_data.server_url.clone();
+                        let secret = secret.clone();
+                        let sid = sid.clone();
+                        let tx = backend.clone();
+                        thread::spawn(move || {
+                            let query = user::submit_phone_token(server_url, secret, sid, token);
+                            tx.send(BKCommand::SendBKResponse(BKResponse::SubmitPhoneToken(
+                                query,
+                            )))
+                            .expect_log("Connection closed");
+                        });
                     }
                 }
                 _ => {}
@@ -140,13 +154,21 @@ impl AppOp {
         dialog.connect_response(move |w, r| {
             match gtk::ResponseType::from(r) {
                 gtk::ResponseType::Ok => {
-                    let _ = backend.send(BKCommand::AddThreePID(
-                        login_data.server_url.clone(),
-                        login_data.access_token.clone(),
-                        login_data.identity_url.clone(),
-                        secret.clone(),
-                        sid.clone(),
-                    ));
+                    let login_data = login_data.clone();
+                    let secret = secret.clone();
+                    let sid = sid.clone();
+                    let tx = backend.clone();
+                    thread::spawn(move || {
+                        let query = user::add_threepid(
+                            login_data.server_url,
+                            login_data.access_token,
+                            login_data.identity_url,
+                            secret,
+                            sid,
+                        );
+                        tx.send(BKCommand::SendBKResponse(BKResponse::AddThreePID(query)))
+                            .expect_log("Connection closed");
+                    });
                 }
                 _ => {}
             }
@@ -452,7 +474,7 @@ impl AppOp {
         dialog.present();
     }
 
-    pub fn show_new_avatar(&mut self, path: Option<String>) {
+    pub fn show_new_avatar(&mut self, path: PathBuf) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         let avatar_spinner = self
             .ui
@@ -467,7 +489,7 @@ impl AppOp {
 
         info!("Request finished");
         self.set_login_data(LoginData {
-            avatar: path,
+            avatar: Some(path),
             ..login_data
         });
         avatar_spinner.hide();
@@ -553,6 +575,7 @@ impl AppOp {
 
     pub fn update_username_account_settings(&self) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
+        let tx = self.backend.clone();
         let name = self
             .ui
             .builder
@@ -564,7 +587,7 @@ impl AppOp {
             .get_object::<gtk::Button>("account_settings_name_button")
             .expect("Can't find account_settings_name_button in ui file.");
 
-        let old_username = login_data.username.unwrap_or_default();
+        let old_username = login_data.username.clone().unwrap_or_default();
         let username = name
             .get_text()
             .map_or(String::new(), |gstr| gstr.to_string());
@@ -575,14 +598,16 @@ impl AppOp {
             button.set_image(Some(&spinner));
             button.set_sensitive(false);
             name.set_editable(false);
-            self.backend
-                .send(BKCommand::SetUserName(
+            thread::spawn(move || {
+                let query = user::set_username(
                     login_data.server_url,
                     login_data.access_token,
                     login_data.uid,
                     username,
-                ))
-                .unwrap();
+                );
+                tx.send(BKCommand::SendBKResponse(BKResponse::SetUserName(query)))
+                    .expect_log("Connection closed");
+            });
         } else {
             button.hide();
         }
@@ -638,13 +663,18 @@ impl AppOp {
                 if old != "" && new != "" {
                     password_btn.set_sensitive(false);
                     password_btn_stack.set_visible_child_name("spinner");
-                    let _ = self.backend.send(BKCommand::ChangePassword(
-                        login_data.server_url,
-                        login_data.access_token,
-                        login_data.uid.localpart().into(),
-                        old.to_string(),
-                        new.to_string(),
-                    ));
+                    let tx = self.backend.clone();
+                    thread::spawn(move || {
+                        let query = user::change_password(
+                            login_data.server_url,
+                            login_data.access_token,
+                            login_data.uid.localpart().into(),
+                            old.to_string(),
+                            new.to_string(),
+                        );
+                        tx.send(BKCommand::SendBKResponse(BKResponse::ChangePassword(query)))
+                            .expect_log("Connection closed");
+                    });
                 }
             }
         }
@@ -741,17 +771,26 @@ impl AppOp {
         dialog.add_button("Cancel", gtk::ResponseType::Cancel.into());
 
         let _flag = mark.get_active(); // TODO: This is not used, remove from UI?
-        if let Some(password) = entry.get_text() {
+        if let Some(password) = entry.get_text().map(|gstr| gstr.to_string()) {
             let backend = self.backend.clone();
             dialog.connect_response(move |w, r| {
                 match gtk::ResponseType::from(r) {
                     gtk::ResponseType::Ok => {
-                        let _ = backend.send(BKCommand::AccountDestruction(
-                            login_data.server_url.clone(),
-                            login_data.access_token.clone(),
-                            login_data.uid.localpart().into(),
-                            password.to_string(),
-                        ));
+                        let tx = backend.clone();
+                        let password = password.clone();
+                        let login_data = login_data.clone();
+                        thread::spawn(move || {
+                            let query = user::account_destruction(
+                                login_data.server_url.clone(),
+                                login_data.access_token.clone(),
+                                login_data.uid.localpart().into(),
+                                password,
+                            );
+                            tx.send(BKCommand::SendBKResponse(BKResponse::AccountDestruction(
+                                query,
+                            )))
+                            .expect_log("Connection closed");
+                        });
                     }
                     _ => {}
                 }
diff --git a/fractal-gtk/src/appop/member.rs b/fractal-gtk/src/appop/member.rs
index 91104d67..3528b69b 100644
--- a/fractal-gtk/src/appop/member.rs
+++ b/fractal-gtk/src/appop/member.rs
@@ -1,14 +1,17 @@
+use fractal_api::backend::user;
 use fractal_api::clone;
 use fractal_api::identifiers::{RoomId, UserId};
+use fractal_api::util::ResultExpectLog;
 use gtk;
 use gtk::prelude::*;
 
 use std::collections::HashMap;
 use std::convert::TryFrom;
+use std::thread;
 
 use crate::actions::AppState;
 use crate::appop::AppOp;
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 use crate::widgets;
 use crate::App;
 use glib;
@@ -188,15 +191,13 @@ impl AppOp {
         }
     }
 
-    pub fn search_invite_user(&self, term: Option<String>) {
-        if let (Some(t), Some(login_data)) = (term, self.login_data.clone()) {
-            self.backend
-                .send(BKCommand::UserSearch(
-                    login_data.server_url,
-                    login_data.access_token,
-                    t,
-                ))
-                .unwrap();
-        }
+    pub fn search_invite_user(&self, term: String) {
+        let login_data = unwrap_or_unit_return!(self.login_data.clone());
+        let tx = self.backend.clone();
+        thread::spawn(move || {
+            let query = user::search(login_data.server_url, login_data.access_token, term);
+            tx.send(BKCommand::SendBKResponse(BKResponse::UserSearch(query)))
+                .expect_log("Connection closed");
+        });
     }
 }
diff --git a/fractal-gtk/src/appop/mod.rs b/fractal-gtk/src/appop/mod.rs
index 18d7b32b..63f57c1a 100644
--- a/fractal-gtk/src/appop/mod.rs
+++ b/fractal-gtk/src/appop/mod.rs
@@ -1,5 +1,6 @@
 use std::cell::RefCell;
 use std::collections::HashMap;
+use std::path::PathBuf;
 use std::rc::Rc;
 use std::sync::mpsc::Sender;
 
@@ -53,7 +54,7 @@ pub struct LoginData {
     pub access_token: AccessToken,
     pub uid: UserId,
     pub username: Option<String>,
-    pub avatar: Option<String>,
+    pub avatar: Option<PathBuf>,
     pub server_url: Url,
     pub identity_url: Url,
 }
diff --git a/fractal-gtk/src/appop/user.rs b/fractal-gtk/src/appop/user.rs
index 766bc332..9a1f2ae6 100644
--- a/fractal-gtk/src/appop/user.rs
+++ b/fractal-gtk/src/appop/user.rs
@@ -1,11 +1,18 @@
 use gtk;
 use gtk::prelude::*;
 
+use fractal_api::backend::user;
+use fractal_api::clone;
+use fractal_api::util::ResultExpectLog;
+
+use std::path::PathBuf;
+use std::thread;
+
 use crate::appop::AppOp;
 
 use crate::cache::download_to_cache;
 
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 use crate::widgets;
 use crate::widgets::AvatarExt;
 
@@ -14,15 +21,19 @@ use super::LoginData;
 impl AppOp {
     pub fn get_username(&self) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
-        self.backend
-            .send(BKCommand::GetUsername(
-                login_data.server_url.clone(),
-                login_data.uid.clone(),
-            ))
-            .unwrap();
-        self.backend
-            .send(BKCommand::GetAvatar(login_data.server_url, login_data.uid))
-            .unwrap();
+        let tx = self.backend.clone();
+
+        thread::spawn(clone!(login_data, tx => move || {
+            let query = user::get_username(login_data.server_url, login_data.uid);
+            tx.send(BKCommand::SendBKResponse(BKResponse::Name(query)))
+                .expect_log("Connection closed");
+        }));
+
+        thread::spawn(clone!(login_data, tx => move || {
+            let query = user::get_avatar(login_data.server_url, login_data.uid);
+            tx.send(BKCommand::SendBKResponse(BKResponse::Avatar(query)))
+                .expect_log("Connection closed");
+        }));
     }
 
     pub fn show_user_info(&self) {
@@ -126,10 +137,10 @@ impl AppOp {
         });
     }
 
-    pub fn set_avatar(&mut self, fname: Option<String>) {
+    pub fn set_avatar(&mut self, path: PathBuf) {
         let login_data = unwrap_or_unit_return!(self.login_data.clone());
         self.set_login_data(LoginData {
-            avatar: fname,
+            avatar: Some(path),
             ..login_data
         });
     }
diff --git a/fractal-gtk/src/cache/mod.rs b/fractal-gtk/src/cache/mod.rs
index 412227ab..b25563ff 100644
--- a/fractal-gtk/src/cache/mod.rs
+++ b/fractal-gtk/src/cache/mod.rs
@@ -1,8 +1,11 @@
+use fractal_api::backend::user;
 use fractal_api::url::Url;
+use fractal_api::util::ResultExpectLog;
 use glib::source::Continue;
 use gtk;
 use gtk::LabelExt;
 use serde::{Deserialize, Serialize};
+use std::thread;
 
 use crate::types::Room;
 use crate::types::RoomList;
@@ -120,16 +123,16 @@ pub fn download_to_cache(
 
 /* Get username based on the MXID, we should cache the username */
 pub fn download_to_cache_username(
-    backend: Sender<BKCommand>,
     server_url: Url,
     uid: UserId,
     label: gtk::Label,
     avatar: Option<Rc<RefCell<AvatarData>>>,
 ) {
-    let (tx, rx): (Sender<String>, Receiver<String>) = channel();
-    backend
-        .send(BKCommand::GetUserNameAsync(server_url, uid, tx))
-        .unwrap();
+    let (ctx, rx): (Sender<String>, Receiver<String>) = channel();
+    thread::spawn(move || {
+        let query = user::get_username_async(server_url, uid);
+        ctx.send(query).expect_log("Connection closed");
+    });
     gtk::timeout_add(50, move || match rx.try_recv() {
         Err(TryRecvError::Empty) => Continue(true),
         Err(TryRecvError::Disconnected) => Continue(false),
@@ -148,17 +151,17 @@ pub fn download_to_cache_username(
 /* Download username for a given MXID and update a emote message
  * FIXME: We should cache this request and do it before we need to display the username in an emote*/
 pub fn download_to_cache_username_emote(
-    backend: Sender<BKCommand>,
     server_url: Url,
     uid: UserId,
     text: &str,
     label: gtk::Label,
     avatar: Option<Rc<RefCell<AvatarData>>>,
 ) {
-    let (tx, rx): (Sender<String>, Receiver<String>) = channel();
-    backend
-        .send(BKCommand::GetUserNameAsync(server_url, uid, tx))
-        .unwrap();
+    let (ctx, rx): (Sender<String>, Receiver<String>) = channel();
+    thread::spawn(move || {
+        let query = user::get_username_async(server_url, uid);
+        ctx.send(query).expect_log("Connection closed");
+    });
     let text = text.to_string();
     gtk::timeout_add(50, move || match rx.try_recv() {
         Err(TryRecvError::Empty) => Continue(true),
diff --git a/fractal-gtk/src/widgets/address.rs b/fractal-gtk/src/widgets/address.rs
index b7b7e60c..bda3cd5a 100644
--- a/fractal-gtk/src/widgets/address.rs
+++ b/fractal-gtk/src/widgets/address.rs
@@ -1,15 +1,18 @@
+use fractal_api::backend::user;
 use fractal_api::r0::AccessToken;
 use fractal_api::r0::Medium;
 use fractal_api::url::Url;
+use fractal_api::util::ResultExpectLog;
 use glib::signal;
 use gtk;
 use gtk::prelude::*;
 use rand::distributions::Alphanumeric;
 use rand::{thread_rng, Rng};
 use std::sync::mpsc::Sender;
+use std::thread;
 
 use crate::appop::AppOp;
-use crate::backend::BKCommand;
+use crate::backend::{BKCommand, BKResponse};
 
 #[derive(Debug, Clone)]
 pub enum AddressType {
@@ -184,23 +187,27 @@ impl<'a> Address<'a> {
 
             match action {
                 Some(AddressAction::Delete) => {
-                    delete_address(
-                        &backend,
-                        medium,
-                        address.clone(),
-                        server_url.clone(),
-                        access_token.clone(),
-                    );
+                    if let Some(address) = address.clone() {
+                        delete_address(
+                            backend.clone(),
+                            medium,
+                            address,
+                            server_url.clone(),
+                            access_token.clone(),
+                        );
+                    }
                 }
                 Some(AddressAction::Add) => {
-                    add_address(
-                        &backend,
-                        medium,
-                        id_server.clone(),
-                        entry.get_text().map_or(None, |gstr| Some(gstr.to_string())),
-                        server_url.clone(),
-                        access_token.clone(),
-                    );
+                    if let Some(address) = entry.get_text().map(|gstr| gstr.to_string()) {
+                        add_address(
+                            backend.clone(),
+                            medium,
+                            id_server.clone(),
+                            address,
+                            server_url.clone(),
+                            access_token.clone(),
+                        );
+                    }
                 }
                 _ => {}
             }
@@ -209,55 +216,38 @@ impl<'a> Address<'a> {
 }
 
 fn delete_address(
-    backend: &Sender<BKCommand>,
+    tx: Sender<BKCommand>,
     medium: Medium,
-    address: Option<String>,
+    address: String,
     server_url: Url,
     access_token: AccessToken,
-) -> Option<String> {
-    backend
-        .send(BKCommand::DeleteThreePID(
-            server_url,
-            access_token,
-            medium,
-            address?,
-        ))
-        .unwrap();
-    None
+) {
+    thread::spawn(move || {
+        let query = user::delete_three_pid(server_url, access_token, medium, address);
+        tx.send(BKCommand::SendBKResponse(BKResponse::DeleteThreePID(query)))
+            .expect_log("Connection closed");
+    });
 }
 
 fn add_address(
-    backend: &Sender<BKCommand>,
+    tx: Sender<BKCommand>,
     medium: Medium,
     id_server: Url,
-    address: Option<String>,
+    address: String,
     server_url: Url,
     access_token: AccessToken,
-) -> Option<String> {
+) {
     let secret: String = thread_rng().sample_iter(&Alphanumeric).take(36).collect();
-    match medium {
+    thread::spawn(move || match medium {
         Medium::MsIsdn => {
-            backend
-                .send(BKCommand::GetTokenPhone(
-                    server_url,
-                    access_token,
-                    id_server,
-                    address?,
-                    secret,
-                ))
-                .unwrap();
+            let query = user::get_phone_token(server_url, access_token, id_server, address, secret);
+            tx.send(BKCommand::SendBKResponse(BKResponse::GetTokenPhone(query)))
+                .expect_log("Connection closed");
         }
         Medium::Email => {
-            backend
-                .send(BKCommand::GetTokenEmail(
-                    server_url,
-                    access_token,
-                    id_server,
-                    address?,
-                    secret,
-                ))
-                .unwrap();
+            let query = user::get_email_token(server_url, access_token, id_server, address, secret);
+            tx.send(BKCommand::SendBKResponse(BKResponse::GetTokenEmail(query)))
+                .expect_log("Connection closed");
         }
-    }
-    None
+    });
 }
diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs
index bf8093e9..95fce8f8 100644
--- a/fractal-gtk/src/widgets/message.rs
+++ b/fractal-gtk/src/widgets/message.rs
@@ -236,7 +236,6 @@ impl MessageBox {
             data.clone(),
         );
         download_to_cache_username(
-            self.backend.clone(),
             self.server_url.clone(),
             uid,
             self.username.clone(),
@@ -594,7 +593,6 @@ impl MessageBox {
         let markup = markup_text(body);
 
         download_to_cache_username_emote(
-            self.backend.clone(),
             self.server_url.clone(),
             msg.sender.clone(),
             &markup,
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index 1f9c62c3..4bbba84a 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -21,7 +21,7 @@ pub mod register;
 mod room;
 mod sync;
 mod types;
-mod user;
+pub mod user;
 
 pub use self::types::BKCommand;
 pub use self::types::BKResponse;
@@ -78,124 +78,12 @@ impl Backend {
             Ok(BKCommand::Guest(server, id_url)) => register::guest(self, server, id_url),
 
             // User module
-            Ok(BKCommand::GetUsername(server, uid)) => {
-                thread::spawn(move || {
-                    let query = user::get_username(server, uid);
-                    tx.send(BKResponse::Name(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::SetUserName(server, access_token, uid, username)) => {
-                thread::spawn(move || {
-                    let query = user::set_username(server, access_token, uid, username);
-                    tx.send(BKResponse::SetUserName(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::GetThreePID(server, access_token)) => {
-                thread::spawn(move || {
-                    let query = user::get_threepid(server, access_token);
-                    tx.send(BKResponse::GetThreePID(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::GetTokenEmail(server, access_token, identity, email, client_secret)) => {
-                thread::spawn(move || {
-                    let query =
-                        user::get_email_token(server, access_token, identity, email, client_secret);
-                    tx.send(BKResponse::GetTokenEmail(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::GetTokenPhone(server, access_token, identity, phone, client_secret)) => {
-                thread::spawn(move || {
-                    let query =
-                        user::get_phone_token(server, access_token, identity, phone, client_secret);
-                    tx.send(BKResponse::GetTokenPhone(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::SubmitPhoneToken(server, client_secret, sid, token)) => {
-                thread::spawn(move || {
-                    let query = user::submit_phone_token(server, client_secret, sid, token);
-                    tx.send(BKResponse::SubmitPhoneToken(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::AddThreePID(server, access_token, identity, client_secret, sid)) => {
-                thread::spawn(move || {
-                    let query =
-                        user::add_threepid(server, access_token, identity, client_secret, sid);
-                    tx.send(BKResponse::AddThreePID(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::DeleteThreePID(server, access_token, medium, address)) => {
-                thread::spawn(move || {
-                    let query = user::delete_three_pid(server, access_token, medium, address);
-                    tx.send(BKResponse::DeleteThreePID(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::ChangePassword(
-                server,
-                access_token,
-                user,
-                old_password,
-                new_password,
-            )) => {
-                thread::spawn(move || {
-                    let query = user::change_password(
-                        server,
-                        access_token,
-                        user,
-                        old_password,
-                        new_password,
-                    );
-                    tx.send(BKResponse::ChangePassword(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::AccountDestruction(server, access_token, user, password)) => {
-                thread::spawn(move || {
-                    let query = user::account_destruction(server, access_token, user, password);
-                    tx.send(BKResponse::AccountDestruction(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::GetAvatar(server, uid)) => {
-                thread::spawn(move || {
-                    let query = user::get_avatar(server, uid);
-                    tx.send(BKResponse::Avatar(query))
-                        .expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::SetUserAvatar(server, access_token, uid, file)) => {
-                thread::spawn(move || {
-                    let query = user::set_user_avatar(server, access_token, uid, file);
-                    tx.send(BKResponse::SetUserAvatar(query))
-                        .expect_log("Connection closed");
-                });
-            }
             Ok(BKCommand::GetAvatarAsync(server, member, ctx)) => {
                 user::get_avatar_async(self, server, member, ctx)
             }
             Ok(BKCommand::GetUserInfoAsync(server, sender, ctx)) => {
                 user::get_user_info_async(self, server, sender, ctx)
             }
-            Ok(BKCommand::GetUserNameAsync(server, sender, ctx)) => {
-                thread::spawn(move || {
-                    let query = user::get_username_async(server, sender);
-                    ctx.send(query).expect_log("Connection closed");
-                });
-            }
-            Ok(BKCommand::UserSearch(server, access_token, term)) => {
-                thread::spawn(move || {
-                    let query = user::search(server, access_token, term);
-                    tx.send(BKResponse::UserSearch(query))
-                        .expect_log("Connection closed");
-                });
-            }
 
             // Sync module
             Ok(BKCommand::Sync(server, access_token, uid, since, initial)) => {
diff --git a/fractal-matrix-api/src/backend/types.rs b/fractal-matrix-api/src/backend/types.rs
index 8b8b5397..242cd731 100644
--- a/fractal-matrix-api/src/backend/types.rs
+++ b/fractal-matrix-api/src/backend/types.rs
@@ -1,5 +1,6 @@
 use ruma_identifiers::{RoomId, UserId};
 use std::collections::HashMap;
+use std::path::PathBuf;
 use std::sync::mpsc::Sender;
 use std::sync::{Arc, Condvar, Mutex};
 use std::thread;
@@ -9,7 +10,6 @@ use crate::error::Error;
 use crate::r0::contact::get_identifiers::ThirdPartyIdentifier;
 use crate::r0::thirdparty::get_supported_protocols::ProtocolInstance;
 use crate::r0::AccessToken;
-use crate::r0::Medium;
 use crate::types::Event;
 use crate::types::Member;
 use crate::types::Message;
@@ -22,22 +22,8 @@ use url::Url;
 pub enum BKCommand {
     Login(String, String, Url, Url),
     Logout(Url, AccessToken),
-    #[allow(dead_code)]
     Register(String, String, Url, Url),
-    #[allow(dead_code)]
     Guest(Url, Url),
-    GetUsername(Url, UserId),
-    SetUserName(Url, AccessToken, UserId, String),
-    GetThreePID(Url, AccessToken),
-    GetTokenEmail(Url, AccessToken, Url, String, String),
-    GetTokenPhone(Url, AccessToken, Url, String, String),
-    SubmitPhoneToken(Url, String, String, String),
-    AddThreePID(Url, AccessToken, Url, String, String),
-    DeleteThreePID(Url, AccessToken, Medium, String),
-    ChangePassword(Url, AccessToken, String, String, String),
-    AccountDestruction(Url, AccessToken, String, String),
-    GetAvatar(Url, UserId),
-    SetUserAvatar(Url, AccessToken, UserId, String),
     Sync(Url, AccessToken, UserId, Option<String>, bool),
     GetRoomMembers(Url, AccessToken, RoomId),
     GetRoomMessages(Url, AccessToken, RoomId, String),
@@ -57,7 +43,6 @@ pub enum BKCommand {
     GetAvatarAsync(Url, Option<Member>, Sender<String>),
     GetMedia(Url, String),
     GetUserInfoAsync(Url, UserId, Option<Sender<(String, String)>>),
-    GetUserNameAsync(Url, UserId, Sender<String>),
     SendMsg(Url, AccessToken, Message),
     SendMsgRedaction(Url, AccessToken, Message),
     SendTyping(Url, AccessToken, UserId, RoomId),
@@ -77,7 +62,6 @@ pub enum BKCommand {
     AddToFav(Url, AccessToken, UserId, RoomId, bool),
     AcceptInv(Url, AccessToken, RoomId),
     RejectInv(Url, AccessToken, RoomId),
-    UserSearch(Url, AccessToken, String),
     Invite(Url, AccessToken, RoomId, UserId),
     ChangeLanguage(AccessToken, Url, UserId, RoomId, String),
     SendBKResponse(BKResponse),
@@ -98,8 +82,8 @@ pub enum BKResponse {
     DeleteThreePID(Result<(), Error>),
     ChangePassword(Result<(), Error>),
     AccountDestruction(Result<(), Error>),
-    Avatar(Result<String, Error>),
-    SetUserAvatar(Result<String, Error>),
+    Avatar(Result<PathBuf, Error>),
+    SetUserAvatar(Result<PathBuf, Error>),
     Sync(Result<String, Error>),
     Rooms(Result<(Vec<Room>, Option<Room>), Error>),
     UpdateRooms(Result<Vec<Room>, Error>),
diff --git a/fractal-matrix-api/src/backend/user.rs b/fractal-matrix-api/src/backend/user.rs
index ad175896..ba08ae6c 100644
--- a/fractal-matrix-api/src/backend/user.rs
+++ b/fractal-matrix-api/src/backend/user.rs
@@ -11,6 +11,7 @@ use crate::util::ContentType;
 use crate::util::ResultExpectLog;
 use crate::util::HTTP_CLIENT;
 use std::convert::TryInto;
+use std::path::PathBuf;
 use std::sync::mpsc::Sender;
 use std::sync::{Arc, Mutex};
 use std::thread;
@@ -338,8 +339,8 @@ pub fn account_destruction(
         .and(Ok(()))
 }
 
-pub fn get_avatar(base: Url, userid: UserId) -> Result<String, Error> {
-    get_user_avatar(base, &userid).map(|(_, fname)| fname)
+pub fn get_avatar(base: Url, userid: UserId) -> Result<PathBuf, Error> {
+    get_user_avatar(base, &userid).map(|(_, fname)| fname.into())
 }
 
 pub fn get_avatar_async(bk: &Backend, base: Url, member: Option<Member>, tx: Sender<String>) {
@@ -360,8 +361,8 @@ pub fn set_user_avatar(
     base: Url,
     access_token: AccessToken,
     uid: UserId,
-    avatar: String,
-) -> Result<String, Error> {
+    avatar: PathBuf,
+) -> Result<PathBuf, Error> {
     let params_upload = CreateContentParameters {
         access_token: access_token.clone(),
         filename: None,



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