#include "DashboardRoutes.h" #include "ServerState.h" #include "Web.h" #include "HTTPContext.h" #include "eHTTPMethod.h" #include "json.hpp" #include "Game.h" #include "Database.h" #include "Logger.h" #include "inja.hpp" #include "AuthMiddleware.h" #include "RequireAuthMiddleware.h" void RegisterDashboardRoutes() { // GET / - Main dashboard page (requires authentication) Game::web.RegisterHTTPRoute({ .path = "/", .method = eHTTPMethod::GET, .middleware = { std::make_shared(0) }, .handle = [](HTTPReply& reply, const HTTPContext& context) { try { // Initialize inja environment inja::Environment env{"dDashboardServer/templates/"}; env.set_trim_blocks(true); env.set_lstrip_blocks(true); // Prepare data for template nlohmann::json data = context.GetUserDataJson(); // Server status - merge with server state nlohmann::json serverState = ServerState::GetServerStateJson(); data.merge_patch(serverState); // Statistics data["stats"]["onlinePlayers"] = 0; // TODO: Get from server communication data["stats"]["totalAccounts"] = Database::Get()->GetAccountCount(); data["stats"]["totalCharacters"] = Database::Get()->GetCharacterCount(); // Render template const std::string html = env.render_file("index.jinja2", data); reply.status = eHTTPStatusCode::OK; reply.message = html; reply.contentType = eContentType::TEXT_HTML; } catch (const std::exception& ex) { LOG("Error rendering template: %s", ex.what()); reply.status = eHTTPStatusCode::INTERNAL_SERVER_ERROR; reply.message = "{\"error\":\"Failed to render template\"}"; reply.contentType = eContentType::APPLICATION_JSON; } } }); // GET /login - Login page (no authentication required) Game::web.RegisterHTTPRoute({ .path = "/login", .method = eHTTPMethod::GET, .middleware = {}, .handle = [](HTTPReply& reply, const HTTPContext& context) { try { // Initialize inja environment inja::Environment env{"dDashboardServer/templates/"}; env.set_trim_blocks(true); env.set_lstrip_blocks(true); // Render template with empty user data (not authenticated) nlohmann::json data = context.GetUserDataJson(); const std::string html = env.render_file("login.jinja2", data); reply.status = eHTTPStatusCode::OK; reply.message = html; reply.contentType = eContentType::TEXT_HTML; } catch (const std::exception& ex) { LOG("Error rendering login template: %s", ex.what()); reply.status = eHTTPStatusCode::INTERNAL_SERVER_ERROR; reply.message = "{\"error\":\"Failed to render login page\"}"; reply.contentType = eContentType::APPLICATION_JSON; } } }); }