diff --git a/api/resources/node.hpp b/api/resources/node.hpp index 54b88265c..60e6874f3 100644 --- a/api/resources/node.hpp +++ b/api/resources/node.hpp @@ -40,6 +40,9 @@ public: // for(key, value in body) // node->properties[key] = value; + // TODO parse json body and put into the node + + // commit the transaction db->tx_engine.commit(t); diff --git a/speedy/http/request.hpp b/speedy/http/request.hpp index 2db309bf5..77020663c 100644 --- a/speedy/http/request.hpp +++ b/speedy/http/request.hpp @@ -19,6 +19,7 @@ struct Request std::map<std::string, std::string> headers; + // todo rename this body std::string body; }; diff --git a/speedy/middleware.hpp b/speedy/middleware.hpp new file mode 100644 index 000000000..df8c72fb8 --- /dev/null +++ b/speedy/middleware.hpp @@ -0,0 +1,35 @@ +#ifndef MEMGRAPH_SPEEDY_MIDDLEWARE_HPP +#define MEMGRAPH_SPEEDY_MIDDLEWARE_HPP + +#include "request.hpp" +#include "response.hpp" + +namespace sp +{ + +class Middlewares +{ +public: + using middleware_cb_t = std::function<bool(sp::Request&, sp::Response&)>; + + bool run(sp::Request& req, sp::Response& res) + { + for(auto& middleware : middlewares) + if(!middleware(req, res)) + return false; + + return true; + } + + void push_back(middleware_cb_t cb) + { + middlewares.push_back(cb); + } + +private: + std::vector<middleware_cb_t> middlewares; +}; + +} + +#endif diff --git a/speedy/request.hpp b/speedy/request.hpp index 11e417351..9c84bb2b9 100644 --- a/speedy/request.hpp +++ b/speedy/request.hpp @@ -13,6 +13,9 @@ class Request : public http::Request public: using http::Request::Request; + // todo json body insitu parsing + // http://rapidjson.org/md_doc_dom.html + std::vector<std::string> params; }; diff --git a/speedy/speedy.hpp b/speedy/speedy.hpp index 13bce33a2..6eb0049cf 100644 --- a/speedy/speedy.hpp +++ b/speedy/speedy.hpp @@ -17,6 +17,8 @@ #include "request.hpp" #include "response.hpp" +#include "middleware.hpp" + namespace sp { @@ -35,6 +37,11 @@ public: Speedy(Speedy&) = delete; Speedy(Speedy&&) = delete; + void use(Middlewares::middleware_cb_t cb) + { + middlewares.push_back(cb); + } + void get(const std::string& path, server_t::request_cb_t cb) { router.insert(R3::Method::GET, join(prefix, path), cb); @@ -60,6 +67,13 @@ public: router.compile(); server.listen(ip, [this](Request& req, Response& res) { + // run middlewares + auto result = middlewares.run(req, res); + + // if they signaled false, stop the further execution + if(!result) + return; + auto route = router.match(R3::to_r3_method(req.method), req.url); if(!route.exists()) @@ -74,6 +88,7 @@ private: server_t server; std::string prefix; R3 router; + Middlewares middlewares; std::string join(const std::string& prefix, const std::string& path) {