diff --git a/server/lib/CMakeLists.txt b/server/lib/CMakeLists.txt index f54c2dba06f75d30597b53dca3bcdf133d28477d..48eeef1ea94c17c51d542f44b31d71efbd4e756e 100644 --- a/server/lib/CMakeLists.txt +++ b/server/lib/CMakeLists.txt @@ -1,2 +1,5 @@ add_subdirectory(wrappers) +add_subdirectory(plugins_bundle) +add_subdirectory(response_generators) +add_subdirectory(connection) add_subdirectory(server) diff --git a/server/lib/connection/CMakeLists.txt b/server/lib/connection/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..70ceeda5a984cde82b0990512c6a3e51f15ac12b --- /dev/null +++ b/server/lib/connection/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(connection connection.cpp) +target_include_directories(connection PUBLIC ./) +target_link_libraries(connection response_generators) diff --git a/server/lib/connection/connection.cpp b/server/lib/connection/connection.cpp new file mode 100644 index 0000000000000000000000000000000000000000..07018e50dbfe07b29132b296cd204a6c774491dc --- /dev/null +++ b/server/lib/connection/connection.cpp @@ -0,0 +1,63 @@ +#include "connection.hpp" +#include +#include +#include + +using nlohmann::json; + +TCPConnection::TCPConnection( + boost::asio::ip::tcp::socket socket, + std::unique_ptr response_generator) + : socket_(std::move(socket)), + response_generator_(std::move(response_generator)) { +} + +void TCPConnection::start() { + do_read(); +} + +void TCPConnection::do_read() { + auto self = shared_from_this(); + + // https://stackoverflow.com/questions/3058589/boostasioasync-read-until-reads-all-data-instead-of-just-some + boost::asio::async_read_until( + socket_, + request_buffer, + "\n\r", + [this, self](boost::system::error_code error_code, std::size_t length) { + if (error_code) { + // Заменим на логер + std::cerr << "Couldn't read from user" << std::endl; + return; + } + request_buffer.commit(length); + std::istream istrm(&request_buffer); + std::string result; + istrm >> result; + + json response = response_generator_->handle(result); + do_write(response); + + // json parsed_request = json::parse(result); + // assert(parsed_request.is_object()); + // assert(parsed_request.contains("query_type")); + // + // json query_type = parsed_request["query_type"]; + // assert(query_type.is_string()); + // + // parsed_request["query_type"]; + }); +} + +void TCPConnection::do_write(std::string response) { + auto self(shared_from_this()); + boost::asio::async_write( + socket_, + boost::asio::buffer(response, response.length()), + [this, self](boost::system::error_code ec, std::size_t length) { + if (ec) { + std::cerr << "Couldn't respond to user" << std::endl; + } + do_read(); + }); +} diff --git a/server/lib/connection/connection.hpp b/server/lib/connection/connection.hpp new file mode 100644 index 0000000000000000000000000000000000000000..272ccbf2d852bca882b5e4f94b498b6b9d6c38c2 --- /dev/null +++ b/server/lib/connection/connection.hpp @@ -0,0 +1,25 @@ +#ifndef CONNECTION_H +#define CONNECTION_H + +#include "response_generators.hpp" +#include +#include + +class TCPConnection : public std::enable_shared_from_this { + public: + explicit TCPConnection( + boost::asio::ip::tcp::socket socket, + std::unique_ptr response_generator); + + void start(); + + private: + boost::asio::ip::tcp::socket socket_; + boost::asio::streambuf request_buffer; + std::unique_ptr response_generator_; + + void do_read(); + void do_write(std::string response); +}; + +#endif // !CONNECTION_H diff --git a/server/lib/plugins_bundle/CMakeLists.txt b/server/lib/plugins_bundle/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..2b67bdfb2b01c6ef6d6cf3d895b6380d82c699ff --- /dev/null +++ b/server/lib/plugins_bundle/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(plugins_bundle plugins_bundle.cpp) +target_link_libraries(plugins_bundle serverside_plugin_wrappers) +target_include_directories(plugins_bundle PUBLIC ./) diff --git a/server/lib/plugins_bundle/plugins_bundle.cpp b/server/lib/plugins_bundle/plugins_bundle.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/server/lib/plugins_bundle/plugins_bundle.hpp b/server/lib/plugins_bundle/plugins_bundle.hpp new file mode 100644 index 0000000000000000000000000000000000000000..8895a9ce7c1097ce5ddd6ccc08d6df73af244e62 --- /dev/null +++ b/server/lib/plugins_bundle/plugins_bundle.hpp @@ -0,0 +1,53 @@ +#ifndef PLUGINS_BUNDLE_H +#define PLUGINS_BUNDLE_H + +#include "wrappers.hpp" +#include +#include +#include + +class PluginsBundle { + public: + // clang-format off + auto get_definitions(std::string word) + -> DefinitionsProviderWrapper::provided_type; + + auto get_sentences(std::string word) + -> SentencesProviderWrapper::provided_type; + + auto get_images(std::string word) + -> ImagesProviderWrapper::provided_type; + + auto get_audios(std::string word) + -> AudiosProviderWrapper::provided_type; + + auto save_results(std::string word) + -> FormatProcessorWrapper::provided_type; + // clang-format on + + auto get_definitions_providers_config(JSON new_config) -> JSON; + auto set_definitions_providers_config(JSON new_config) -> JSON; + + auto get_sentences_providers_config(JSON new_config) -> JSON; + auto set_sentences_providers_config(JSON new_config) -> JSON; + + auto get_images_providers_config(JSON new_config) -> JSON; + auto set_images_providers_config(JSON new_config) -> JSON; + + auto get_audios_providers_config(JSON new_config) -> JSON; + auto set_audios_providers_config(JSON new_config) -> JSON; + + auto get_format_processors_config(JSON new_config) -> JSON; + auto set_format_processors_config(JSON new_config) -> JSON; + + private: + // std::optional definitions_provider_ = + // std::nullopt; + // std::optional sentences_provider_ = + // std::nullopt; std::optional images_provider_ = + // std::nullopt; std::optional audios_provider_ = + // std::nullopt; std::optional format_processor_ + // = std::nullopt; +}; + +#endif // !PLUGINS_BUNDLE_H diff --git a/server/lib/response_generators/CMakeLists.txt b/server/lib/response_generators/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..6c712105cc40c495049478b3b0a5c1a56a0507e5 --- /dev/null +++ b/server/lib/response_generators/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(response_generators response_generators.cpp) +target_include_directories(response_generators PUBLIC ./) diff --git a/server/lib/response_generators/response_generators.cpp b/server/lib/response_generators/response_generators.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/server/lib/response_generators/response_generators.hpp b/server/lib/response_generators/response_generators.hpp new file mode 100644 index 0000000000000000000000000000000000000000..74eec16379b81f840d73a79210605e026cefa7db --- /dev/null +++ b/server/lib/response_generators/response_generators.hpp @@ -0,0 +1,29 @@ +#ifndef RESPONSE_GENERATORS_H +#define RESPONSE_GENERATORS_H + +#include +#include + +class IResponceGenerator { + public: + explicit IResponceGenerator(); + + virtual ~IResponceGenerator() = default; + + virtual auto handle(std::string request) -> nlohmann::json; + + IResponceGenerator(const IResponceGenerator &) = default; + IResponceGenerator(IResponceGenerator &&) = default; + auto operator=(const IResponceGenerator &) + -> IResponceGenerator & = default; + auto operator=(IResponceGenerator &&) -> IResponceGenerator & = default; +}; + +class ResponceGenerator : public IResponceGenerator { + public: + ResponceGenerator(); + + auto handle(std::string request) -> nlohmann::json override; +}; + +#endif // !RESPONSE_GENERATORS_H diff --git a/server/lib/server/CMakeLists.txt b/server/lib/server/CMakeLists.txt index 9604d827f10153b6e0464ab3abe1aad18ec093af..5828c572b394bc1788d9b89ddf7a5f4c019102ac 100644 --- a/server/lib/server/CMakeLists.txt +++ b/server/lib/server/CMakeLists.txt @@ -4,6 +4,7 @@ add_library(plugin_server server.cpp) target_link_libraries(plugin_server PUBLIC serverside_plugin_wrappers + connection PRIVATE nlohmann_json::nlohmann_json) target_include_directories(plugin_server PUBLIC ./) diff --git a/server/lib/server/server.cpp b/server/lib/server/server.cpp index ae71081364305ebb236e6f489b9a7a3887fa9e71..c60bce74550225c1d88511a301520b12bf4e8b8f 100644 --- a/server/lib/server/server.cpp +++ b/server/lib/server/server.cpp @@ -1,4 +1,5 @@ #include "server.hpp" +#include "connection.hpp" #include #include #include @@ -15,55 +16,6 @@ using boost::asio::ip::tcp; using nlohmann::json; -TCPConnection::TCPConnection( - boost::asio::ip::tcp::socket socket, - std::unique_ptr response_generator) - : socket_(std::move(socket)) { - response_generator_.reset(std::move(response_generator)); -} - -void TCPConnection::start() { - do_read(); -} - -void TCPConnection::do_read() { - auto self = shared_from_this(); - - // https://stackoverflow.com/questions/3058589/boostasioasync-read-until-reads-all-data-instead-of-just-some - boost::asio::async_read_until( - socket_, - request_buffer, - "\n\r", - [this, self](boost::system::error_code error_code, std::size_t length) { - if (error_code) { - std::cerr << "TCPSesssion error: " << error_code << std::endl; - return; - } - request_buffer.commit(length); - std::istream istrm(&request_buffer); - std::string result; - istrm >> result; - - json parsed_request = json::parse(result); - assert(parsed_request.is_object()); - assert(parsed_request.contains("query_type")); - - json query_type = parsed_request["query_type"]; - assert(query_type.is_string()); - - parsed_request["query_type"]; - }); -} - -void TCPConnection::do_write(std::size_t length) { - // auto self(shared_from_this()); - // boost::asio::async_write( - // socket_, - // boost::asio::buffer(data_, length), - // [this, self](boost::system::error_code ec, std::size_t /*length*/) // - // {}); -} - PluginServer::PluginServer(boost::asio::io_context &context, uint16_t port) : io_context_(context), acceptor_(io_context_, tcp::endpoint(tcp::v4(), port)) { diff --git a/server/lib/server/server.hpp b/server/lib/server/server.hpp index 5494db61ccd90d44673094d1bb2c4c7bf04c572e..a23083e10dcf77c8cd6d2ad8186eb9f07e8ee372 100644 --- a/server/lib/server/server.hpp +++ b/server/lib/server/server.hpp @@ -17,91 +17,6 @@ #include #include -using UserID = uint16_t; - -class PluginsBundle { - public: - // clang-format off - auto get_definitions(std::string word) - -> DefinitionsProviderWrapper::provided_type; - - auto get_sentences(std::string word) - -> SentencesProviderWrapper::provided_type; - - auto get_images(std::string word) - -> ImagesProviderWrapper::provided_type; - - auto get_audios(std::string word) - -> AudiosProviderWrapper::provided_type; - - auto save_results(std::string word) - -> FormatProcessorWrapper::provided_type; - // clang-format on - - auto get_definitions_providers_config(JSON new_config) -> JSON; - auto set_definitions_providers_config(JSON new_config) -> JSON; - - auto get_sentences_providers_config(JSON new_config) -> JSON; - auto set_sentences_providers_config(JSON new_config) -> JSON; - - auto get_images_providers_config(JSON new_config) -> JSON; - auto set_images_providers_config(JSON new_config) -> JSON; - - auto get_audios_providers_config(JSON new_config) -> JSON; - auto set_audios_providers_config(JSON new_config) -> JSON; - - auto get_format_processors_config(JSON new_config) -> JSON; - auto set_format_processors_config(JSON new_config) -> JSON; - - private: - // std::optional definitions_provider_ = - // std::nullopt; - // std::optional sentences_provider_ = - // std::nullopt; std::optional images_provider_ = - // std::nullopt; std::optional audios_provider_ = - // std::nullopt; std::optional format_processor_ - // = std::nullopt; -}; - -class IResponceGenerator { - public: - explicit IResponceGenerator(nlohmann::json request); - - virtual ~IResponceGenerator() = default; - - virtual auto handle() -> nlohmann::json; - - IResponceGenerator(const IResponceGenerator &) = default; - IResponceGenerator(IResponceGenerator &&) = default; - IResponceGenerator &operator=(const IResponceGenerator &) = default; - IResponceGenerator &operator=(IResponceGenerator &&) = default; -}; - -class ResponceGenerator : public IResponceGenerator { - public: - explicit ResponceGenerator(nlohmann::json request); - - auto handle() -> nlohmann::json override; -}; - -class TCPConnection : public std::enable_shared_from_this { - public: - explicit TCPConnection( - boost::asio::ip::tcp::socket socket, - std::unique_ptr response_generator); - - void start(); - - private: - boost::asio::ip::tcp::socket socket_; - boost::asio::streambuf request_buffer; - std::unique_ptr response_generator_; - - void do_read(); - void do_write(std::size_t length); - void handle_request(std::string); -}; - class PluginServer { public: explicit PluginServer(boost::asio::io_context &context, uint16_t port); @@ -118,10 +33,7 @@ class PluginServer { void start_accept(); - void handle_accept( - // TCPConnection::pointer new_connection, - const boost::system::error_code &error); - // clang-format on + void handle_accept(const boost::system::error_code &error); }; #endif // SERVER_H!