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