diff --git a/components/CommandManager/CMakeLists.txt b/components/CommandManager/CMakeLists.txt new file mode 100644 index 0000000..7812a34 --- /dev/null +++ b/components/CommandManager/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "CommandManager/CommandManager.cpp" + INCLUDE_DIRS "CommandManager" + REQUIRES ProjectConfig +) \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.cpp b/components/CommandManager/CommandManager/CommandManager.cpp new file mode 100644 index 0000000..bcbf092 --- /dev/null +++ b/components/CommandManager/CommandManager/CommandManager.cpp @@ -0,0 +1,21 @@ +#include "CommandManager.hpp" + +std::unique_ptr CommandManager::createCommand(CommandType type) +{ + switch (type) + { + case CommandType::PING: + return std::make_unique(); + break; + case CommandType::UPDATE_WIFI: + return std::make_unique(projectConfig); + default: + return nullptr; + } +} + +CommandResult CommandManager::executeFromJson(const std::string *json) +{ + // parse it, get a type of command, grab a command from the map based on type + // parse the payload json, call execute on the command and return the result +} \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.hpp b/components/CommandManager/CommandManager/CommandManager.hpp new file mode 100644 index 0000000..6bd65d7 --- /dev/null +++ b/components/CommandManager/CommandManager/CommandManager.hpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" +#include "Commands.hpp" + +const enum CommandType { + None, + PING, + SET_WIFI, + UPDATE_WIFI, + DELETE_NETWORK, + SAVE_CONFIG, +}; + +std::unordered_map commandTypeMap = { + {"ping", CommandType::PING}, + {"set_wifi", CommandType::SET_WIFI}, + {"update_wifi", CommandType::UPDATE_WIFI}, + {"delete_network", CommandType::DELETE_NETWORK}, + {"save_config", CommandType::SAVE_CONFIG}, +}; + +class CommandManager +{ + ProjectConfig &projectConfig; + +public: + CommandManager(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; + std::unique_ptr createCommand(CommandType type); + + CommandResult executeFromJson(const std::string *json); +}; \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandResult.hpp b/components/CommandManager/CommandManager/CommandResult.hpp new file mode 100644 index 0000000..c59fb4c --- /dev/null +++ b/components/CommandManager/CommandManager/CommandResult.hpp @@ -0,0 +1,39 @@ +class CommandResult +{ +private: + std::optional successMessage; + std::optional errorMessage; + +public: + CommandResult(std::optional success_message, + std::optional error_message) + { + if (success_message.has_value()) + { + this->successMessage = + "{\"message\":\"" + success_message.value() + "\"}"; + } + else + this->successMessage = std::nullopt; + + if (error_message.has_value()) + this->errorMessage = "{\"error\":\"" + error_message.value() + "\"}"; + else + this->errorMessage = std::nullopt; + } + + bool isSuccess() const { return successMessage.has_value(); } + + static CommandResult getSuccessResult(std::string message) + { + return CommandResult(message, std::nullopt); + } + + static CommandResult getErrorResult(std::string message) + { + return CommandResult(std::nullopt, message); + } + + std::string getSuccessMessage() const { return successMessage.value(); }; + std::string getErrorMessage() const { return errorMessage.value(); } +}; diff --git a/components/CommandManager/CommandManager/CommandSchema.hpp b/components/CommandManager/CommandManager/CommandSchema.hpp new file mode 100644 index 0000000..92006de --- /dev/null +++ b/components/CommandManager/CommandManager/CommandSchema.hpp @@ -0,0 +1,26 @@ +class BasePayload +{ +}; + +class WifiPayload : public BasePayload +{ + std::string networkName; + std::string ssid; + std::string password; + uint8_t channel; + uint8_t power; +}; + +class UpdateWifiPayload : public BasePayload +{ + std::optional networkName; + std::optional ssid; + std::optional password; + std::optional channel; + std::optional power; +}; + +class deleteNetworkPayload : public BasePayload +{ + std::optional networkName; +}; \ No newline at end of file diff --git a/components/CommandManager/CommandManager/Commands.cpp b/components/CommandManager/CommandManager/Commands.cpp new file mode 100644 index 0000000..6dd07fe --- /dev/null +++ b/components/CommandManager/CommandManager/Commands.cpp @@ -0,0 +1 @@ +#include "Commands.hpp" diff --git a/components/CommandManager/CommandManager/Commands.hpp b/components/CommandManager/CommandManager/Commands.hpp new file mode 100644 index 0000000..7178aee --- /dev/null +++ b/components/CommandManager/CommandManager/Commands.hpp @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" + +class Command +{ + virtual ~Command() = default; + virtual CommandResult execute(const std::shared_ptr &payload) = 0; + virtual std::shared_ptr parsePayload(const std::string *json) = 0; +}; + +class PingCommand : public Command +{ +public: + CommandResult execute(const std::shared_ptr &payload); + std::shared_ptr parsePayload(const std::string *json); +}; + +class setConfigCommand : public Command +{ +public: + CommandResult execute(const std::shared_ptr &payload); + std::shared_ptr parsePayload(const std::string *json); +}; + +class UpdateWifiCommand : public Command +{ +private: + ProjectConfig &projectConfig; + +public: + UpdateWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(const std::shared_ptr &payload); +}; diff --git a/components/RestAPI/CMakeLists.txt b/components/RestAPI/CMakeLists.txt index 4037f21..2d811e6 100644 --- a/components/RestAPI/CMakeLists.txt +++ b/components/RestAPI/CMakeLists.txt @@ -1,5 +1,4 @@ idf_component_register(SRCS "RestAPI/RestAPI.cpp" INCLUDE_DIRS "RestAPI" - # REQUIRES CommandManager mongoose - REQUIRES mongoose + REQUIRES CommandManager mongoose ) \ No newline at end of file