From f13673e2b04efd07d2718db2c336cc2e4c552f31 Mon Sep 17 00:00:00 2001 From: "Andriy Kushnir (Orhideous)" Date: Mon, 28 Nov 2022 01:42:24 +0200 Subject: [PATCH] refactor: Replace specialized interface for user's membership with more generic one in state accessor --- .../key_value/rooms/state_accessor.rs | 52 ++++++------------- src/service/rooms/state_accessor/data.rs | 9 ++-- src/service/rooms/state_accessor/mod.rs | 18 +++++-- 3 files changed, 33 insertions(+), 46 deletions(-) diff --git a/src/database/key_value/rooms/state_accessor.rs b/src/database/key_value/rooms/state_accessor.rs index ffdd8acc..ec6956ce 100644 --- a/src/database/key_value/rooms/state_accessor.rs +++ b/src/database/key_value/rooms/state_accessor.rs @@ -9,6 +9,7 @@ use ruma::{ events::{room::member::MembershipState, StateEventType}, EventId, RoomId, UserId, }; +use serde_json::Value; #[async_trait] impl service::rooms::state_accessor::Data for KeyValueDatabase { @@ -131,7 +132,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { shortstatehash: u64, event_type: &StateEventType, state_key: &str, - ) -> Result> { + ) -> Result> { let content = self .state_get(shortstatehash, event_type, state_key)? .map(|event| serde_json::from_str(event.content.get())) @@ -159,40 +160,21 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { }) } - /// The user was a joined member at this state (potentially in the past) - fn user_was_joined(&self, shortstatehash: u64, user_id: &UserId) -> Result { - Ok(self - .state_get_content( - shortstatehash, - &StateEventType::RoomMember, - user_id.as_str(), - )? - .map(|content| match content.get("membership") { - Some(membership) => MembershipState::from(membership.as_str().unwrap_or("")), - None => MembershipState::Leave, - } == MembershipState::Join) - .unwrap_or(false)) - } - - /// The user was an invited or joined room member at this state (potentially - /// in the past) - fn user_was_invited(&self, shortstatehash: u64, user_id: &UserId) -> Result { - Ok(self - .state_get_content( - shortstatehash, - &StateEventType::RoomMember, - user_id.as_str(), - )? - .map(|content| { - let membership = match content.get("membership") { - Some(membership) => MembershipState::from(membership.as_str().unwrap_or("")), - None => MembershipState::Leave, - }; - let joined = membership == MembershipState::Join; - let invited = membership == MembershipState::Invite; - invited || joined - }) - .unwrap_or(false)) + /// Get membership for given user in state + fn user_membership(&self, shortstatehash: u64, user_id: &UserId) -> Result { + self.state_get_content( + shortstatehash, + &StateEventType::RoomMember, + user_id.as_str(), + )? + .map(|content| match content.get("membership") { + Some(Value::String(membership)) => Ok(MembershipState::from(membership.as_str())), + None => Ok(MembershipState::Leave), + _ => Err(Error::bad_database( + "Malformed membership, expected Value::String", + )), + }) + .unwrap_or(Ok(MembershipState::Leave)) } /// Returns the full room state. diff --git a/src/service/rooms/state_accessor/data.rs b/src/service/rooms/state_accessor/data.rs index 4cff0736..3a5cb49e 100644 --- a/src/service/rooms/state_accessor/data.rs +++ b/src/service/rooms/state_accessor/data.rs @@ -4,6 +4,7 @@ use std::{ }; use async_trait::async_trait; +use ruma::events::room::member::MembershipState; use ruma::{events::StateEventType, EventId, RoomId, UserId}; use crate::{PduEvent, Result}; @@ -45,12 +46,8 @@ pub trait Data: Send + Sync { /// Returns the state hash for this pdu. fn pdu_shortstatehash(&self, event_id: &EventId) -> Result>; - /// The user was a joined member at this state (potentially in the past) - fn user_was_joined(&self, shortstatehash: u64, user_id: &UserId) -> Result; - - /// The user was an invited or joined room member at this state (potentially - /// in the past) - fn user_was_invited(&self, shortstatehash: u64, user_id: &UserId) -> Result; + /// Get membership for given user in state + fn user_membership(&self, shortstatehash: u64, user_id: &UserId) -> Result; /// Returns the full room state. async fn room_state_full( diff --git a/src/service/rooms/state_accessor/mod.rs b/src/service/rooms/state_accessor/mod.rs index b53488d0..fd464d89 100644 --- a/src/service/rooms/state_accessor/mod.rs +++ b/src/service/rooms/state_accessor/mod.rs @@ -7,7 +7,9 @@ use std::{ pub use data::Data; use lru_cache::LruCache; use ruma::{ - events::{room::history_visibility::HistoryVisibility, StateEventType}, + events::{ + room::history_visibility::HistoryVisibility, room::member::MembershipState, StateEventType, + }, EventId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId, }; @@ -151,14 +153,20 @@ impl Service { } /// The user was a joined member at this state (potentially in the past) - pub fn user_was_joined(&self, shortstatehash: u64, user_id: &UserId) -> Result { - self.db.user_was_joined(shortstatehash, user_id) + pub fn user_was_joined(&self, shortstatehash: u64, user_id: &UserId) -> bool { + self.db + .user_membership(shortstatehash, user_id) + .map(|s| s == MembershipState::Join) + .unwrap_or_default() // Return sensible default, i.e. false } /// The user was an invited or joined room member at this state (potentially /// in the past) - pub fn user_was_invited(&self, shortstatehash: u64, user_id: &UserId) -> Result { - self.db.user_was_invited(shortstatehash, user_id) + pub fn user_was_invited(&self, shortstatehash: u64, user_id: &UserId) -> bool { + self.db + .user_membership(shortstatehash, user_id) + .map(|s| s == MembershipState::Join || s == MembershipState::Invite) + .unwrap_or_default() // Return sensible default, i.e. false } /// Returns the full room state.