#include "controllers/UserController.h" #include "common/Auth.h" #include "common/Http.h" #include "services/UserService.h" #include using drogon::HttpResponsePtr; namespace { std::optional queryValue(const drogon::HttpRequestPtr &req, const std::string &key) { const auto value = req->getParameter(key); if (value.empty()) { return std::nullopt; } return value; } 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; } } // namespace void UserController::listNotifications( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::UserService service; callback(visione::http::json(service.listNotifications(*user, queryValue(req, "page"), queryValue(req, "per_page")))); } void UserController::markNotificationRead( const drogon::HttpRequestPtr &req, std::function &&callback, long long notificationId) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::UserService service; auto body = service.markNotificationRead(*user, notificationId); const auto status = body.get("ok", false).asBool() ? drogon::k200OK : drogon::k404NotFound; callback(visione::http::json(std::move(body), status)); } void UserController::markAllNotificationsRead( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::UserService service; callback(visione::http::json(service.markAllNotificationsRead(*user))); } void UserController::rewards( const drogon::HttpRequestPtr &req, std::function &&callback) { auto user = requireUser(req, callback); if (!user || blockPasswordChangeRequired(*user, callback)) { return; } visione::services::UserService service; callback(visione::http::json(service.rewards(*user, queryValue(req, "page"), queryValue(req, "per_page")))); }