🐎 AllUsers added & seperated save_l into bal_l/size_l

This commit is contained in:
EntireTwix 2021-04-09 01:36:00 -07:00
parent ac0105ff68
commit c1c077fc81
2 changed files with 27 additions and 8 deletions

View file

@ -23,14 +23,15 @@ private:
* permitted while saving so they do not have to share this lock
*
*/
std::shared_mutex save_lock;
std::shared_mutex size_lock;
std::shared_mutex bal_lock;
public:
std::string admin_pass;
bool AddUser(const std::string &name, std::string &&init_pass)
{
std::shared_lock<std::shared_mutex> lock{save_lock};
std::shared_lock<std::shared_mutex> lock{size_lock};
return users.try_emplace_l(
name, [](User &) {}, std::move(init_pass));
}
@ -39,7 +40,7 @@ public:
bool state = (admin_pass == attempt);
if (state)
{
std::shared_lock<std::shared_mutex> lock{save_lock};
std::shared_lock<std::shared_mutex> lock{size_lock};
state = users.try_emplace_l(
name, [](User &) {}, init_bal, std::move(init_pass));
}
@ -48,12 +49,12 @@ public:
bool DelUser(const std::string &name, const std::string &attempt)
{
std::shared_lock<std::shared_mutex> lock{save_lock};
std::shared_lock<std::shared_mutex> lock{size_lock};
return users.erase_if(name, [&attempt](const User &u) { return (attempt == u.password); });
}
bool AdminDelUser(const std::string &name, const std::string &attempt)
{
std::shared_lock<std::shared_mutex> lock{save_lock};
std::shared_lock<std::shared_mutex> lock{size_lock};
return users.erase_if(name, [this, &attempt](const User &) { return (admin_pass == attempt); });
}
@ -68,7 +69,7 @@ public:
//if A exists, A can afford it, and A's password matches
bool state = false;
std::shared_lock<std::shared_mutex> lock{save_lock}; //because SendFunds requires 3 locking operations
std::shared_lock<std::shared_mutex> lock{bal_lock}; //because SendFunds requires 3 locking operations
users.modify_if(a_name, [&state, amount, &attempt](User &a) {
if (state = (a.balance >= amount) && (a.password == attempt), state)
{
@ -138,6 +139,19 @@ public:
return res;
}
Json::Value AllUsers()
{
Json::Value temp;
Json::UInt i = 0;
std::unique_lock<std::shared_mutex> lock{size_lock};
for (const auto &u : users)
{
//we know it contains this key but we call this func to grab mutex
temp[i++] = u.first;
}
return temp;
}
void Save()
{
Json::StreamWriterBuilder builder;
@ -148,7 +162,7 @@ public:
//loading info into json temp
{
std::unique_lock<std::shared_mutex> lock{save_lock}; //grabbing it from any busy add/del opperations
std::scoped_lock<std::shared_mutex, std::shared_mutex> lock{size_lock, bal_lock}; //grabbing it from any busy add/del/sendfunds opperations
for (const auto &u : users)
{
//we know it contains this key but we call this func to grab mutex

View file

@ -37,7 +37,7 @@ public:
{
auto resp = HttpResponse::newHttpResponse();
auto handlerInfo = app().getHandlersInfo();
resp->setBody("<h1>ALL FUNCTIONS (that have args) ARE EXPECTING JSON AS DATA TYPE</h1><h2><br />/BankF/<span style=\"color: #993300;\">admin</span>/close (POST)</h2><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - admin password</p><blockquote><p>Closes and Saves the server.</p></blockquote><h2><br />/BankF/user (POST)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of the user being added</p><p><span style=\"background-color: #808080;\">&nbsp;init_pass&nbsp;</span> - initial password for the user being added</p><blockquote><p>Adds a user to the bank</p></blockquote><h2><br />/BankF/<span style=\"color: #993300;\">admin</span>/user (POST)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of the user being added</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - admin password required to add user with balance</p><p><span style=\"background-color: #808080;\">&nbsp;init_bal&nbsp;</span> - initial balance for user being added</p><p><span style=\"background-color: #808080;\">&nbsp;init_pass&nbsp;</span> - initial password for user being added</p><blockquote><p>Adds a user with initial balance</p></blockquote><h2><br />/BankF/sendfunds (POST)</h2><p><span style=\"background-color: #808080;\">&nbsp;a_name&nbsp;</span> - sender's name</p><p><span style=\"background-color: #808080;\">&nbsp;b_name&nbsp;</span> - reciever's name</p><p><span style=\"background-color: #808080;\">&nbsp;amount&nbsp;</span> - amount being sent</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password of sender</p><blockquote><p>Sends money from one user to another</p></blockquote><h2><br />/BankF/changepass (PATCH)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user's password being changes</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password of user being changed</p><p><span style=\"background-color: #808080;\">&nbsp;new_pass&nbsp;</span> - new password to replace the current user's password</p><blockquote><p>&nbsp;Changes password of a user</p></blockquote><p>&nbsp;</p><h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (PATCH)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - the name of the user being set</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - the admin password required</p><p><span style=\"background-color: #808080;\">&nbsp;amount&nbsp;</span> - the new balance of the user</p><blockquote><p>Sets the balance of a user</p></blockquote><h2>&nbsp;</h2><h2>/BankF/help (GET)</h2><blockquote><p>the page you're looking at right now!</p></blockquote><h2><br />/BankF/vpass (POST)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user being verified</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password being verified</p><blockquote><p>returns 0 or 1 based on if [attempt] is equal to the password of the user [name]. The intended usage for this function is for connected services</p></blockquote><h2><br />/BankF/contains/{<span style=\"color: #339966;\">name</span>} (GET)</h2><blockquote><p>returns a 0 or 1 based on if the bank contains the user</p></blockquote><p>&nbsp;</p><h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (GET)</h2><blockquote><p>returns the balance of a given user's name, if -1 that means the user does not exist</p></blockquote><h2><br />/BankF/user (DELETE)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user being deleted</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password of user being deleted</p><blockquote><p>Deletes a user with the password of the user as verification</p></blockquote><h2><br />/BankF/<span style=\"color: #993300;\">admin</span>/user (DELETE)</h2><p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user being deleted</p><p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - admin password</p><blockquote><p>Deletes a user with admin password as verification</p></blockquote>");
resp->setBody("<body> <h1>ALL FUNCTIONS (that have args) ARE EXPECTING JSON AS DATA TYPE</h1> <h2>/BankF/<span style=\"color: #993300;\">admin</span>/close (POST)</h2> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - admin password</p> <blockquote> <p>Closes and Saves the server.</p> </blockquote> <h2>/BankF/user (POST)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of the user being added</p> <p><span style=\"background-color: #808080;\">&nbsp;init_pass&nbsp;</span> - initial password for the user being added</p> <blockquote> <p>Adds a user to the bank</p> </blockquote> <h2>/BankF/<span style=\"color: #993300;\">admin</span>/user (POST)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of the user being added</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - admin password required to add user with balance</p> <p><span style=\"background-color: #808080;\">&nbsp;init_bal&nbsp;</span> - initial balance for user being added</p> <p><span style=\"background-color: #808080;\">&nbsp;init_pass&nbsp;</span> - initial password for user being added</p> <blockquote> <p>Adds a user with initial balance</p> </blockquote> <h2>/BankF/sendfunds (POST)</h2> <p><span style=\"background-color: #808080;\">&nbsp;a_name&nbsp;</span> - sender's name</p> <p><span style=\"background-color: #808080;\">&nbsp;b_name&nbsp;</span> - reciever's name</p> <p><span style=\"background-color: #808080;\">&nbsp;amount&nbsp;</span> - amount being sent</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password of sender</p> <blockquote> <p>Sends money from one user to another</p> </blockquote> <h2>/BankF/changepass (PATCH)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user's password being changes</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password of user being changed</p> <p><span style=\"background-color: #808080;\">&nbsp;new_pass&nbsp;</span> - new password to replace the current user's password</p> <blockquote> <p>Changes password of a user</p> </blockquote> <h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (PATCH)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - the name of the user being set</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - the admin password required</p> <p><span style=\"background-color: #808080;\">&nbsp;amount&nbsp;</span> - the new balance of the user</p> <blockquote> <p>Sets the balance of a user</p> </blockquote> <h2>/BankF/help (GET)</h2> <blockquote> <p>the page you're looking at right now!</p> </blockquote> <h2>/BankF/vpass (POST)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user being verified</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password being verified</p> <blockquote> <p>returns 0 or 1 based on if [attempt] is equal to the password of the user [name]. The intended usage for this function is for connected services</p> </blockquote> <h2>/BankF/contains/{<span style=\"color: #339966;\">name</span>} (GET)</h2> <blockquote> <p>returns a 0 or 1 based on if the bank contains the user</p> </blockquote> <h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (GET)</h2> <blockquote> <p>returns the balance of a given user's name, if -1 that means the user does not exist</p> </blockquote> <h2>/BankF/allusers/ (GET)</h2> <blockquote> <p>returns an array of all users in the bank</p> </blockquote> <h2>/BankF/user (DELETE)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user being deleted</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - password of user being deleted</p> <blockquote> <p>Deletes a user with the password of the user as verification</p> </blockquote> <h2>/BankF/<span style=\"color: #993300;\">admin</span>/user (DELETE)</h2> <p><span style=\"background-color: #808080;\">&nbsp;name&nbsp;</span> - name of user being deleted</p> <p><span style=\"background-color: #808080;\">&nbsp;attempt&nbsp;</span> - admin password</p> <blockquote> <p>Deletes a user with admin password as verification</p> </blockquote> </body>");
resp->setExpiredTime(0);
callback(resp);
}
@ -106,6 +106,10 @@ public:
GEN_BODY
JSON(bank.SetBal(name, body["attempt"].asCString(), body["amount"].asUInt()));
}
void AllUsers(req_args)
{
JSON(bank.AllUsers());
}
METHOD_LIST_BEGIN
METHOD_ADD(BankF::Close, "/admin/close", Post, Options);
@ -120,6 +124,7 @@ public:
METHOD_ADD(BankF::VerifyPassword, "/vpass", Post, Options);
METHOD_ADD(BankF::Contains, "/contains/{name}", Get, Options);
METHOD_ADD(BankF::GetBal, "/{name}/bal", Get, Options);
METHOD_ADD(BankF::AllUsers, "/allusers", Get, Options);
METHOD_ADD(BankF::DelUser, "/user", Delete, Options);
METHOD_ADD(BankF::AdminDelUser, "/admin/user", Delete, Options);