1#include "rooms_controller.h"
3#include "filters/AuthFilter.h"
5namespace cavoke::server::controllers {
7void RoomsController::create_room(
8 const drogon::HttpRequestPtr &req,
9 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback) {
13 auto display_name = req->getOptionalParameter<std::string>(
"display_name");
14 if (!display_name.has_value()) {
15 return CALLBACK_STATUS_CODE(k400BadRequest);
18 auto room = m_rooms_storage->create_room(user_id, display_name.value());
19 return callback(newNlohmannJsonResponse(room));
22void RoomsController::create_session(
23 const drogon::HttpRequestPtr &req,
24 std::function<
void(
const drogon::HttpResponsePtr &)> &&callback,
25 const std::string &room_id) {
27 auto game_id = req->getOptionalParameter<std::string>(
"game_id");
28 if (!game_id.has_value()) {
29 return CALLBACK_STATUS_CODE(k400BadRequest);
32 auto room_info = m_rooms_storage->get_by_id(room_id);
33 if (!room_info.has_value()) {
34 return CALLBACK_STATUS_CODE(k404NotFound);
40 if (room_info.value().host_id != user_id) {
41 return CALLBACK_STATUS_CODE(k403Forbidden);
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));
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));
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);
70 if (!room_info->session_id.empty()) {
72 m_sessions_storage->get_sessionAO(room_info->session_id)
75 json json_res = room_info.value();
76 if (room_info->session_id.empty()) {
77 json_res.erase(
"session");
80 return callback(newNlohmannJsonResponse(json_res));
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);
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);
96 if (!room_info->session_id.empty()) {
98 m_sessions_storage->get_sessionAO(room_info->session_id)
101 json json_res = room_info.value();
102 if (room_info->session_id.empty()) {
103 json_res.erase(
"session");
106 return callback(newNlohmannJsonResponse(json_res));
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);
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);
126 m_rooms_storage->add_user(room_info.value().room_id, user_id);
128 m_rooms_storage->get_by_invite_code(invite_code.value()).value();
129 if (!result.session_id.empty()) {
131 m_sessions_storage->get_sessionAO(result.session_id)
134 json json_res = result;
135 if (result.session_id.empty()) {
136 json_res.erase(
"session");
139 return callback(newNlohmannJsonResponse(json_res));
140 }
catch (
const model::room_error &e) {
141 return callback(newCavokeErrorResponse(e, drogon::k404NotFound));
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);
158 m_rooms_storage->remove_user(room_id, user_id);
159 }
catch (
const model::room_error &e) {
160 return callback(newCavokeErrorResponse(e, drogon::k404NotFound));
163 return CALLBACK_STATUS_CODE(k200OK);
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)) {
static std::string get_user_id(const HttpRequestPtr &)
Acquires user_id parsed during AuthFilter's execution.