#pragma once #include "esp_http_server.h" #include #include "network/web_server_handler.h" #include "ui/apps/iotdis/settings/settings_handler.h" #include "ui/apps/iotdis/bridge/bridge.h" /** * @brief HTTP request handlers for Discord Bridge settings web interface * * These handlers serve the web configuration page and process * settings updates and connection tests. */ class WebHandler { public: WebHandler( SettingHandler* setting_handler, IotDisBridge* bridge ) : web_server_(std::make_unique()) , setting_handler_(setting_handler) , bridge_(bridge) { } ~WebHandler(); esp_err_t start_web_server(); esp_err_t stop_web_server(); std::string get_url() const; std::string get_device_ip() const; uint16_t get_port() const; bool is_running() const { return web_server_ && web_server_->is_running(); } private: std::string generate_auth_key_(); esp_err_t register_web_endpoints_(); /** * @brief Serve the main settings configuration page * * Validates authentication and serves an HTML form with current settings. * Requires auth query parameter matching the session key. * * @param req HTTP request object * @return ESP_OK on success */ static esp_err_t settings_page_handler_(httpd_req_t* req); /** * @brief Save bridge connection settings * * Parses POST data containing ip, port, and localPort fields. * Validates and persists settings to NVS storage. * * @param req HTTP request object * @return ESP_OK on success */ static esp_err_t save_settings_handler_(httpd_req_t* req); /** * @brief Test connection to Discord bridge * * Creates temporary UDP client to test connectivity with provided settings. * Returns JSON response indicating success or failure. * * @param req HTTP request object * @return ESP_OK on success */ static esp_err_t test_connection_handler_(httpd_req_t* req); std::unique_ptr web_server_; SettingHandler* setting_handler_ = nullptr; ///< Pointer to settings handler (not owned) std::string auth_key_; IotDisBridge* bridge_ = nullptr; ///< Pointer to IotDisBridge (not owned) };