1#include "sessions_controller.h"
3namespace cavoke::server::controllers {
5using json = nlohmann::json;
7void SessionsController::create(
8 const drogon::HttpRequestPtr &req,
9 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback) {
14 auto game_id = req->getOptionalParameter<std::string>(
"game_id");
15 if (!game_id.has_value()) {
16 return CALLBACK_STATUS_CODE(k400BadRequest);
19 auto game = m_games_storage->get_game_by_id(game_id.value());
20 if (!game.has_value()) {
21 return callback(newCavokeErrorResponse(
22 {
"game '" + game_id.value() +
"' not found",
23 cavoke_base_exception::error_code::NotFound},
24 drogon::k404NotFound));
28 model::GameSessionAccessObject::GameSessionInfo session_info;
30 session_info = m_participation_storage->create_session(
31 game.value().config, user_id,
"");
32 }
catch (
const model::game_session_error &err) {
33 return callback(newCavokeErrorResponse(err, drogon::k400BadRequest));
35 return callback(newNlohmannJsonResponse(session_info));
38void SessionsController::join(
39 const drogon::HttpRequestPtr &req,
40 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
41 const std::string &session_id) {
46 model::GameSessionAccessObject::GameSessionInfo session_info;
48 session_info = m_participation_storage->join_session(
49 session_id, user_id, req->getOptionalParameter<
int>(
"position"));
50 }
catch (
const model::game_session_error &err) {
51 return callback(newCavokeErrorResponse(err, drogon::k400BadRequest));
54 return callback(newNlohmannJsonResponse(session_info));
57SessionsController::SessionsController(
58 std::shared_ptr<model::GamesStorage> mGamesStorage,
59 std::shared_ptr<model::GameLogicManager> mGameLogicManager,
60 std::shared_ptr<model::GameStateStorage> mGameStateStorage,
61 std::shared_ptr<model::SessionsStorage> mParticipationStorage)
62 : m_games_storage(std::move(mGamesStorage)),
63 m_game_logic_manager(std::move(mGameLogicManager)),
64 m_game_state_storage(std::move(mGameStateStorage)),
65 m_participation_storage(std::move(mParticipationStorage)) {
68void SessionsController::validate(
69 const drogon::HttpRequestPtr &req,
70 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
71 const std::string &session_id) {
75 model::GameSessionAccessObject session;
77 session = m_participation_storage->get_sessionAO(session_id);
78 }
catch (
const model::game_session_error &err) {
79 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
82 if (!session.is_player(user_id)) {
83 return CALLBACK_STATUS_CODE(k403Forbidden);
87 json result = m_participation_storage->validate_session(session_id, {});
88 if (result[
"success"].get<bool>()) {
89 result.erase(result.find(
"message"));
91 return callback(newNlohmannJsonResponse(result));
94void SessionsController::start(
95 const drogon::HttpRequestPtr &req,
96 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
97 const std::string &session_id) {
101 model::GameSessionAccessObject session;
103 session = m_participation_storage->get_sessionAO(session_id);
104 }
catch (
const model::game_session_error &err) {
105 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
108 if (!session.is_player(user_id)) {
109 return CALLBACK_STATUS_CODE(k403Forbidden);
114 m_participation_storage->start_session(session_id, {});
115 }
catch (
const model::validation_error &err) {
116 return callback(newCavokeErrorResponse(err, drogon::k400BadRequest));
117 }
catch (
const model::game_session_error &err) {
118 return callback(newCavokeErrorResponse(err, drogon::k400BadRequest));
121 return CALLBACK_STATUS_CODE(k200OK);
124void SessionsController::get_info(
125 const drogon::HttpRequestPtr &req,
126 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
127 const std::string &session_id) {
128 model::GameSessionAccessObject session;
130 session = m_participation_storage->get_sessionAO(session_id);
131 }
catch (
const model::game_session_error &err) {
132 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
135 return callback(newNlohmannJsonResponse(session.get_session_info()));
138void SessionsController::leave(
139 const drogon::HttpRequestPtr &req,
140 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
141 const std::string &session_id) {
145 model::GameSessionAccessObject session;
147 session = m_participation_storage->get_sessionAO(session_id);
148 }
catch (
const model::game_session_error &err) {
149 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
152 session.leave_session(user_id);
154 return CALLBACK_STATUS_CODE(k200OK);
157void SessionsController::change_role(
158 const drogon::HttpRequestPtr &req,
159 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
160 const std::string &session_id) {
165 auto new_role = req->getOptionalParameter<
int>(
"new_role");
166 if (!new_role.has_value()) {
167 return CALLBACK_STATUS_CODE(k400BadRequest);
170 model::GameSessionAccessObject session;
172 session = m_participation_storage->get_sessionAO(session_id);
173 }
catch (
const model::game_session_error &err) {
174 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
178 session.set_role(user_id, new_role.value());
179 }
catch (model::game_session_error &err) {
180 return callback(newCavokeErrorResponse(err, drogon::k400BadRequest));
183 return CALLBACK_STATUS_CODE(k200OK);
static std::string get_user_id(const HttpRequestPtr &)
Acquires user_id parsed during AuthFilter's execution.