Cavoke  1.1.0
A Platform for creating and hosting multiplayer turn-based board games
Loading...
Searching...
No Matches
rooms_controller.cpp
1#include "rooms_controller.h"
2#include <utility>
3#include "filters/AuthFilter.h"
4
5namespace cavoke::server::controllers {
6
7void RoomsController::create_room(
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 auto display_name = req->getOptionalParameter<std::string>("display_name");
14 if (!display_name.has_value()) {
15 return CALLBACK_STATUS_CODE(k400BadRequest);
16 }
17
18 auto room = m_rooms_storage->create_room(user_id, display_name.value());
19 return callback(newNlohmannJsonResponse(room));
20}
21
22void RoomsController::create_session(
23 const drogon::HttpRequestPtr &req,
24 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
25 const std::string &room_id) {
26 // get game id
27 auto game_id = req->getOptionalParameter<std::string>("game_id");
28 if (!game_id.has_value()) {
29 return CALLBACK_STATUS_CODE(k400BadRequest);
30 }
31
32 auto room_info = m_rooms_storage->get_by_id(room_id);
33 if (!room_info.has_value()) {
34 return CALLBACK_STATUS_CODE(k404NotFound);
35 }
36
37 // get user id
38 auto user_id = AuthFilter::get_user_id(req);
39
40 if (room_info.value().host_id != user_id) {
41 return CALLBACK_STATUS_CODE(k403Forbidden);
42 }
43
44 auto game = m_games_storage->get_game_by_id(game_id.value());
45 if (!game.has_value()) {
46 return callback(newCavokeErrorResponse(
47 {"game '" + game_id.value() + "' not found",
48 cavoke_base_exception::error_code::NotFound},
49 drogon::k404NotFound));
50 }
51
52 try {
53 auto session =
54 m_rooms_storage->create_session(room_id, game.value().config);
55 return callback(newNlohmannJsonResponse(session));
56 } catch (const model::room_error &e) {
57 return callback(newCavokeErrorResponse(e, k403Forbidden));
58 }
59}
60
61void RoomsController::get_info(
62 const drogon::HttpRequestPtr &req,
63 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
64 const std::string &room_id) {
65 auto room_info = m_rooms_storage->get_by_id(room_id);
66 if (!room_info.has_value()) {
67 return CALLBACK_STATUS_CODE(k404NotFound);
68 }
69
70 if (!room_info->session_id.empty()) {
71 room_info->session =
72 m_sessions_storage->get_sessionAO(room_info->session_id)
73 .get_session_info();
74 }
75 json json_res = room_info.value();
76 if (room_info->session_id.empty()) {
77 json_res.erase("session");
78 }
79
80 return callback(newNlohmannJsonResponse(json_res));
81}
82
83void RoomsController::get_info_by_invite_code(
84 const drogon::HttpRequestPtr &req,
85 std::function<void(const drogon::HttpResponsePtr &)> &&callback) {
86 auto invite_code = req->getOptionalParameter<std::string>("invite_code");
87 if (!invite_code.has_value()) {
88 return CALLBACK_STATUS_CODE(k400BadRequest);
89 }
90
91 auto room_info = m_rooms_storage->get_by_invite_code(invite_code.value());
92 if (!room_info.has_value()) {
93 return CALLBACK_STATUS_CODE(k404NotFound);
94 }
95
96 if (!room_info->session_id.empty()) {
97 room_info->session =
98 m_sessions_storage->get_sessionAO(room_info->session_id)
99 .get_session_info();
100 }
101 json json_res = room_info.value();
102 if (room_info->session_id.empty()) {
103 json_res.erase("session");
104 }
105
106 return callback(newNlohmannJsonResponse(json_res));
107}
108
109void RoomsController::join(
110 const drogon::HttpRequestPtr &req,
111 std::function<void(const drogon::HttpResponsePtr &)> &&callback) {
112 auto invite_code = req->getOptionalParameter<std::string>("invite_code");
113 if (!invite_code.has_value()) {
114 return CALLBACK_STATUS_CODE(k400BadRequest);
115 }
116
117 auto room_info = m_rooms_storage->get_by_invite_code(invite_code.value());
118 if (!room_info.has_value()) {
119 return CALLBACK_STATUS_CODE(k404NotFound);
120 }
121
122 // get user id
123 auto user_id = AuthFilter::get_user_id(req);
124
125 try {
126 m_rooms_storage->add_user(room_info.value().room_id, user_id);
127 auto result =
128 m_rooms_storage->get_by_invite_code(invite_code.value()).value();
129 if (!result.session_id.empty()) {
130 result.session =
131 m_sessions_storage->get_sessionAO(result.session_id)
132 .get_session_info();
133 }
134 json json_res = result;
135 if (result.session_id.empty()) {
136 json_res.erase("session");
137 }
138
139 return callback(newNlohmannJsonResponse(json_res));
140 } catch (const model::room_error &e) {
141 return callback(newCavokeErrorResponse(e, drogon::k404NotFound));
142 }
143}
144
145void RoomsController::leave(
146 const drogon::HttpRequestPtr &req,
147 std::function<void(const drogon::HttpResponsePtr &)> &&callback,
148 const std::string &room_id) {
149 auto room_info = m_rooms_storage->get_by_id(room_id);
150 if (!room_info.has_value()) {
151 return CALLBACK_STATUS_CODE(k404NotFound);
152 }
153
154 // get user id
155 auto user_id = AuthFilter::get_user_id(req);
156
157 try {
158 m_rooms_storage->remove_user(room_id, user_id);
159 } catch (const model::room_error &e) {
160 return callback(newCavokeErrorResponse(e, drogon::k404NotFound));
161 }
162
163 return CALLBACK_STATUS_CODE(k200OK);
164}
165
166RoomsController::RoomsController(
167 std::shared_ptr<model::RoomsStorage> mRoomsStorage,
168 std::shared_ptr<model::GamesStorage> mGamesStorage,
169 std::shared_ptr<model::SessionsStorage> mSessionsStorage)
170 : m_rooms_storage(std::move(mRoomsStorage)),
171 m_games_storage(std::move(mGamesStorage)),
172 m_sessions_storage(std::move(mSessionsStorage)) {
173}
174
175} // namespace cavoke::server::controllers
static std::string get_user_id(const HttpRequestPtr &)
Acquires user_id parsed during AuthFilter's execution.
Definition: AuthFilter.cc:82