mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-02-25 20:29:54 +00:00
82 lines
2.7 KiB
C++
82 lines
2.7 KiB
C++
#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<RequireAuthMiddleware>(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;
|
|
}
|
|
}
|
|
});
|
|
}
|