From 3993fb0a74d5ce0514a26d8f20d353c1282a78fc Mon Sep 17 00:00:00 2001
From: kamathmanu <manuriddle@gmail.com>
Date: Mon, 11 Jan 2021 09:34:18 -0500
Subject: [PATCH] Update code modularity by placing room visibility options in
 common namespace.

---
 include/mtx/common.hpp                 | 32 +++++++++++++++++++++-
 include/mtx/requests.hpp               | 22 ++++-----------
 include/mtx/responses/public_rooms.hpp | 38 +++++---------------------
 include/mtxclient/http/client.hpp      |  9 +++---
 lib/http/client.cpp                    | 10 +++----
 lib/structs/requests.cpp               | 14 ++--------
 lib/structs/responses/public_rooms.cpp |  5 ++--
 tests/client_api.cpp                   | 16 +++++------
 tests/requests.cpp                     |  8 +++---
 tests/responses.cpp                    |  8 +++---
 10 files changed, 74 insertions(+), 88 deletions(-)

diff --git a/include/mtx/common.hpp b/include/mtx/common.hpp
index 70629c427..671f6bf0a 100644
--- a/include/mtx/common.hpp
+++ b/include/mtx/common.hpp
@@ -11,7 +11,7 @@
 #include <vector>
 
 /// @file
-/// @brief Common types used by the crypto related endpoints.
+/// @brief Common types used by the crypto related endpoints. Common types used by room directory endpoints.
 
 namespace mtx {
 namespace crypto {
@@ -119,4 +119,34 @@ void
 to_json(nlohmann::json &obj, const EncryptedFile &res);
 
 } // namespace crypto
+
+// 
+namespace common {
+        //! Whether or not the room will be visible by non members.
+enum class RoomVisibility
+{
+        //! A private visibility will hide the room from the published room list.
+        Private,
+        //! Indicates that the room will be shown in the published room list.
+        Public,
+};
+
+inline
+std::string visibilityToString(RoomVisibility visibility)
+{
+        if (visibility == RoomVisibility::Private) {
+                return "private";
+        }
+
+        return "public";
+}
+
+inline
+RoomVisibility stringToVisibility(const std::string &s) {
+    if (s == "private") {
+        return RoomVisibility::Private;
+    }
+    return RoomVisibility::Public;
+}
+} // namespace common
 } // namespace mtx
diff --git a/include/mtx/requests.hpp b/include/mtx/requests.hpp
index d9ee0031d..0423667db 100644
--- a/include/mtx/requests.hpp
+++ b/include/mtx/requests.hpp
@@ -15,23 +15,11 @@
 #endif
 
 using json = nlohmann::json;
