diff --git a/frontend/src/lib/shadorwun/character.svelte b/frontend/src/lib/shadorwun/character.svelte
index 3cec880..40025cb 100644
--- a/frontend/src/lib/shadorwun/character.svelte
+++ b/frontend/src/lib/shadorwun/character.svelte
@@ -55,6 +55,12 @@
}
}
+ function handleKeydown(event) {
+ if (event.ctrlKey && event.key === 's') {
+ saveCharacterData();
+ }
+ }
+
async function saveCharacterData() {
const res = await fetch(`${API_BASE}/api/shadowrun/characters_data/${currentCharacter.id}`, {
method: 'POST',
@@ -67,6 +73,8 @@
let inventory = currentCharacter?.inventory || [];
+
+
Name: {currentCharacter.name}
Character Info
diff --git a/src/login/login.cpp b/src/login/login.cpp
index 852bf08..7a9e611 100644
--- a/src/login/login.cpp
+++ b/src/login/login.cpp
@@ -1,8 +1,8 @@
#include "login.hpp"
#include "crow/http_response.h"
#include "databasepool.h"
-#include "utils.hpp"
#include "SessionHandler.hpp"
+#include
namespace login
{
@@ -18,12 +18,22 @@ std::string getSessionId(const crow::request& req) {
return cookie_header.substr(pos + prefix.size(), Session::SESSION_ID_SIZE);
}
-bool isLoggedIn(const crow::request& req) {
+static crow::response redirectToLogin(){
+ crow::response res(302); // 302 = temporary redirect
+ res.set_header("Location", "/");
+ return res;
+}
+
+std::optional isLoggedIn(const crow::request& req) {
std::string sessionId = getSessionId(req);
if (sessionId.empty())
- return false;
+ return std::move(redirectToLogin());
+
auto userId = sessionHandler.isSessionValid(sessionId);
- return userId.has_value();
+ if(!userId.has_value())
+ return std::move(redirectToLogin());
+
+ return {};
}
std::optional loginUser(const std::string& username, const std::string& password)
diff --git a/src/login/login.hpp b/src/login/login.hpp
index 8127a4b..9031e59 100644
--- a/src/login/login.hpp
+++ b/src/login/login.hpp
@@ -9,29 +9,15 @@ namespace login {
void initLogin(crow::SimpleApp& app);
-bool isLoggedIn(const crow::request& req);
-
-// login_required lambda that works for any handler with arbitrary args
-inline auto login_required = [](auto handler){
- return [handler](auto&&... args) -> crow::response {
- // the first argument is always crow::request
- const crow::request& req = std::get<0>(std::forward_as_tuple(args...));
- if (!isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
-
- // call original handler with all arguments
- auto result = handler(std::forward(args)...);
-
- // ensure crow::response return type
- if constexpr (std::is_same_v) {
- return result;
- } else {
- return crow::response(result);
- }
- };
-};
+std::optional isLoggedIn(const crow::request& req);
+#define LOGGIN_REQUIERED(reg) \
+ { \
+ auto res = login::isLoggedIn(req); \
+ if (res.has_value()) { \
+ return std::move(res.value()); \
+ } \
+ }
}
#endif // __LOGIN_H__
\ No newline at end of file
diff --git a/src/shadowrun/ShadowrunApi.cpp b/src/shadowrun/ShadowrunApi.cpp
index 598bdd8..331cd32 100644
--- a/src/shadowrun/ShadowrunApi.cpp
+++ b/src/shadowrun/ShadowrunApi.cpp
@@ -30,10 +30,8 @@ void initApi(crow::SimpleApp& app){
CROW_ROUTE(app, "/assets/shadowrun/")
([&](const crow::request& req, const std::string& p) {
- if (!login::isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
-
+ LOGGIN_REQUIERED(req);
+
const filesystem::path assets_dir = "assets/shadowrun/";
filesystem::path file_path = assets_dir / p;
return utils::getFile(file_path);
@@ -41,10 +39,7 @@ void initApi(crow::SimpleApp& app){
CROW_ROUTE(app, "/api/shadowrun/characters")
([&](const crow::request& req) {
-
- if (!login::isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
+ LOGGIN_REQUIERED(req);
auto characters = getCharacters();
auto res =
@@ -55,9 +50,7 @@ void initApi(crow::SimpleApp& app){
CROW_ROUTE(app, "/api/shadowrun/characters").methods("POST"_method)
([](const crow::request& req) {
- if (!login::isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
+ LOGGIN_REQUIERED(req);
nlohmann::json data = nlohmann::json::parse(req.body); // parse JSON from HTTP body
auto name = data["name"];
@@ -75,9 +68,8 @@ void initApi(crow::SimpleApp& app){
CROW_ROUTE(app, "/api/shadowrun/characters/")
([&](const crow::request& req, int id) {
- if (!login::isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
+ LOGGIN_REQUIERED(req);
+
auto optCharacter = getChracter(id);
if (!optCharacter.has_value())
return crow::response(404, "Character not found");
@@ -89,9 +81,8 @@ void initApi(crow::SimpleApp& app){
CROW_ROUTE(app, "/api/shadowrun/characters_data/")
([&](const crow::request& req, int id) {
- if (!login::isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
+ LOGGIN_REQUIERED(req);
+
nlohmann::json j;
const auto characterData = getChracterData(id);
@@ -119,9 +110,7 @@ void initApi(crow::SimpleApp& app){
CROW_ROUTE(app, "/api/shadowrun/characters_data/").methods("POST"_method)
([&](const crow::request& req, int id) {
- if (!login::isLoggedIn(req)) {
- return crow::response(401, "Login required");
- }
+ LOGGIN_REQUIERED(req);
nlohmann::json j = nlohmann::json::parse(req.body);
for (auto type : magic_enum::enum_values()) {