add parallel query for current membership state

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-11-13 00:59:53 +00:00
parent feefa43e65
commit 68582dd868

View file

@ -10,7 +10,7 @@ use conduit::{
warn, Result,
};
use database::{serialize_to_vec, Deserialized, Ignore, Interfix, Json, Map};
use futures::{stream::iter, Stream, StreamExt};
use futures::{future::join4, stream::iter, Stream, StreamExt};
use itertools::Itertools;
use ruma::{
events::{
@ -566,6 +566,24 @@ impl Service {
self.db.userroomid_leftstate.qry(&key).await.is_ok()
}
pub async fn user_membership(&self, user_id: &UserId, room_id: &RoomId) -> Option<MembershipState> {
let states = join4(
self.is_joined(user_id, room_id),
self.is_left(user_id, room_id),
self.is_invited(user_id, room_id),
self.once_joined(user_id, room_id),
)
.await;
match states {
(true, ..) => Some(MembershipState::Join),
(_, true, ..) => Some(MembershipState::Leave),
(_, _, true, ..) => Some(MembershipState::Invite),
(false, false, false, true) => Some(MembershipState::Ban),
_ => None,
}
}
#[tracing::instrument(skip(self), level = "debug")]
pub fn servers_invite_via<'a>(&'a self, room_id: &'a RoomId) -> impl Stream<Item = &ServerName> + Send + 'a {
type KeyVal<'a> = (Ignore, Vec<&'a ServerName>);