+namespace common = mtx::common;
 
 namespace mtx {
 //! Namespace for request structs
 namespace requests {
-
-//! Whether or not the room will be visible by non members.
-enum class Visibility
-{
-        //! A private visibility will hide the room from the published room list.
-        Private,
-        //! Indicates that the room will be shown in the published room list
-        Public,
-};
-
-std::string
-visibilityToString(Visibility visibility);
-
 //! Convenience parameter for setting various default state events based on a preset.
 enum class Preset
 {
@@ -63,7 +51,7 @@ struct CreateRoom
         //! Convenience parameter for setting various default state events.
         Preset preset = Preset::PrivateChat;
         //! Whether or not the room will be visible by non members.
-        Visibility visibility = Visibility::Private;
+        common::RoomVisibility visibility = common::RoomVisibility::Private;
 };
 
 void
@@ -145,14 +133,14 @@ void
 to_json(json &obj, const TypingNotification &request);
 
 //! Request payload for the `PUT /_matrix/client/r0/directory/list/room/{roomId}` endpoint
-struct RoomVisibility
+struct PublicRoomVisibility
 {
         //! The new visibility setting for the room. Defaults to 'public'. One of: ["private", "public"]
-        Visibility visibility;
+        common::RoomVisibility visibility;
 };
 
 void
-to_json(json &obj, const RoomVisibility &request);
+to_json(json &obj, const PublicRoomVisibility &request);
 
 struct PublicRoomsFilter {
     //! A string to search for in the room metadata,
diff --git a/include/mtx/responses/public_rooms.hpp b/include/mtx/responses/public_rooms.hpp
index 702a08189..42290540a 100644
--- a/include/mtx/responses/public_rooms.hpp
+++ b/include/mtx/responses/public_rooms.hpp
@@ -4,50 +4,26 @@
 #include <string>
 #include <optional>
 
+#include "mtx/common.hpp"
+
 #if __has_include(<nlohmann/json_fwd.hpp>)
 #include <nlohmann/json_fwd.hpp>
 #else
 #include <nlohmann/json.hpp>
 #endif
 
+namespace common = mtx::common;
+
 namespace mtx {
 namespace responses {
-
-//! Whether or not the room will be visible by non members.
-enum class Visibility
-{
-        //! A private visibility will hide the room from the published room list.
-        Private,
-        //! Indicates that the room will be shown in the published room list.
-        Public,
-};
-
-inline
-std::string visibilityToString(Visibility visibility)
-{
-        if (visibility == Visibility::Private) {
-                return "private";
-        }
-
-        return "public";
-}
-
-inline
-Visibility stringToVisibility(const std::string &s) {
-    if (s == "private") {
-        return Visibility::Private;
-    }
-    return Visibility::Public;
-}
-
 //! Response from the `GET /_matrix/client/r0/directory/list/room/{roomId}`endpoint.
-struct RoomVisibility {
+struct PublicRoomVisibility {
     //! The visibility of the room in the directory. One of: ["private", "public"]
-    Visibility visibility;
+     common::RoomVisibility visibility;
 };
 
 void
-from_json(const nlohmann::json &obj, RoomVisibility &res);
+from_json(const nlohmann::json &obj, PublicRoomVisibility &res);
 
 struct PublicRoomsChunk
 {
diff --git a/include/mtxclient/http/client.hpp b/include/mtxclient/http/client.hpp
index 0ada81f15..abb735d49 100644
--- a/include/mtxclient/http/client.hpp
+++ b/include/mtxclient/http/client.hpp
@@ -20,6 +20,7 @@
 #include "mtx/secret_storage.hpp"
 #include "mtxclient/http/errors.hpp" // for ClientError
 #include "mtxclient/utils.hpp"       // for random_token, url_encode, des...
+// #include "mtx/common.hpp"
 
 #include <boost/beast/http/fields.hpp> // for fields
 #include <boost/beast/http/status.hpp> // for status
@@ -46,7 +47,7 @@ struct Login;
 struct QueryKeys;
 struct ClaimKeys;
 struct UploadKeys;
-struct RoomVisibility;
+struct PublicRoomVisibility;
 struct PublicRooms;
 }
 namespace responses {
@@ -74,7 +75,7 @@ struct TurnServer;
 struct UploadKeys;
 struct Versions;
 struct WellKnown;
-struct RoomVisibility;
+struct PublicRoomVisibility;
 struct PublicRooms;
 namespace backup {
 struct SessionBackup;
@@ -456,11 +457,11 @@ public:
 
         //! Gets the visibility of a given room on the server's public room directory.
         void get_room_visibility(const std::string &room_id,
-                                 Callback<mtx::responses::RoomVisibility> cb);
+                                 Callback<mtx::responses::PublicRoomVisibility> cb);
 
         //! Sets the visibility of a given room in the server's public room directory.
         void put_room_visibility(const std::string &room_id,
-                                 const mtx::requests::RoomVisibility &req,
+                                 const mtx::requests::PublicRoomVisibility &req,
                                  ErrCallback cb);
 
         //! Lists the public rooms on the server. This API returns paginated responses.
diff --git a/lib/http/client.cpp b/lib/http/client.cpp
index 1ae666a61..37fa3f0a5 100644
--- a/lib/http/client.cpp
+++ b/lib/http/client.cpp
@@ -963,25 +963,25 @@ Client::send_to_device(const std::string &event_type,
 }
 
 void
-Client::get_room_visibility(const std::string &room_id, Callback<mtx::responses::RoomVisibility> cb)
+Client::get_room_visibility(const std::string &room_id, Callback<mtx::responses::PublicRoomVisibility> cb)
 {
         const auto api_path =
           "/client/r0/directory/list/room/" + mtx::client::utils::url_encode(room_id);
 
-        get<mtx::responses::RoomVisibility>(
-          api_path, [cb](const mtx::responses::RoomVisibility &res, HeaderFields, RequestErr err) {
+        get<mtx::responses::PublicRoomVisibility>(
+          api_path, [cb](const mtx::responses::PublicRoomVisibility &res, HeaderFields, RequestErr err) {
                   cb(res, err);
           });
 }
 
 void
 Client::put_room_visibility(const std::string &room_id,
-                            const mtx::requests::RoomVisibility &req,
+                            const mtx::requests::PublicRoomVisibility &req,
                             ErrCallback cb)
 {
         const auto api_path =
           "/client/r0/directory/list/room/" + mtx::client::utils::url_encode(room_id);
-        put<mtx::requests::RoomVisibility>(api_path, req, cb);
+        put<mtx::requests::PublicRoomVisibility>(api_path, req, cb);
 }
 
 void
diff --git a/lib/structs/requests.cpp b/lib/structs/requests.cpp
index 8a63565a9..819791ee7 100644
--- a/lib/structs/requests.cpp
+++ b/lib/structs/requests.cpp
@@ -10,16 +10,6 @@ using namespace mtx::events::collections;
 namespace mtx {
 namespace requests {
 
-std::string
-visibilityToString(Visibility visibility)
-{
-        if (visibility == Visibility::Private) {
-                return "private";
-        }
-
-        return "public";
-}
-
 std::string
 presetToString(Preset preset)
 {
@@ -112,9 +102,9 @@ to_json(json &obj, const TypingNotification &request)
 }
 
 void
-to_json(json &obj, const RoomVisibility &request)
+to_json(json &obj, const PublicRoomVisibility &request)
 {
-        obj["visibility"] = visibilityToString(request.visibility);
+        obj["visibility"] = mtx::common::visibilityToString(request.visibility);
 }
 
 void
diff --git a/lib/structs/responses/public_rooms.cpp b/lib/structs/responses/public_rooms.cpp
index b07e6ad09..68535634d 100644
--- a/lib/structs/responses/public_rooms.cpp
+++ b/lib/structs/responses/public_rooms.cpp
@@ -2,14 +2,15 @@
 
 #include "mtx/identifiers.hpp"
 #include "mtx/responses/public_rooms.hpp"
+#include "mtx/common.hpp"
 
 namespace mtx {
 namespace responses {
 
 void
-from_json(const nlohmann::json &obj, RoomVisibility &res)
+from_json(const nlohmann::json &obj, PublicRoomVisibility &res)
 {
-        res.visibility = stringToVisibility(obj.at("visibility").get<std::string>());
+        res.visibility = mtx::common::stringToVisibility(obj.at("visibility").get<std::string>());
 }
 
 void
diff --git a/tests/client_api.cpp b/tests/client_api.cpp
index 1f4274614..cbd28cfc5 100644
--- a/tests/client_api.cpp
+++ b/tests/client_api.cpp
@@ -1600,7 +1600,7 @@ TEST(ClientAPI, PublicRooms)
         mtx::requests::CreateRoom req;
         req.name            = "Public Room";
         req.topic           = "Test";
-        req.visibility      = Visibility::Public;
+        req.visibility      = mtx::common::RoomVisibility::Public;
         req.invite          = {"@bob:localhost"};
         req.room_alias_name = alice->generate_txn_id();
         req.preset          = Preset::PublicChat;
@@ -1612,8 +1612,8 @@ TEST(ClientAPI, PublicRooms)
                   std::cout << "Created room w/ Room ID: " << room_id.to_string() << std::endl;
 
                   // TEST 1: endpoints to set and get the visibility of the room we just created
-                  mtx::requests::RoomVisibility r;
-                  r.visibility = mtx::requests::Visibility::Public;
+                  mtx::requests::PublicRoomVisibility r;
+                  r.visibility = mtx::common::RoomVisibility::Public;
 
                   alice->put_room_visibility(
                     room_id.to_string(), r, [alice, bob, room_id](RequestErr err) {
@@ -1621,7 +1621,7 @@ TEST(ClientAPI, PublicRooms)
 
                             alice->get_room_visibility(
                               "",
-                              [alice, room_id](const mtx::responses::RoomVisibility &,
+                              [alice, room_id](const mtx::responses::PublicRoomVisibility &,
                                                RequestErr err) {
                                       ASSERT_TRUE(err);
                                       EXPECT_EQ(mtx::errors::to_string(err->matrix_error.errcode),
@@ -1631,9 +1631,9 @@ TEST(ClientAPI, PublicRooms)
                             alice->get_room_visibility(
                               room_id.to_string(),
                               [alice, bob, room_id](
-                                const mtx::responses::RoomVisibility &res, RequestErr err) {
+                                const mtx::responses::PublicRoomVisibility &res, RequestErr err) {
                                       check_error(err);
-                                      EXPECT_EQ(visibilityToString(res.visibility), "public");
+                                      EXPECT_EQ(mtx::common::visibilityToString(res.visibility), "public");
 
                                       // TEST 2: endpoints to add and list the public rooms on the
                                       // server
@@ -1676,8 +1676,8 @@ TEST(ClientAPI, PublicRooms)
                                                                                 EXPECT_EQ(res.chunk[0].num_joined_members, 2);
 
                                                                                 // Teardown: remove the room from the room directory (maintain future tests)
-                                                                                mtx::requests::RoomVisibility r;
-                                                                                r.visibility = mtx::requests::Visibility::Private;
+                                                                                mtx::requests::PublicRoomVisibility r;
+                                                                                r.visibility = mtx::common::RoomVisibility::Private;
                                                                                 alice->put_room_visibility(
                                                                                 room_id.to_string(), r, [alice, bob, room_id](RequestErr err) {
                                                                                         check_error(err);
diff --git a/tests/requests.cpp b/tests/requests.cpp
index ffb1a38cb..07b7c6e4d 100644
--- a/tests/requests.cpp
+++ b/tests/requests.cpp
@@ -283,14 +283,14 @@ TEST(Requests, UserInteractiveAuth)
 
 TEST(Requests, RoomVisibility)
 {
-        RoomVisibility req;
-        req.visibility = Visibility::Private;
+        mtx::requests::PublicRoomVisibility req;
+        req.visibility = mtx::common::RoomVisibility::Private;
         json j         = req;
         EXPECT_EQ(j, R"({
     "visibility" : "private"
   })"_json);
 
-        req.visibility = Visibility::Public;
+        req.visibility = mtx::common::RoomVisibility::Public;
         j              = req;
         EXPECT_EQ(j, R"({
     "visibility" : "public"
@@ -334,5 +334,5 @@ TEST(Requests, PublicRooms)
         b3.include_all_networks    = true;
         b3.third_party_instance_id = "irc";
 
-        // EXPECT_THROW(json req = b3, std::invalid_argument);
+        EXPECT_THROW(json req = b3, std::invalid_argument);
 }
diff --git a/tests/responses.cpp b/tests/responses.cpp
index 55d2c340b..4fa11bdfb 100644
--- a/tests/responses.cpp
+++ b/tests/responses.cpp
@@ -1105,15 +1105,15 @@ TEST(Responses, TurnServer)
         EXPECT_EQ(turnServer.ttl, 86400);
 }
 
-TEST(Responses, RoomVisibility)
+TEST(Responses, PublicRoomVisibility)
 {
         json data                     = {{"visibility", "public"}};
-        RoomVisibility roomVisibility = data;
-        EXPECT_EQ(roomVisibility.visibility, mtx::responses::Visibility::Public);
+        mtx::responses::PublicRoomVisibility roomVisibility = data;
+        EXPECT_EQ(roomVisibility.visibility, mtx::common::RoomVisibility::Public);
 
         data           = {{"visibility", "private"}};
         roomVisibility = data;
-        EXPECT_EQ(roomVisibility.visibility, mtx::responses::Visibility::Private);
+        EXPECT_EQ(roomVisibility.visibility, mtx::common::RoomVisibility::Private);
 }
 
 TEST(Responses, PublicRooms)
-- 
GitLab