Cavoke  1.1.0
A Platform for creating and hosting multiplayer turn-based board games
Loading...
Searching...
No Matches
gamesubmissions_controller.cpp
1#include "gamesubmissions_controller.h"
2#include "filters/AuthFilter.h"
3
4namespace cavoke::server::controllers {
5
6void GameSubmissionsController::submit_game(
7 const drogon::HttpRequestPtr &req,
8 std::function<void(const drogon::HttpResponsePtr &)> &&callback) {
9 // TODO: Auth. Currently problems with authenticating the form request.
10 // parse web form
11 drogon::MultiPartParser mpp;
12 int res = mpp.parse(req);
13 if (res == -1) {
14 return CALLBACK_STATUS_CODE(k400BadRequest);
15 }
16 // form files
17 auto files = mpp.getFilesMap();
18 // form params
19 nlohmann::json j = mpp.getParameters();
20 if (!j.contains("git_repo")) {
21 j["git_repo"] = "<empty>";
22 }
23 // serialize
24 GameSubmissionReq req_data;
25 try {
26 req_data = j.get<GameSubmissionReq>();
27 } catch (...) {
28 return CALLBACK_STATUS_CODE(k400BadRequest);
29 }
30 // validation
31 if (req_data.package_type != "Git Repository" &&
32 req_data.package_type != "Zip Archive") {
33 return CALLBACK_STATUS_CODE(k400BadRequest);
34 }
35
36 auto id = drogon::utils::getUuid();
37 auto submission = req_data.to_orm(id);
38 if (req_data.package_type == "Zip Archive") {
39 try {
40 files.at("client_zip").saveAs(id + "-client.zip");
41 files.at("server_zip").saveAs(id + "-server.zip");
42 } catch (...) {
43 return CALLBACK_STATUS_CODE(k400BadRequest);
44 }
45 }
46 // save to db
47 mp_submissions.insert(submission);
48
49 LOG_INFO << "New game submission! Game: " << req_data.display_name;
50 auto resp = newStatusCodeResponse(drogon::k200OK);
51 resp->setBody(
52 "Thanks for your game submission! We will review it and publish your "
53 "game shortly.");
54 return callback(resp);
55}
56} // namespace cavoke::server::controllers