Cavoke  1.1.0
A Platform for creating and hosting multiplayer turn-based board games
Loading...
Searching...
No Matches
sessions_controller.cpp
1#include "sessions_controller.h"
2
3namespace cavoke::server::controllers {
4
5using json = nlohmann::json;
6
7void SessionsController::create(
8 const drogon::HttpRequestPtr &req,
9 std::function<void(const drogon::HttpResponsePtr &)> &&callback) {
10 // get user id
11 auto user_id = AuthFilter::get_user_id(req);
12
13 // get game id
14 auto game_id = req->getOptionalParameter<std::string>("game_id");
15 if (!game_id.has_value()) {
16 return CALLBACK_STATUS_CODE(k400BadRequest);
17 }
18 // verify game id and acquire game config
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));
25 }
26
27 // create session and acquire session info
28 model::GameSessionAccessObject::GameSessionInfo session_info;
29 try {
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));
34 }
35 return callback(newNlohmannJsonResponse(session_info));
36}
37
38void SessionsController::join(
39 const drogon::HttpRequestPtr &req,
40 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
41 const std::string &session_id) {
42 // get user id
43 auto user_id = AuthFilter::get_user_id(req);
44
45 // join session and acquire session info
46 model::GameSessionAccessObject::GameSessionInfo session_info;
47 try {
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));
52 }
53
54 return callback(newNlohmannJsonResponse(session_info));
55}
56
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)) {
66}
67
68void SessionsController::validate(
69 const drogon::HttpRequestPtr &req,
70 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
71 const std::string &session_id) {
72 // get user id
73 auto user_id = AuthFilter::get_user_id(req);
74
75 model::GameSessionAccessObject session;
76 try {
77 session = m_participation_storage->get_sessionAO(session_id);
78 } catch (const model::game_session_error &err) {
79 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
80 }
81
82 if (!session.is_player(user_id)) {
83 return CALLBACK_STATUS_CODE(k403Forbidden);
84 }
85
86 // session does exist
87 json result = m_participation_storage->validate_session(session_id, {});
88 if (result["success"].get<bool>()) {
89 result.erase(result.find("message"));
90 }
91 return callback(newNlohmannJsonResponse(result));
92}
93
94void SessionsController::start(
95 const drogon::HttpRequestPtr &req,
96 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
97 const std::string &session_id) {
98 // get user id
99 auto user_id = AuthFilter::get_user_id(req);
100
101 model::GameSessionAccessObject session;
102 try {
103 session = m_participation_storage->get_sessionAO(session_id);
104 } catch (const model::game_session_error &err) {
105 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
106 }
107
108 if (!session.is_player(user_id)) {
109 return CALLBACK_STATUS_CODE(k403Forbidden);
110 }
111
112 try {
113 // TODO: get settings from body
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));
119 }
120
121 return CALLBACK_STATUS_CODE(k200OK);
122}
123
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;
129 try {
130 session = m_participation_storage->get_sessionAO(session_id);
131 } catch (const model::game_session_error &err) {
132 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
133 }
134
135 return callback(newNlohmannJsonResponse(session.get_session_info()));
136}
137
138void SessionsController::leave(
139 const drogon::HttpRequestPtr &req,
140 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
141 const std::string &session_id) {
142 // get user id
143 auto user_id = AuthFilter::get_user_id(req);
144
145 model::GameSessionAccessObject session;
146 try {
147 session = m_participation_storage->get_sessionAO(session_id);
148 } catch (const model::game_session_error &err) {
149 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
150 }
151
152 session.leave_session(user_id);
153
154 return CALLBACK_STATUS_CODE(k200OK);
155}
156
157void SessionsController::change_role(
158 const drogon::HttpRequestPtr &req,
159 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
160 const std::string &session_id) {
161 // get user id
162 auto user_id = AuthFilter::get_user_id(req);
163
164 // get new_role
165 auto new_role = req->getOptionalParameter<int>("new_role");
166 if (!new_role.has_value()) {
167 return CALLBACK_STATUS_CODE(k400BadRequest);
168 }
169
170 model::GameSessionAccessObject session;
171 try {
172 session = m_participation_storage->get_sessionAO(session_id);
173 } catch (const model::game_session_error &err) {
174 return callback(newCavokeErrorResponse(err, drogon::k404NotFound));
175 }
176
177 try {
178 session.set_role(user_id, new_role.value());
179 } catch (model::game_session_error &err) {
180 return callback(newCavokeErrorResponse(err, drogon::k400BadRequest));
181 }
182
183 return CALLBACK_STATUS_CODE(k200OK);
184}
185
186} // namespace cavoke::server::controllers
static std::string get_user_id(const HttpRequestPtr &)
Acquires user_id parsed during AuthFilter's execution.
Definition: AuthFilter.cc:82