#include "controllers/AdminController.h" #include "common/Auth.h" #include "common/Http.h" #include "services/AdminService.h" using drogon::HttpResponsePtr; namespace { std::optional requireUser( const drogon::HttpRequestPtr &req, std::function &callback) { const auto user = visione::auth::authenticate(req); if (!user) { callback(visione::http::error("unauthorized", drogon::k401Unauthorized)); } return user; } bool blockPasswordChangeRequired( const visione::auth::UserContext &user, std::function &callback) { if (!visione::auth::mustChangePassword(user)) { return false; } callback(visione::http::error("password_change_required", drogon::k403Forbidden)); return true; } void sendAdmin(Json::Value body, std::function &&callback) { if (body.get("ok", false).asBool()) { callback(visione::http::json(std::move(body))); return; } const auto error = body.get("error", "").asString(); const auto status = error == "forbidden" ? drogon::k403Forbidden : drogon::k400BadRequest; callback(visione::http::json(std::move(body), status)); } } // namespace void AdminController::listCategories( const drogon::HttpRequestPtr &, std::function &&callback) { visione::services::AdminService service; callback(visione::http::json(service.listCategories())); } void AdminController::createCategory( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.createCategory(*user, visione::http::requireJson(req)), std::move(callback)); } void AdminController::listAreas( const drogon::HttpRequestPtr &, std::function &&callback) { visione::services::AdminService service; callback(visione::http::json(service.listAreas())); } void AdminController::createArea( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.createArea(*user, visione::http::requireJson(req)), std::move(callback)); } void AdminController::listTeams( const drogon::HttpRequestPtr &, std::function &&callback) { visione::services::AdminService service; callback(visione::http::json(service.listTeams())); } void AdminController::createTeam( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.createTeam(*user, visione::http::requireJson(req)), std::move(callback)); } void AdminController::overviewStats( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.overviewStats(*user), std::move(callback)); } void AdminController::listUsers( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.listUsers(*user), std::move(callback)); } void AdminController::updateUserRoles( const drogon::HttpRequestPtr &req, std::function &&callback, long long userId) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.updateUserRoles(*user, userId, visione::http::requireJson(req)), std::move(callback)); } void AdminController::updateUserBan( const drogon::HttpRequestPtr &req, std::function &&callback, long long userId) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::AdminService service; sendAdmin(service.updateUserBan(*user, userId, visione::http::requireJson(req)), std::move(callback)); }