From 9c26e22ad7d1d821feba6253703c074bcb3c1bf6 Mon Sep 17 00:00:00 2001
From: timokoesters <timo@koesters.xyz>
Date: Sun, 24 May 2020 08:30:57 +0200
Subject: [PATCH] improvement: load aliases from database

---
 src/client_server.rs  | 12 ++++++------
 src/database/rooms.rs | 12 ++++++++++++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/client_server.rs b/src/client_server.rs
index 0701be1a..36cdb38b 100644
--- a/src/client_server.rs
+++ b/src/client_server.rs
@@ -1272,17 +1272,17 @@ pub fn join_room_by_id_or_alias_route(
 ) -> MatrixResult<join_room_by_id_or_alias::Response> {
     let room_id = match RoomId::try_from(body.room_id_or_alias.clone()) {
         Ok(room_id) => room_id,
-        Err(room_alias) => {
-            if room_alias.server_name() == db.globals.server_name() {
+        Err(_) => {
+            if let Some(room_id) = db.rooms.id_from_alias(body.room_id_or_alias.as_ref()).unwrap() {
+                room_id
+            } else {
+                // Ask creator server of the room to join TODO ask someone else when not available
+                //server_server::send_request(data, destination, request)
                 return MatrixResult(Err(Error {
                     kind: ErrorKind::NotFound,
                     message: "Room alias not found.".to_owned(),
                     status_code: http::StatusCode::BAD_REQUEST,
                 }));
-            } else {
-                // Ask creator server of the room to join TODO ask someone else when not available
-                //server_server::send_request(data, destination, request)
-                todo!();
             }
         }
     };
diff --git a/src/database/rooms.rs b/src/database/rooms.rs
index 8e626cb0..8969da11 100644
--- a/src/database/rooms.rs
+++ b/src/database/rooms.rs
@@ -26,6 +26,8 @@ pub struct Rooms {
     pub(super) roomid_pduleaves: sled::Tree,
     pub(super) roomstateid_pdu: sled::Tree, // RoomStateId = Room + StateType + StateKey
 
+    pub(super) alias_roomid: sled::Tree,
+
     pub(super) userroomid_joined: sled::Tree,
     pub(super) roomuserid_joined: sled::Tree,
     pub(super) userroomid_invited: sled::Tree,
@@ -646,6 +648,16 @@ impl Rooms {
         Ok(())
     }
 
+    pub fn id_from_alias(&self, alias: &str) -> Result<Option<RoomId>> {
+        if !alias.starts_with('#') {
+            return Err(Error::BadRequest("room alias does not start with #"));
+        }
+
+        self.alias_roomid.get(alias)?.map_or(Ok(None), |bytes| {
+            Ok(Some(RoomId::try_from(utils::string_from_bytes(&bytes)?)?))
+        })
+    }
+
     /// Returns an iterator over all rooms a user joined.
     pub fn room_members(&self, room_id: &RoomId) -> impl Iterator<Item = Result<UserId>> {
         self.roomuserid_joined