[fractal] API, room: use endpoint in mark_as_read



commit 1622a2a5372122e4aad7bf2eb564ed5ee98c7d80
Author: Alejandro Domínguez <adomu net-c com>
Date:   Sat Mar 7 06:43:47 2020 +0100

    API, room: use endpoint in mark_as_read

 fractal-matrix-api/src/backend/mod.rs              |  7 ++-
 fractal-matrix-api/src/backend/room.rs             | 63 +++++++---------------
 fractal-matrix-api/src/r0.rs                       |  1 +
 fractal-matrix-api/src/r0/read_marker.rs           |  1 +
 .../src/r0/read_marker/set_read_marker.rs          | 36 +++++++++++++
 5 files changed, 62 insertions(+), 46 deletions(-)
---
diff --git a/fractal-matrix-api/src/backend/mod.rs b/fractal-matrix-api/src/backend/mod.rs
index d4428940..d2ab6090 100644
--- a/fractal-matrix-api/src/backend/mod.rs
+++ b/fractal-matrix-api/src/backend/mod.rs
@@ -299,8 +299,11 @@ impl Backend {
                 });
             }
             Ok(BKCommand::MarkAsRead(server, access_token, room_id, evid)) => {
-                let r = room::mark_as_read(self, server, access_token, room_id, evid);
-                bkerror2!(r, tx, BKResponse::MarkedAsRead);
+                thread::spawn(move || {
+                    let query = room::mark_as_read(server, access_token, room_id, evid);
+                    tx.send(BKResponse::MarkedAsRead(query))
+                        .expect_log("Connection closed");
+                });
             }
             Ok(BKCommand::SetRoomName(server, access_token, room_id, name)) => {
                 let r = room::set_room_name(self, server, access_token, room_id, name);
diff --git a/fractal-matrix-api/src/backend/room.rs b/fractal-matrix-api/src/backend/room.rs
index 23eec315..498cc869 100644
--- a/fractal-matrix-api/src/backend/room.rs
+++ b/fractal-matrix-api/src/backend/room.rs
@@ -49,6 +49,9 @@ use crate::r0::message::get_message_events::request as get_messages_events;
 use crate::r0::message::get_message_events::Direction as GetMessagesEventsDirection;
 use crate::r0::message::get_message_events::Parameters as GetMessagesEventsParams;
 use crate::r0::message::get_message_events::Response as GetMessagesEventsResponse;
+use crate::r0::read_marker::set_read_marker::request as set_read_marker;
+use crate::r0::read_marker::set_read_marker::Body as SetReadMarkerBody;
+use crate::r0::read_marker::set_read_marker::Parameters as SetReadMarkerParameters;
 use crate::r0::redact::redact_event::request as redact_event;
 use crate::r0::redact::redact_event::Body as RedactEventBody;
 use crate::r0::redact::redact_event::Parameters as RedactEventParameters;
@@ -416,60 +419,32 @@ pub fn leave_room(base: Url, access_token: AccessToken, room_id: RoomId) -> Resu
     leave_room_req(base, &room_id, &params)
         .map_err(Into::into)
         .and_then(|request| {
-            HTTP_CLIENT
-                .get_client()?
-                .execute(request)
-                .map_err(Into::into)
+            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
+
+            Ok(())
         })
-        .and(Ok(()))
 }
 
 pub fn mark_as_read(
-    bk: &Backend,
     base: Url,
     access_token: AccessToken,
     room_id: RoomId,
-    eventid: String,
-) -> Result<(), Error> {
-    let url = bk.url(
-        base.clone(),
-        &access_token,
-        &format!("rooms/{}/receipt/m.read/{}", room_id, eventid),
-        vec![],
-    )?;
+    event_id: String,
+) -> Result<(RoomId, String), Error> {
+    let params = SetReadMarkerParameters { access_token };
 
-    let r = room_id.clone();
-    let e = eventid.clone();
-    let tx = bk.tx.clone();
-    post!(
-        url,
-        move |_: JsonValue| {
-            tx.send(BKResponse::MarkedAsRead(Ok((r, e))))
-                .expect_log("Connection closed");
-        },
-        |err| {
-            tx.send(BKResponse::MarkedAsRead(Err(err)))
-                .expect_log("Connection closed");
-        }
-    );
+    let body = SetReadMarkerBody {
+        fully_read: event_id.clone(),
+        read: Some(event_id.clone()),
+    };
 
-    // send fully_read event
-    // This event API call isn't in the current doc but I found this in the
-    // matrix-js-sdk
-    // https://github.com/matrix-org/matrix-js-sdk/blob/master/src/base-apis.js#L851
-    let url = bk.url(
-        base,
-        &access_token,
-        &format!("rooms/{}/read_markers", room_id),
-        vec![],
-    )?;
-    let attrs = json!({
-        "m.fully_read": eventid,
-        "m.read": json!(null),
-    });
-    post!(url, &attrs, |_| {}, |_| {});
+    set_read_marker(base, &params, &body, &room_id)
+        .map_err(Into::into)
+        .and_then(|request| {
+            let _ = HTTP_CLIENT.get_client()?.execute(request)?;
 
-    Ok(())
+            Ok((room_id, event_id))
+        })
 }
 
 pub fn set_room_name(
diff --git a/fractal-matrix-api/src/r0.rs b/fractal-matrix-api/src/r0.rs
index fe9ca986..cea5d6ea 100644
--- a/fractal-matrix-api/src/r0.rs
+++ b/fractal-matrix-api/src/r0.rs
@@ -7,6 +7,7 @@ pub mod media;
 pub mod membership;
 pub mod message;
 pub mod profile;
+pub mod read_marker;
 pub mod redact;
 pub mod search;
 pub mod server;
diff --git a/fractal-matrix-api/src/r0/read_marker.rs b/fractal-matrix-api/src/r0/read_marker.rs
new file mode 100644
index 00000000..a132953d
--- /dev/null
+++ b/fractal-matrix-api/src/r0/read_marker.rs
@@ -0,0 +1 @@
+pub mod set_read_marker;
diff --git a/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs 
b/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs
new file mode 100644
index 00000000..3bc58d78
--- /dev/null
+++ b/fractal-matrix-api/src/r0/read_marker/set_read_marker.rs
@@ -0,0 +1,36 @@
+use crate::r0::AccessToken;
+use reqwest::blocking::Client;
+use reqwest::blocking::Request;
+use reqwest::Error;
+use ruma_identifiers::RoomId;
+use serde::Serialize;
+use url::Url;
+
+#[derive(Clone, Debug, Serialize)]
+pub struct Parameters {
+    pub access_token: AccessToken,
+}
+
+#[derive(Clone, Debug, Serialize)]
+pub struct Body {
+    #[serde(rename = "m.fully_read")]
+    pub fully_read: String, // TODO: Use EventId
+    #[serde(rename = "m.read")]
+    pub read: Option<String>, // TODO: Use EventId
+}
+
+pub fn request(
+    base: Url,
+    params: &Parameters,
+    body: &Body,
+    room_id: &RoomId,
+) -> Result<Request, Error> {
+    let url = base
+        .join(&format!(
+            "/_matrix/client/r0/rooms/{}/read_markers",
+            room_id
+        ))
+        .expect("Malformed URL in set_read_marker");
+
+    Client::new().post(url).query(params).json(body).build()
+}


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