tuwunel_service/rooms/directory/
mod.rs1use std::sync::Arc;
7
8use futures::Stream;
9use ruma::{OwnedRoomAliasId, RoomAliasId, RoomId, api::client::room::Visibility};
10use tuwunel_core::{Result, implement, utils::stream::TryIgnore};
11use tuwunel_database::{Deserialized, Map};
12
13pub struct Service {
18 db: Data,
19}
20
21struct Data {
22 publicroomids: Arc<Map>,
23}
24
25impl crate::Service for Service {
26 fn build(args: &crate::Args<'_>) -> Result<Arc<Self>> {
27 Ok(Arc::new(Self {
28 db: Data {
29 publicroomids: args.db["publicroomids"].clone(),
30 },
31 }))
32 }
33
34 fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
35}
36
37#[implement(Service)]
42pub fn set_public(&self, room_id: &RoomId, alias: Option<&RoomAliasId>) {
43 self.db
44 .publicroomids
45 .insert(room_id, alias.map_or("", RoomAliasId::as_str));
46}
47
48#[implement(Service)]
53pub fn set_not_public(&self, room_id: &RoomId) { self.db.publicroomids.remove(room_id); }
54
55#[implement(Service)]
60pub async fn published_alias(&self, room_id: &RoomId) -> Result<OwnedRoomAliasId> {
61 self.db
62 .publicroomids
63 .get(room_id)
64 .await
65 .deserialized()
66}
67
68#[implement(Service)]
73pub fn public_rooms(&self) -> impl Stream<Item = &RoomId> + Send {
74 self.db.publicroomids.keys().ignore_err()
75}
76
77#[implement(Service)]
82pub async fn is_public_room(&self, room_id: &RoomId) -> bool {
83 self.visibility(room_id).await == Visibility::Public
84}
85
86#[implement(Service)]
91pub async fn visibility(&self, room_id: &RoomId) -> Visibility {
92 if self.db.publicroomids.get(room_id).await.is_ok() {
93 Visibility::Public
94 } else {
95 Visibility::Private
96 }
97}