Skip to content
This repository has been archived by the owner on Mar 3, 2020. It is now read-only.

Commit

Permalink
KEP-814 Add client key used in the database request to the crud api
Browse files Browse the repository at this point in the history
  • Loading branch information
ebruck committed Nov 26, 2018
1 parent 6b00627 commit 08e4382
Show file tree
Hide file tree
Showing 18 changed files with 438 additions and 275 deletions.
254 changes: 184 additions & 70 deletions crud/crud.cpp

Large diffs are not rendered by default.

45 changes: 29 additions & 16 deletions crud/crud.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <crud/subscription_manager_base.hpp>
#include <node/node_base.hpp>
#include <storage/storage_base.hpp>
#include <shared_mutex>


namespace bzn
Expand All @@ -28,47 +29,59 @@ namespace bzn
public:
crud(std::shared_ptr<bzn::storage_base> storage, std::shared_ptr<bzn::subscription_manager_base> subscription_manager);

void handle_request(const database_msg& request, const std::shared_ptr<bzn::session_base>& session) override;
void handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, const std::shared_ptr<bzn::session_base>& session) override;

void start() override;

private:

void handle_create_db(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_create_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_delete_db(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_delete_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_has_db(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_has_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_create(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_create(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_read(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_read(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_update(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_update(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_delete(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_delete(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_has(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_has(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_keys(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_keys(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_size(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_size(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_subscribe(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_subscribe(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void handle_unsubscribe(const database_msg& request, std::shared_ptr<bzn::session_base> session);
void handle_unsubscribe(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session);

void send_response(const database_msg& request, bzn::storage_base::result result, database_response&& response,
std::shared_ptr<bzn::session_base>& session);
void send_response(const database_msg& request, bzn::storage_result result, database_response&& response,
std::shared_ptr<bzn::session_base>& session);

// helpers...
std::pair<bool, Json::Value> get_database_permissions(const bzn::uuid_t& uuid) const;

bzn::value_t create_permission_data(const bzn::caller_id_t& caller_id) const;

bool is_caller_owner(const bzn::caller_id_t& caller_id, const Json::Value& json) const;

bool is_caller_a_writer(const bzn::caller_id_t& caller_id, const Json::Value& json) const;

std::shared_ptr<bzn::storage_base> storage;
std::shared_ptr<bzn::subscription_manager_base> subscription_manager;

using message_handler_t = std::function<void(const database_msg& request, std::shared_ptr<bzn::session_base> session)>;
using message_handler_t = std::function<void(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr<bzn::session_base> session)>;

std::unordered_map<database_msg::MsgCase, message_handler_t> message_handlers;

std::once_flag start_once;

std::shared_mutex lock; // for multi-reader and single writer access

};

} // namespace bzn
3 changes: 2 additions & 1 deletion crud/crud_base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace bzn
const std::string MSG_RECORD_EXISTS = "RECORD_EXISTS";
const std::string MSG_RECORD_NOT_FOUND = "RECORD_NOT_FOUND";
const std::string MSG_DATABASE_NOT_FOUND = "DATABASE_NOT_FOUND";
const std::string MSG_ACCESS_DENIED = "ACCESS_DENIED";
const std::string MSG_INVALID_ARGUMENTS = "INVALID_ARGUMENTS";
const std::string MSG_VALUE_SIZE_TOO_LARGE = "VALUE_SIZE_TOO_LARGE";
const std::string MSG_KEY_SIZE_TOO_LARGE = "KEY_SIZE_TOO_LARGE";
Expand Down Expand Up @@ -57,7 +58,7 @@ namespace bzn
public:
virtual ~crud_base() = default;

virtual void handle_request(const database_msg& request, const std::shared_ptr<bzn::session_base>& session) = 0;
virtual void handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, const std::shared_ptr<bzn::session_base>& session) = 0;

virtual void start() = 0;
};
Expand Down
6 changes: 3 additions & 3 deletions crud/raft_crud.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ raft_crud::handle_size(const bzn::json_message& /*msg*/, const database_msg& req
bool
raft_crud::commit_create(const database_msg& msg)
{
if (this->storage->create(msg.header().db_uuid(), msg.create().key(), msg.create().value()) != storage_base::result::ok)
if (this->storage->create(msg.header().db_uuid(), msg.create().key(), msg.create().value()) != bzn::storage_result::ok)
{
LOG(error) << "Request:" <<msg.header().transaction_id() << " Create failed";
return false;
Expand All @@ -271,7 +271,7 @@ raft_crud::commit_create(const database_msg& msg)
bool
raft_crud::commit_update(const database_msg& msg)
{
if (this->storage->update(msg.header().db_uuid(), msg.update().key(), msg.update().value()) != storage_base::result::ok)
if (this->storage->update(msg.header().db_uuid(), msg.update().key(), msg.update().value()) != bzn::storage_result::ok)
{
LOG(error) << "Request:" << msg.header().transaction_id() << " Update failed";
return false;
Expand All @@ -284,7 +284,7 @@ raft_crud::commit_update(const database_msg& msg)
bool
raft_crud::commit_delete(const database_msg& msg)
{
if (this->storage->remove(msg.header().db_uuid(), msg.delete_().key()) != storage_base::result::ok)
if (this->storage->remove(msg.header().db_uuid(), msg.delete_().key()) != bzn::storage_result::ok)
{
LOG(error) << "Request:" << msg.header().transaction_id() << " Delete failed";
return false;
Expand Down

0 comments on commit 08e4382

Please sign in to comment.